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

  1. Mostly benign: unclaimed sentinels are GC'd after 4h — wait or delete the stale sentinel manually
  2. Only release once per reservation; check for duplicated finally paths in forks
  3. Run from the repo root so PATHS.reports resolves correctly
  4. 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

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


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)