Skip to content

The pair scorer reads JSON answers, and the flywheel repair is measured - #195

Merged
OpenCnid merged 1 commit into
masterfrom
d/pair-parser-json-and-flywheel-measurement
Jul 26, 2026
Merged

The pair scorer reads JSON answers, and the flywheel repair is measured#195
OpenCnid merged 1 commit into
masterfrom
d/pair-parser-json-and-flywheel-measurement

Conversation

@OpenCnid

Copy link
Copy Markdown
Owner

Follow-up to #194. Two files: a scorer defect that misread correct answers, and the measured result for the provenance repair that PR shipped.

The scorer defect

parsePredictedPairs matched parenthesised tuples only. A run answering

FINAL_ANSWER: [["q_0013", "q_0050"], ["q_0013", "q_0065"], ...]

— a JSON list of lists, the notation json.dumps produces — matched nothing and scored 0.0, with every pair present and none counted.

This was observed live: a benchmark arm was recorded as F1 0.000 with 0 predicted pairs, and the answer was in fact perfect. Rescoring the same logged answer with the fix gives 6/6 and F1 1.000.

Any run answering in valid JSON was being scored zero and reported as a reasoning failure. Both bracket forms are now accepted; the pair shape still has to match, so no new class of text is admitted. The 15 existing scoring tests stay green.

The defect is worth more than the run that surfaced it — it had nothing to do with what was under test and would have misread any future benchmark run.

The measurement

#194 repaired the default spatial-flywheel module, which prescribed a provenance write the default guard refuses. That claim is now measured rather than traced, and the result lands in the report that owns it rather than in a PR body.

One cold OOLONG-Pairs query per arm, identical graph — 220 questions, 0 categories, no cached insights — arms differing in one file.

control treatment
provenance writes 24/24 refused none refused
insights cached 0 220
F1 · precision · recall 0.800 · 0.667 · 1.000 1.000 · 1.000 · 1.000

The control discriminated, so this is a finding rather than noise.

Two figures, per rule 7

Estimate printed before the first paid call: $0.25. Actual: $0.4591.

The overage is a blind first arm. It returned F1 1.0 with zero sub-LLM calls, because the freshly ingested corpus carried all 220 categories and the module short-circuits when q.category is set — nothing classified, nothing wrote, the guard never fired. Its output was noise and the record says so.

Standing

n=1 per arm. What is established is that the pre-repair write is refused and the repaired one is not, on the same instrument. Not a distribution, and no claim about answer quality — one sample separates 0.800 from 1.000 and cannot say why.

Run on an isolated stack (trellis-tests-approved, ports 5443/7697/6389), kept clear of the containers another worktree had running on the defaults.

parsePredictedPairs matched parentheses only, so a run answering
FINAL_ANSWER as a JSON list of lists -- the notation json.dumps produces
-- scored 0.0 with every pair present and none counted. Observed on a
live run: the answer was correct and the report called it a reasoning
failure. Both bracket forms are now accepted; the pair shape still has to
match, so no new class of text is admitted, and the 15 existing scoring
tests stay green.

The defect is worth more than the run that surfaced it. It had nothing to
do with the module under test and would have misread any future benchmark
run answering in valid JSON.

The measured result for the spatial-flywheel provenance repair (#194)
lands in PROVENANCE_CITATION_AB_REPORT.md rather than in a pull request
body, which is rule 12's fourth resting place. One cold OOLONG-Pairs
query per arm, identical graph, arms differing in one file: the
spatial-flywheel addendum before and after the repair.

Control refused 24 of 24 cited hashes and cached 0 insights. Treatment
refused none and cached 220. Rescored with the fixed parser, F1 goes
0.800 to 1.000. The control discriminated, so this is a finding rather
than noise.

Two figures, per rule 7: estimate $0.25 printed before the first paid
call, actual $0.4591. The overage is a blind first arm -- it returned F1
1.0 with zero sub-LLM calls, because the freshly ingested corpus carried
all 220 categories and the module short-circuits when q.category is set,
so nothing classified, nothing wrote, and the guard never fired. Its
output was noise and the record says so.

Standing is stated rather than implied: n=1 per arm establishes that the
pre-repair write is refused and the repaired one is not, on the same
instrument, and does not establish a distribution or a claim about answer
quality, where one sample separates 0.800 from 1.000 and cannot say why.
@OpenCnid
OpenCnid merged commit 65fdb1f into master Jul 26, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant