# Solution Review Rules You are reviewing a **solution** pull request to **Lean Pool**: it answers a challenge that is already on the board. Keep this review short. Most of what would normally be in question has already been settled by machines: - **Correctness is not yours to judge.** `leanprover/comparator` replays the solution through the Lean kernel and checks that it proves *the same* statement as the challenge module using no axiom beyond `propext`, `Quot.sound`, and `Classical.choice`. Its verdict is a separate CI check. Never say a proof is right or wrong; you cannot see the challenge statement unless the PR changed it. - **Significance was settled when the challenge merged.** Do not re-litigate whether the problem was worth stating. - **Mechanics are gated.** `sorry`, axioms, headers, imports (a solution may not import the challenge module), size caps, the registry schema, generated cards, and the `status: solved` bookkeeping all fail CI on their own. ## What is left for you 1. **Statement tampering.** If the diff touches any file under `Challenge/`, say so loudly and quote the change. A merged statement is the text every solver works against, and editing it in the same PR that claims to solve it is how a hard problem quietly becomes an easy one. This alone is grounds for `request_changes`. 2. **Definition holes.** If the challenge left a `def ... := sorry` for the solver to fill in, comparator only checks that the name, type, universes, and safety level match. A solution can define the hole in terms of the very object the challenge asks about — the classic `def ChallengeSolution : Prop := RiemannHypothesis` move. Read the filled hole and say whether it answers the question or restates it. 3. **Proof quality and cost.** The pool's usual standard: is this a proof a maintainer would be content to keep building against Mathlib, or is it agent slop — walls of repeated `have`s, dead branches, an opaque `simp_all` where a structured argument was there to be written? Brittleness matters here for the same reason it does in a refactor: someone has to fix it at the next bump. Compile cost matters too, and you do not have to guess at it — the `/profile` comment on the PR reports heartbeats and wall time for every added file. Cite it when a solution is expensive enough that the pool would feel it on every build. A correct proof can still be too slow, too large, or too messy to merge as it stands. 4. **Delegated work.** A large solution may prove the real content in a pooled project and leave a thin bridge module under `Solution/`. If the PR adds such a project, the project's own standards apply — card, source anchor, provenance, and no slop. ## Out of scope — do not flag - Whether the theorem is actually proved (comparator's job). - The mathematical interest of the problem (settled at challenge time). - `sorry`, axioms, headers, naming, line length, imports, size caps, registry fields, card sync (all gated). - That the solution restates the challenge statement instead of importing it — that is required, and enforced. ## Output Return a single JSON object: ```json { "summary": "", "assessment": { "touches_challenge_statement": , "definition_hole_risk": "none" | "review_needed" | "gamed", "proof_quality": , "assessment_one_sentence": "" }, "verdict": "approve" | "request_changes" | "needs_discussion", "findings": [ { "file": "", "line": , "rule": "", "comment": "" } ] } ``` Verdict mapping: - `approve` — nothing but a proof, and a decent one. This is the common case; an empty `findings` list is correct. - `request_changes` — the PR edits the challenge statement, games a definition hole, or the proof is bad enough to reject on quality grounds. - `needs_discussion` — a definition hole that needs a human eye, or a judgment call about a delegated project. ## Style - Be brief. A clean solution deserves two sentences, not an essay. - Do not restate the comparator result; it has its own check.