santifer/career-ops · warning

⚠️ ${label} not found at: ${path}

Error message

⚠️   ${label} not found at: ${path}

What it means

gemini-eval.mjs's readFile helper found that one of its context inputs — modes/_shared.md, modes/oferta.md, cv.md, modes/_profile.md, or config/profile.yml — does not exist at the expected path, and substituted a '[label not found — skipping]' placeholder into the prompt. The evaluation still runs, but with less grounding: a missing cv.md in particular means scores are computed without your experience, producing generic results.

Source

Thrown at gemini-eval.mjs:166

// ---------------------------------------------------------------------------
const apiKey = process.env.GEMINI_API_KEY;
if (!apiKey) {
  console.error(`
❌  GEMINI_API_KEY not found.

   1. Get a free key at https://aistudio.google.com/apikey
   2. Add it to .env:   GEMINI_API_KEY=your_key_here
   3. Or export it:     export GEMINI_API_KEY=your_key_here
`);
  process.exit(1);
}

// ---------------------------------------------------------------------------
// File helpers
// ---------------------------------------------------------------------------
function readFile(path, label) {
  if (!existsSync(path)) {
    console.warn(`⚠️   ${label} not found at: ${path}`);
    return `[${label} not found — skipping]`;
  }
  return readFileSync(path, 'utf-8').trim();
}

function validateEvaluationShape(text) {
  const issues = [];
  const requiredBlocks = [
    ['A', /(?:^|\n)#{1,3}\s*(?:A[).:-]?|Block A\b)/im],
    ['B', /(?:^|\n)#{1,3}\s*(?:B[).:-]?|Block B\b)/im],
    ['C', /(?:^|\n)#{1,3}\s*(?:C[).:-]?|Block C\b)/im],
    ['D', /(?:^|\n)#{1,3}\s*(?:D[).:-]?|Block D\b)/im],
    ['E', /(?:^|\n)#{1,3}\s*(?:E[).:-]?|Block E\b)/im],
    ['F', /(?:^|\n)#{1,3}\s*(?:F[).:-]?|Block F\b)/im],
    ['G', /(?:^|\n)#{1,3}\s*(?:G[).:-]?|Block G\b)/im],
  ];

  for (const [label, pattern] of requiredBlocks) {

View on GitHub (pinned to 60398d6549)

Solutions

  1. Run from the repo root: cd /path/to/career-ops && node gemini-eval.mjs ...
  2. Create the missing files (complete onboarding: cv.md, config/profile.yml, modes/_profile.md) and re-run for grounded scores.
  3. If a file is intentionally absent, accept the reduced-context evaluation — but treat a missing cv.md as a stop signal.

Example fix

# before — relative paths break when invoked from elsewhere
~/projects $ node career-ops/gemini-eval.mjs https://jobs.example/1
# ⚠️   cv.md not found at: cv.md
# after — run from the repo root so PATHS resolve
~/projects/career-ops $ node gemini-eval.mjs https://jobs.example/1
Defensive patterns

Strategy: validation

Validate before calling

import { existsSync } from 'node:fs';
const CONTEXT_FILES = ['modes/_shared.md', 'modes/oferta.md', 'cv.md', 'modes/_profile.md', 'config/profile.yml'];
const missing = CONTEXT_FILES.filter((p) => !existsSync(p));
if (missing.length) {
  console.error(`Missing context files (run from repo root?): ${missing.join(', ')}`);
  process.exit(1);
}

Try / catch

if (!existsSync(path)) {
  console.warn(`${label} not found at: ${path}`);
  return `[${label} not found — skipping]`;
} // graceful degradation suits OPTIONAL inputs; make cv.md a hard failure instead

Prevention

When it happens

Trigger: Running gemini-eval.mjs from a directory other than the repo root so the relative paths break; a fresh clone where onboarding files (cv.md, config/profile.yml) were never created; a context file renamed or moved during reorganization.

Common situations: Wrong working directory (the most common cause — invoking the script from outside the repo); pre-onboarding runs; reorganized repos.

Related errors


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