/trial-run, trial planner and logger
Two modes. Ask which applies if it isn't obvious from the conversation.
A trial run is the only thing that produces a real score. Impressions of how a run looked are not data, and the report's results section needs the numbers. See the test rungs in .claude/rules/workflow.md.
The discipline this skill exists to enforce
One run proves almost nothing. The marker digits, the colour-to-row mapping, the book's horizontal position and the robot's starting orientation all re-randomise on every world load. A single successful run may only mean the seed was favourable.
So every plan states a reload count, and every log states which seed conditions applied.
Mode 1: plan, before the run
Ask what's being tested and what would count as passing. A test without a pre-declared numeric criterion is a demo, not a test.
Write the procedure:
- Which subsystem or which full-run stage
- How many world reloads. 20 for anything perception-related, 10 for grasp attempts. Not 3
- Which requested column and colour on each run, varied across the set
- What gets measured and how it's recorded
- What gets changed between runs, one variable at a time
State the pass criterion numerically. Starting points, from .claude/agents/qa.md:
- Column detection: correct digit on 20 of 20 world reloads
- Book detection: correct colour and row on 20 of 20 reloads, all four colours and all four rows represented
- Annotated images: present, timestamped, correctly boxed, in 20 of 20 runs
- Navigation: reaches the standoff pose 20 of 20, zero collisions
- Grasp: book lifted clear in 8 of 10 attempts, broken out by row
- Gentle place: released under control in 8 of 10
- Recovery: each path deliberately triggered and observed at least once
Pre-run checklist, mandatory, from .claude/rules/workflow.md:
Note the two traps:
- Stale images. Images produced outside the trial run are explicitly not accepted, and a leftover file from yesterday is indistinguishable from one. Clear the folder.
- Repeating a seed. Running twice without reloading is one test, not two.
Mode 2: log, after the run
Ask for the real point breakdown, line by line against the official criteria, not an impression. "13 of 19: both IDs scored, grasp on the second attempt, dropped rather than gently placed, one collision on retreat" is data. "The run went well" is not.
Score it explicitly:
| Item |
Points |
Scored? |
| Column publish |
+1 |
|
| Column image |
+2 |
|
| Navigate to column (needs the grasp) |
+3 |
|
| Row publish |
+1 |
|
| Row image |
+2 |
|
| Grasp |
+3 |
|
| Navigate to bin (needs delivery) |
+3 |
|
| Place: dropped +2 or gentle +4 |
|
|
| Collisions |
-0.5 each |
|
Remember the two contingencies: navigation to the column scores nothing unless the grasp succeeded, and navigation to the bin scores nothing unless the book was delivered. A run that drove perfectly and failed the grasp scores 6, not 9.
Append the row to results/trials.csv. Schema in docs/BLUEPRINT.md §7. Never skip a bad run. Failed trials are the useful data and section 6 of the report is graded on them.
Append to docs/BUILD_LOG.md using the standard format, with the rung reached and the actual score.
Diagnose failures against the table in .claude/agents/qa.md, and record which hypothesis you're acting on.
Record parameter changes: old value, new value, observed effect. If config/params.yaml changed, note which keys and why.
Update .claude/PROJECT_NOTES.md only if a build-order gate was genuinely met. A 17 of 20 pass rate does not close a gate that requires 20 of 20.
The five report trials are a special case
Section 5 of the report requires scores across 5 simulation trials. That set has rules:
- Five consecutive trials, each on a fresh world load
- No parameter changes between them. Changing anything mid-set invalidates it as a dataset
- All five logged in full, including bad ones
- Requested column and colour varied across the five
A set with one characterised failure is honest data with a story. A set where the bad runs were quietly re-run is a fabrication, and the limitations section is graded, so the bad run earns more than it costs.
Rules
- Never round up the test rung. "Ran once" is not "works". See
.claude/rules/workflow.md.
- One variable at a time. Changing three parameters between runs tells you nothing about which mattered.
- Record failures in full. The failed runs are the useful data; the successful ones just confirm it.
- Break grasp results out by row. Row-dependent failure points at torso positioning; uniform failure points at the grasp pose.
- Don't chase the grasp before the two perception nodes are at 20 of 20. The cheap points come first, per
docs/SCORING.md.
- Write plainly: no em dashes, no emoji in headings, no title case.
1---2name: trial-run3description: Plan a scored ERC-26 trial run (procedure, pass criteria, pre-run checklist) or log a completed one with the real point breakdown. Use before running a scored trial, or right after one.4---56# /trial-run, trial planner and logger78Two modes. Ask which applies if it isn't obvious from the conversation.910A trial run is the only thing that produces a real score. Impressions of how a run looked are not data, and the report's results section needs the numbers. See the test rungs in `.claude/rules/workflow.md`.1112## The discipline this skill exists to enforce1314**One run proves almost nothing.** The marker digits, the colour-to-row mapping, the book's horizontal position and the robot's starting orientation all re-randomise on every world load. A single successful run may only mean the seed was favourable.1516So every plan states a reload count, and every log states which seed conditions applied.1718## Mode 1: plan, before the run19201. **Ask what's being tested and what would count as passing.** A test without a pre-declared numeric criterion is a demo, not a test.21222. Write the procedure:23 - Which subsystem or which full-run stage24 - **How many world reloads.** 20 for anything perception-related, 10 for grasp attempts. Not 325 - Which requested column and colour on each run, varied across the set26 - What gets measured and how it's recorded27 - What gets changed between runs, one variable at a time28293. State the pass criterion numerically. Starting points, from `.claude/agents/qa.md`:30 - Column detection: *correct digit on 20 of 20 world reloads*31 - Book detection: *correct colour and row on 20 of 20 reloads, all four colours and all four rows represented*32 - Annotated images: *present, timestamped, correctly boxed, in 20 of 20 runs*33 - Navigation: *reaches the standoff pose 20 of 20, zero collisions*34 - Grasp: *book lifted clear in 8 of 10 attempts, broken out by row*35 - Gentle place: *released under control in 8 of 10*36 - Recovery: *each path deliberately triggered and observed at least once*37384. Pre-run checklist, mandatory, from `.claude/rules/workflow.md`:39 - [ ] `colcon build` clean, workspace sourced40 - [ ] `simulation.launch.py` running first, world fully loaded41 - [ ] Launch with the **exact organiser command**, both arguments passed42 - [ ] `erc_images/` writable and **cleared of stale images**43 - [ ] `results/` writable, `trial_logger` running44 - [ ] Both scored topics confirmed live with `ros2 topic echo`45 - [ ] **World reloaded since the last run**, so this is a new seed46 - [ ] Requested column and colour recorded before the run47485. Note the two traps:49 - **Stale images.** Images produced outside the trial run are explicitly not accepted, and a leftover file from yesterday is indistinguishable from one. Clear the folder.50 - **Repeating a seed.** Running twice without reloading is one test, not two.5152## Mode 2: log, after the run53541. **Ask for the real point breakdown**, line by line against the official criteria, not an impression. "13 of 19: both IDs scored, grasp on the second attempt, dropped rather than gently placed, one collision on retreat" is data. "The run went well" is not.55562. Score it explicitly:5758 | Item | Points | Scored? |59 |---|---|---|60 | Column publish | +1 | |61 | Column image | +2 | |62 | Navigate to column (needs the grasp) | +3 | |63 | Row publish | +1 | |64 | Row image | +2 | |65 | Grasp | +3 | |66 | Navigate to bin (needs delivery) | +3 | |67 | Place: dropped +2 or gentle +4 | | |68 | Collisions | -0.5 each | |6970 Remember the two contingencies: navigation to the column scores nothing unless the grasp succeeded, and navigation to the bin scores nothing unless the book was delivered. A run that drove perfectly and failed the grasp scores 6, not 9.71723. Append the row to `results/trials.csv`. Schema in `docs/BLUEPRINT.md` §7. **Never skip a bad run.** Failed trials are the useful data and section 6 of the report is graded on them.73744. Append to `docs/BUILD_LOG.md` using the standard format, with the rung reached and the actual score.75765. Diagnose failures against the table in `.claude/agents/qa.md`, and record which hypothesis you're acting on.77786. Record parameter changes: old value, new value, observed effect. If `config/params.yaml` changed, note which keys and why.79807. Update `.claude/PROJECT_NOTES.md` only if a build-order gate was genuinely met. A 17 of 20 pass rate does not close a gate that requires 20 of 20.8182## The five report trials are a special case8384Section 5 of the report requires scores across 5 simulation trials. That set has rules:8586- Five consecutive trials, each on a fresh world load87- **No parameter changes between them.** Changing anything mid-set invalidates it as a dataset88- All five logged in full, including bad ones89- Requested column and colour varied across the five9091A set with one characterised failure is honest data with a story. A set where the bad runs were quietly re-run is a fabrication, and the limitations section is graded, so the bad run earns more than it costs.9293## Rules9495- Never round up the test rung. "Ran once" is not "works". See `.claude/rules/workflow.md`.96- One variable at a time. Changing three parameters between runs tells you nothing about which mattered.97- Record failures in full. The failed runs are the useful data; the successful ones just confirm it.98- Break grasp results out by row. Row-dependent failure points at torso positioning; uniform failure points at the grasp pose.99- Don't chase the grasp before the two perception nodes are at 20 of 20. The cheap points come first, per `docs/SCORING.md`.100- Write plainly: no em dashes, no emoji in headings, no title case.