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

  • The invariants for these files are one folder up, in crates/postjevsql/CLAUDE.md, which loads with this one; the design rules are the root CLAUDE.md's SQL surface, Execution and Cache.
  • A judgement future must never call Postgres. Cache reads it needs mid-search go through scan::on_backend; writes go through settle (receipts). The Judge trait in postjevsql-pg/src/scan/mod.rs states the rule; the future is polled inside the executor's wait.
  • Nothing is cached for a NULL. Under jev.on_error = unsure a failed judgment is NULL and leaves no jev_cache row; a Failure that is not a failed judgment (is_failed_judgment false) still raises.
  • Never hash or store a re-serialized copy of what was sent. The key, the stored state and question, and the request body all come from the same bytes (jev_protocol::question_bytes and the row's Json).