diff --git a/emrg/server/competition_prompt.md b/emrg/server/competition_prompt.md index 5c1bf834..c5ebbe74 100644 --- a/emrg/server/competition_prompt.md +++ b/emrg/server/competition_prompt.md @@ -135,6 +135,8 @@ One improvement per round: local validation → submit → record the score delt - Keep `best score` and the submission that produced it; never overwrite a better score with a worse one. - Note the submission budget/limits if the platform has any (many limit daily submissions). +**A recorded best score is a reading, not a conclusion.** It says where the work stands, and nothing more: the score that could be reached is not in it, and no score makes the next method less worth trying. So each round brings **at least one attempt it had not tried before** — a new detector, a new sample, a new way of re-reading the ones already wrong — and its summary names that attempt and says why it is a better method than the last round's, not merely that it ran. A round that only re-measured, re-stated or waited has recorded a reading without iterating, which is the one thing Phase D exists to prevent. + **Establish what the right answer is before changing what produces it.** "Adjust the thing, re-score, read the delta" is a valid unit only when the thing you adjusted is uniform. When the round's subject is *a class of cases handled wrongly*, a change applied to the whole class mixes the cases it fixed with the cases it broke into one score, and that score has two opposite causes inside it: it cannot be attributed, so the change can neither be kept nor reverted, and the submissions spent on it produced nothing. Work it in four steps instead: 1. **Classify** the cases that are not right, and keep the classification where the next round can read it. @@ -288,7 +290,7 @@ The session transcript is what the next round reads — nothing is appended to a **Three more the host asked for by name.** The seven above are the round's own self-review; the same message is what the host reads, and on 2026-10-01T15:58:48 they asked for a further reading, then repeated it the next day at 2026-10-02T07:56:20 after the first answer did not land ("什么意思,你不要自说自话,你要为了给我解释清楚,让我理解进度" — *what do you mean? don't just talk to yourself; explain it so I understand the progress*). A request the host had to make twice is a requirement, not a preference: -- **How likely is the goal to be reached, and on what evidence?** — a probability for the goal §2 defines (the prize, or the standing), with the basis it is estimated from: the metric's gap to the payout line or to the rank that pays, the submissions/budget left, the deadline. An estimate with no stated basis, or a status word standing in for one (*"怎么样?"* answered with "进展中"), is exactly what was rejected. +- **How likely is the goal to be reached, and on what evidence?** — answered in the competition's own metric, with the basis it is estimated from: the current reading, the gap to the payout line or to the rank that pays, the submissions and budget left, and the deadline. A discouraging answer is written as *that* arithmetic — the size of the gap, the levers not yet tried, and the next attempt — and never as a verdict that the goal cannot be reached: the gap says where the work stands, and no reading in it ends the work. An estimate with no stated basis, or a status word standing in for one (*"怎么样?"* answered with "进展中"), is exactly what was rejected. - **What is still missing between here and the goal?** — in the competition's own metric, not in effort: the score or percentile that would have to be reached, and the size of the gap to it. *"为了达到目标还差什么"*. - **What does the host have to decide or do?** — every blocker with the case it falls in (the blocker rule below), and when that case is "no method found", the question itself goes here. A round that ends with a blocker and no question has left the host out of the loop, which is what *"如果你找不到方法,就和我讨论"* asks against. diff --git a/tests/test_competition_prompt.py b/tests/test_competition_prompt.py index 1f751591..015e2d66 100644 --- a/tests/test_competition_prompt.py +++ b/tests/test_competition_prompt.py @@ -699,6 +699,12 @@ def test_the_host_facing_half_of_the_summary_is_required(): # A probability without its basis is what "don't talk to yourself" rejected, so # the basis is part of the requirement, not decoration. assert "with the basis it is estimated from" in host_half + # The question stayed, its answer's form changed: the round rules forbid writing + # that the goal is unlikely, so §5 asks for the reading and the gap in the + # competition's own metric rather than a bare probability. Pinned here so the + # pair cannot be split in silence — see + # `test_a_discouraging_reading_is_written_as_the_gap_not_as_a_verdict`. + assert "the current reading" in host_half and "the gap to the payout line" in host_half # And the reader it is written for — the host reads this, not only the next round. assert "not read the previous round's messages" in host_half @@ -1036,3 +1042,46 @@ def test_phase_d_establishes_the_answer_on_a_sample_before_changing_the_class(): "§Phase D must name the step most easily skipped, or a round that only observed reads " "as if it had improved something" ) + + +def test_a_discouraging_reading_is_written_as_the_gap_not_as_a_verdict(rendered): + """§5 asks how likely the goal is; the answer has one accepted form. + + The question and the round rules used to point in opposite directions: §5 asked for a + probability, while the round rules forbid writing that the goal is unlikely and accept + only the current reading, the gap in the competition's own metric, the levers not yet + tried and the next attempt. A round reading both had to pick one silently, and a lean + estimate was the case where the two collide. + + So the question is answered **in the metric**, and a discouraging answer is the gap + plus the untried levers — never a verdict that the goal cannot be reached. Asserted on + the render, because that is what a round receives: a `{# … #}` around the bullet leaves + the file intact and the round without the rule. + """ + assert "answered in the competition's own metric" in rendered, ( + "§5 must send the probability question back to the competition's own metric" + ) + assert "never as a verdict that the goal cannot be reached" in rendered, ( + "§5 must say what a discouraging reading is written as, or the round is left to " + "choose between this question and its own no-conclusion rule" + ) + assert "the levers not yet tried" in rendered + assert "a probability for the goal" not in rendered, ( + "asking for a bare probability is the instruction the round rules forbid answering — " + "the pair must not come back on one side only" + ) + + +def test_a_best_score_is_a_reading_and_a_round_brings_an_untried_attempt(rendered): + """Phase D must say what a recorded score is, and what iteration requires. + + Without this, a round can record a best score, re-state it next round, and meet every + stated requirement — nothing distinguished a reading from a conclusion, and nothing + asked for an attempt the previous round had not tried. + """ + assert "A recorded best score is a reading, not a conclusion" in rendered + assert "at least one attempt it had not tried before" in rendered, ( + "Phase D must ask for an attempt the last round had not tried, or re-measuring " + "counts as iteration" + ) + assert "has recorded a reading without iterating" in rendered