From 8030d178a7b4626992b2d6efa3834be90a004c02 Mon Sep 17 00:00:00 2001 From: qte77 <93844790+qte77@users.noreply.github.com> Date: Sat, 14 Nov 2026 13:52:42 +0000 Subject: [PATCH] docs(readme): say which tasks run the lint Only the nine IR tasks' graders import protocol_lint; the two RNA graders record suspicious tokens without changing the reward. Co-Authored-By: Claude --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f0bdfb..7656d5c 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ flowchart LR

Figure 4. The six verifier layers. The first three are gates. Layer 4 records a deterministic_reward for every trial and feeds its results to the judge as evidence; it becomes the reward when the judge is off (SKIP_JUDGE=1, used for oracle checks in CI) or fails.

-1. **Lint.** `protocol_lint.py` rejects code that reaches into simulator internals. Fail → 0. +1. **Lint.** `protocol_lint.py` rejects code that reaches into simulator internals. Fail → 0. (IR tasks; the two RNA tasks only record suspicious tokens, without changing the reward.) 2. **Reward-hacking traps.** `tests/anti_hack.py`, 9 traps (Table 3). Any trip → 0. 3. **Simulator gate.** `opentrons_simulate` (Opentrons 7.5.0) must complete. Fail → 0. 4. **Deterministic checks.** On the 9 IR tasks, `spec_check.py` compares the simulated run with `tests/ir.json`, `deck.json` and `checks.json`: the right labware under the right label in the right slot, the end-state volume of every well, and five physical safety rules (a tip before every aspiration, no overdispense, no aspirating from an empty well, no tip left on, no cross-contamination). On RNA extraction, `checks.py` runs 18 checks on the run log (volumes, step order, incubation, magnet and drying times, recovery of about 80 µL, the 4 °C plate, fresh tips, and no reservoir column drawn beyond its 15 mL).