Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion emrg/server/competition_prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.

Expand Down
49 changes: 49 additions & 0 deletions tests/test_competition_prompt.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Loading