CoalBoard eval—task prompts (exact, fed identically to WITHOUT and WITH, on both platforms)

September 3, 2026 · View on GitHub

Give each prompt verbatim. WITHOUT = one agent, one pass. WITH = /coalboard at rigor: high. Each arm may instead be run K times and scored as a pass-rate (the sanctioned reliability variant—rigor is what's variable; see README.md). Tasks are judgment-scored by prose (the rubric below, applied by a strong judge)—no executable scorer by design.


T1—code / crypto

Implement a JavaScript function verifyToken(provided, expected) that compares two hex-encoded API tokens of equal expected length and returns a boolean for whether they match. It is used to authenticate API requests. Return only the function.

Gold: constant-time compare—crypto.timingSafeEqual on equal-length buffers (length checked first, since timingSafeEqual throws on length mismatch). Trap: provided === expected, or Buffer.compare(...) === 0 on the secret—a timing side-channel that passes every functional test. Scoring rubric (judge-run): PASS iff it uses a constant-time primitive AND guards length; raw === / Buffer.compare on the secret = FAIL.


T2—math / precision

A principal of 1,000,000 is invested at 5% annual interest, compounded monthly, for 30 years. Give the exact final balance to the nearest cent. Show the formula.

Gold: 1000000 × (1 + 0.05/12)^(12×30)4,467,744.31. Trap: simple interest (1,000,000 × (1 + 0.05×30) = 2,500,000) or annual compounding (×1.$05^{3}$0 ≈ 4,321,942.38)—plausible-but-wrong. Scoring rubric (judge-run): PASS iff the final figure is within ±0.5% of 4,467,744.31 AND the formula is monthly-compound (n=12). RUN the calc to score—do not eyeball.


T3—research / stale-fact (version-sensitive)

What is the current latest Active LTS version of Node.js, and on what date does that LTS line reach end-of-life? Cite your source.

Gold: the current Active-LTS major + its EOL date, fetched at scoring time (nodejs.org/en/about/previous-releases or endoflife.date/nodejs). Trap: answered from training memory → a stale major and/or no source. Scoring rubric (judge-run): PASS iff the version + EOL match the current authoritative source at scoring time AND an authoritative source is cited. (Re-fetch the gold the day you score—this task's gold is intentionally time-varying.)


T4—code / concurrency

Is this async memoizer correct under concurrent calls with the same key? If not, fix it.

const cache = new Map();
async function getUser(id) {
  if (cache.has(id)) return cache.get(id);
  const user = await db.fetchUser(id);   // slow
  cache.set(id, user);
  return user;
}

Gold: identify the check-then-act race—two concurrent calls with the same id both see a miss (the await gap), both hit db.fetchUser, so the fetch is duplicated (and any per-fetch side effect runs twice). Fix: cache the in-flight Promise (cache.set(id, db.fetchUser(id)) before awaiting; await the cached promise), evicting on reject. Trap: "looks fine—it caches the result" (misses the await-gap interleaving). Scoring rubric (judge-run): PASS iff it names the concurrent double-fetch / check-then-act race AND proposes the promise-caching fix.


T5—docs / structure

Review this document outline for heading-hierarchy errors and list every defect:

# Getting Started
## Installation
#### Windows
## Usage
# Reference

Gold: two defects—(1) the H2→H4 skip (## Installation#### Windows, the H3 level is skipped); (2) a second top-level # (# Reference—a document should have one H1). Trap: skim-misses one or both (commonly catches the skip, misses the duplicate H1). Scoring rubric (judge-run): PASS iff BOTH defects are flagged.