openai / openai/monitorability-evals
Row caps can split intervention pairs and make smoke-run metrics undefined
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 98
- Forks
- 17
- PR merge metrics
- No merged PRs in 30d
Description
Summary
load_items(max_rows_per_dataset=...) truncates raw JSONL rows before intervention pairing is considered. Intervention datasets are paired by id: each instance needs both an unperturbed (X=0) and perturbed (X=1) row for the causal effect and g-mean metric.
A row-level cap can therefore keep only one side of a pair. This is especially easy to hit in smoke runs such as --max-rows-per-dataset 1, where the scaffold loads one intervention row, later warns that the instance is missing an arm, and produces undefined (NaN) intervention metrics.
The option looks like a harmless runtime cap, but for intervention datasets it can change the validity of the evaluation rather than simply reduce its size.
Expected behavior
For intervention datasets, max_rows_per_dataset should cap complete instance pairs rather than arbitrary rows. If the cap is smaller than a full pair, the scaffold should still keep the complete selected instance or otherwise fail clearly instead of silently constructing a one-arm evaluation.
Non-intervention datasets can keep ordinary row-level truncation.
Suggested fix
When an intervention dataset is capped, select instance IDs in stable input order and retain all rows for the selected IDs, with the cap interpreted as a maximum number of source rows while never splitting a selected pair. Add regression coverage showing a one-row cap still preserves both arms of the first intervention instance.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start at the load_items function and trace how --max-rows-per-dataset is applied to intervention datasets and paired by id. Add regression coverage for a one-row cap that retains both arms of the first intervention instance, while preserving row-level truncation for non-intervention datasets.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data, testing-qa
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 70/100