santifer/career-ops · warning
⚠️ Could not release report reservation
Error message
⚠️ Could not release report reservation: ${err.message} What it means
After saving (or failing to save) a report, ollama-eval.mjs releases report numbers it reserved via reserve-report-num.mjs so parallel workers can use them. If releaseReportNumbers() throws — the reservation store is missing/corrupt, reports/ is unreadable, or the numbers were already released — this warning is logged. A stale reservation blocks that report number until its sentinel is garbage-collected after 4h.
Solutions
- Mostly benign: unclaimed sentinels are GC'd after 4h — wait or delete the stale sentinel manually
- Only release once per reservation; check for duplicated finally paths in forks
- Run from the repo root so PATHS.reports resolves correctly
- If it blocks parallel workers now, run node reserve-report-num.mjs --release <range> explicitly
Defensive patterns
Strategy: try-catch
Type guard
function reservationExists(numbers, store) {
return numbers.every((n) => store.sentinelPath(n) !== null);
} Try / catch
try {
await releaseReportNumbers(reservedNumbers, { reportsDir: PATHS.reports });
} catch (err) {
// double-release or missing store; stale sentinels GC after 4h — usually safe to ignore
console.warn(`Could not release report reservation: ${err.message}`);
} Prevention
- Release each reservation exactly once; guard against duplicate finally execution
- Reserve immediately before spawning workers and release only on completion/failure
- Run all workers against the same repo root so reports/ paths agree
- Rely on the 4h sentinel GC rather than hand-deleting sentinels mid-run
When it happens
Trigger: releaseReportNumbers(reservedNumbers, {reportsDir: PATHS.reports}) throws in the finally block — reservation sentinel file already removed (double release), reports directory path wrong or unreadable, or the reservation store corrupted by a concurrent run.
Common situations: Two batch workers sharing a reports dir; running the evaluator from a different cwd so PATHS.reports points nowhere; manually deleting sentinel files while a run was in flight; crash-resume scenarios where release ran twice.
Related errors
- Could not release report reservation
- ⚠️ Could not release report reservation
- ⚠️ Browser cleanup failed
- Cannot verify tracker lock ownership at
- concurrent reservation test flaked
AI-assisted analysis of santifer/career-ops@aac998c7ed (2026-09-16).
Data as JSON: /api/errors/d4c26b36ba6ef681.
Report an issue: GitHub.
Appendix: source
Thrown at ollama-eval.mjs:585
// needs its own label -- values are read BY label, so a tenth field the
// header does not name is not mis-mapped, it is dropped.
const additionHeader = postingUrl ? `${TSV_ADDITION_HEADER}\turl` : TSV_ADDITION_HEADER;
mkdirSync(PATHS.trackerAdditions, { recursive: true });
writeFileSync(
join(PATHS.trackerAdditions, additionName),
`${additionHeader}\n${trackerFields.join('\t')}\n`,
'utf-8',
);
console.log(`\n📊 Tracker addition saved: batch/tracker-additions/${additionName}`);
console.log(' Run `node merge-tracker.mjs` to merge it into the tracker.');
} catch (err) {
console.warn(`⚠️ Could not save report: ${err.message}`);
} finally {
if (reservedNumbers.length > 0) {
try {
await releaseReportNumbers(reservedNumbers, { 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, 'ollama'));
View on GitHub (pinned to aac998c7ed)