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
- Do nothing if you can wait: stale sentinels are GC'd after 4 hours and the numbers become reusable
- Or release explicitly: `node reserve-report-num.mjs --release <NNN-MMM>` with the range gemini-eval reserved
- Check err.message for EACCES/ENOENT and fix permissions/paths in reports/ if it recurs
- 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
- Reserve ranges immediately before spawning workers and release right after, keeping the leak window small
- Know the 4h sentinel GC backstop exists — an unreleased range is an inconvenience, not corruption
- For immediate recovery use `node reserve-report-num.mjs --release NNN-MMM` with the logged range
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
- Could not release report reservation: ${e.message}
- Could not claim ${count} report slot(s) after ${MAX_RETRIES}
- ⚠️ Could not release report reservation: ${err.message}
- ⚠️ Could not release report reservation: ${err.message}
- ⚠️ Tracker #${addition.num} already used; assigning #${entr
AI-assisted analysis of santifer/career-ops@60398d6549 (2026-08-20).
Data as JSON: /api/errors/108ac1b0aac98b72.
Report an issue: GitHub.