For agents, on top of README.md, which they read first.

  • The invariants for these files are one folder up, in crates/postjevsql-core/CLAUDE.md, which loads with this one.
  • A node's score is Σ ln max(p, 1e-9), never the cookbook's geometric mean. The mean rises with depth, which breaks the bound pruning relies on, and the search stops being exact.
  • K is Choices asked per round, not a beam width that drops nodes. A node is dropped only when its bound cannot change the top two leaves (or, under τ, the deepest node at or above τ). exact_against_exhaustive holds the search to that; keep it passing for every new option.
  • Never reorder options or finalists. Order is part of the question and of the cache key; a shortlist finalist keeps its place in the caller's list, not its rank in round 1.
  • The unmeasured defaults (K = 3, lookahead m = 2 and a 60,000-token round, twin at 1.5×, Describe 20 and 5, keep 3) belong to the release gates. Changing one changes every request a search sends, and so every recorded fixture: re-record (tools/record-gates), do not edit fixtures.