santifer/career-ops · warning

⚠️ Could not release report reservation: ${err.message}

Error message

⚠️   Could not release report reservation: ${err.message}

What it means

Warning from gemini-eval.mjs's finally block: releaseReportNumbers() — which hands back the reserved report-number range to reserve-report-num.mjs — failed. The numbers were reserved before evaluation and would leak if unreleased; however stale reservation sentinels are garbage-collected automatically after 4 hours, so the leak self-heals.

Source

Thrown at gemini-eval.mjs:464

      try {
        const mergeOutput = execFileSync(process.execPath, [join(ROOT, 'merge-tracker.mjs')], {
          cwd: ROOT,
          encoding: 'utf-8',
          stdio: ['ignore', 'pipe', 'pipe'],
        });
        if (mergeOutput.trim()) console.log(mergeOutput.trim());
        console.log('📊  Tracker merged into data/applications.md.');
      } catch (err) {
        console.warn(`⚠️   Report saved, but could not merge tracker addition into data/applications.md: ${err.message}`);
        process.exitCode = 1;
      }
    }
  } finally {
    if (reservedNumbers.length > 0) {
      try {
        await releaseReportNumbers(reservedNumbers, { rootDir: ROOT, reportsDir: PATHS.reports });
      } catch (err) {
        console.warn(`⚠️   Could not release report reservation: ${err.message}`);
      }
    }
  }
}

console.log('\n' + '─'.repeat(66));
console.log(`  Score: ${score}/5  |  Archetype: ${archetype}  |  Legitimacy: ${legitimacy}`);
console.log('─'.repeat(66) + '\n');

console.log(formatBreakdown(tracker, modelName, 'gemini'));

View on GitHub (pinned to 60398d6549)

Solutions

  1. Do nothing if you can wait: stale sentinels are GC'd after 4 hours and the numbers become reusable
  2. Or release explicitly: `node reserve-report-num.mjs --release <NNN-MMM>` with the range gemini-eval reserved
  3. Check err.message for EACCES/ENOENT and fix permissions/paths in reports/ if it recurs
  4. Reserve right before spawning workers (per the headless fan-out rule) so released-ranges windows stay small

Example fix

# before: warning printed, reservation leaks until GC
# after
node reserve-report-num.mjs --release 042-049   # using the range from the run log
Defensive patterns

Strategy: fallback

Validate before calling

// If you wrap gemini-eval in your own runner, release deterministically after it exits:
import { execFileSync } from 'node:child_process';
try {
  execFileSync(process.execPath, ['gemini-eval.mjs', jd], { stdio: 'inherit' });
} finally {
  try { execFileSync(process.execPath, ['reserve-report-num.mjs', '--release', range]); } catch {}
}

Try / catch

try {
  await releaseReportNumbers(reserved, { rootDir, reportsDir });
} catch (err) {
  // self-healing: stale sentinels are GC'd after 4h — log and move on
  console.warn(`reservation release failed, will self-GC: ${err.message}`);
}

Prevention

When it happens

Trigger: The release step (invoking the reservation machinery under ROOT/reports) failing because the sentinel files were moved/deleted mid-run, the reports dir became unwritable, another process re-GC'd the reservation first, or the script path is broken. Runs only when reservedNumbers.length > 0, i.e. every reserved evaluation.

Common situations: Interrupted/crashing parallel runs racing the 4h GC; read-only or reorganized reports/ during a run; partial checkouts missing reserve-report-num.mjs.

Related errors


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