santifer/career-ops · warning

⚠️

Error message

⚠️  ${msg}

What it means

verify-pipeline.mjs prints this as a warning via the warn() helper (which prefixes '⚠️ ' and increments a warnings counter). It is not a thrown exception — it is a diagnostic line emitted during a health-check when one of the pipeline checks degrades but does not fail.

Solutions

  1. Read the message text after the '⚠️ ' prefix — it names the specific check and condition
  2. Fix the underlying condition the message describes (e.g. regenerate stale data, correct config)
  3. Re-run node verify-pipeline.mjs to confirm the warning is gone
  4. If the warning is expected for a fresh setup, ignore it — warnings do not fail the check

Example fix

// before: pipeline has a soft issue
⚠️  <check-specific message>
// after: fix the condition and re-run
✅ <check passed>
Defensive patterns

Strategy: validation

Validate before calling

const res = { errors: 0, warnings: 0 }; // parse verify-pipeline output lines: '⚠️  ' => warnings++, '❌' => errors++
const out = execSync('node verify-pipeline.mjs').toString();
const hasWarnings = /⚠️/.test(out);

Prevention

When it happens

Trigger: Any check in verify-pipeline.mjs calls warn(msg) with a message string; the prefixed output '⚠️ <msg>' appears whenever a check finds a non-blocking problem (e.g. soft-stale data, skippable config issue) rather than a hard failure counted by error().

Common situations: Running `node verify-pipeline.mjs` during routine pipeline hygiene checks; a sub-check reports a soft condition the author classified as advisory. Exit code and severity depend on whether errors>0, not warnings.

Understand the failure class

Background: "missing required config value" errors: why libraries refuse to start when a configuration key is empty, unset, or blank — this error's family across 48 libraries.

Related errors


AI-assisted analysis of santifer/career-ops@e7abd431fc (2026-09-16). Data as JSON: /api/errors/fd9a21fd2cc6341d. Report an issue: GitHub.

Appendix: source

Thrown at verify-pipeline.mjs:78

];

const ALIASES = {
  'evaluada': 'evaluated', 'condicional': 'evaluated', 'hold': 'evaluated', 'evaluar': 'evaluated', 'verificar': 'evaluated',
  'aplicado': 'applied', 'enviada': 'applied', 'aplicada': 'applied', 'applied': 'applied', 'sent': 'applied',
  'respondido': 'responded',
  'entrevista': 'interview',
  'oferta': 'offer',
  'rechazado': 'rejected', 'rechazada': 'rejected',
  'descartado': 'discarded', 'descartada': 'discarded', 'cerrada': 'discarded', 'cancelada': 'discarded',
  'no aplicar': 'skip', 'no_aplicar': 'skip', 'monitor': 'skip', 'geo blocker': 'skip',
  'contratado': 'hired', 'contratada': 'hired', 'hired': 'hired', 'accepted': 'hired', 'accept': 'hired',
};

let errors = 0;
let warnings = 0;

function error(msg) { console.log(`❌ ${msg}`); errors++; }
function warn(msg) { console.log(`⚠️  ${msg}`); warnings++; }
function ok(msg) { console.log(`✅ ${msg}`); }

// --- Read applications.md ---
if (!existsSync(APPS_FILE)) {
  console.log('\n📊 No applications.md found. This is normal for a fresh setup.');
  console.log('   The file will be created when you evaluate your first offer.\n');
  process.exit(0);
}
const content = readFileSync(APPS_FILE, 'utf-8');
const lines = content.split('\n');

// Map columns by header name so the checks work whether the tracker uses the
// original 9-column layout or a customized one with an extra column (e.g. a
// Location column after Role). Fixed-position indexing would otherwise read
// Location where Score is expected and flag false errors. Falls back to the
// legacy fixed layout when no recognizable header row is found.
//
// Sourced from tracker-parse.mjs rather than re-declared here: this file used

View on GitHub (pinned to e7abd431fc)