feat(evals): score suggest_edge_types, and answer #508 with the numbers - #512
Merged
Conversation
Closes #508. #508 asked for confidence-threshold auto-acceptance and named a cap-harness A/B as the gate on any prompt change here. That gate did not exist: `evals/` scored EXTRACTION and nothing scored this suggester, so a change would have been adopted on intuition -- which this project has already paid for once. `evals/edge_typing/` is that gate. It scores type accuracy against labelled concept pairs whose answers `_RELATION_RUBRIC` decides on its own, plus stability (modal share across runs, no labels needed), type distribution, and calibration when an arm's prompt asks for a confidence. Two findings, measured on `qwen3:8b` over 15 pairs, 5 runs per arm, the SAME fixture in both arms. The suggester answers roughly two thirds of decidable pairs against its own rubric, at a stability of 0.99: `related_to` where a document says "it happened because", `part_of` where one says "one of the ... each registered the same way". It is not guessing. It is confidently and reproducibly wrong, which is a larger problem than the automation ergonomics #508 set out to improve. Filed separately. Asking for a confidence is quality-neutral -- accuracy 0.35 -> 0.37, stability 0.99 -> 0.96, ~18% more latency -- and the signal is real but insufficient. Thresholding lifts precision from 0.37 to 0.65 at >=0.6 (27% of emissions admitted) and 0.73 at >=0.9 (15% admitted). At 0.73, roughly one auto-applied relation type in four is wrong by the rubric. #385's concern was that bulk acceptance would rapidly apply low-value material; writing wrong types unattended at that rate is not an improvement on asking. So no threshold gate ships, and the confidence field is reverted rather than left in production with no consumer. `src/` is untouched by this commit. The first baseline/treatment pair spanned a fixture that grew from 7 to 15 edges mid-investigation, which made it worthless; both arms were re-run on the final fixture and the README states the rule.
This was referenced Aug 9, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #508.
src/is untouched —evals/andCHANGELOG.mdonly.#508 asked for confidence-threshold auto-acceptance and named a cap-harness A/B as the gate on any prompt change. That gate did not exist:
evals/scored extraction, and nothing scored this suggester at all.evals/edge_typing/is that gate. Type accuracy against labelled pairs whose answers_RELATION_RUBRICdecides on its own, plus stability (modal share across runs — no labels needed), type distribution, and calibration when an arm asks for a confidence.Finding 1 — the suggester fails its own rubric, confidently
Measured on
qwen3:8b, 15 labelled pairs, 5 runs:related_toshareIt answers
related_towhere a document says "it happened because the payment gateway migration removed a header", andpart_ofwhere one says "one of the scheduled maintenance jobs… each registered the same way" — cases the prompt's own tie-break chain says resolve tocaused_byandmember_of.Stability of 0.99 means it is not guessing. It is confidently and reproducibly wrong, which is a much larger problem than the automation ergonomics #508 set out to improve. Filed separately.
The fixture reproduces the field distribution independently:
related_tolands at 0.65–0.67 here against a measured 67% on a real bundle (edge_typing.py:146).Finding 2 — this is why no threshold ships
Same fixture, both arms:
confidencearmAsking for a confidence is quality-neutral at ~18% more latency, and the signal is real but insufficient:
>=0.6>=0.90.73 means roughly one auto-applied relation type in four is wrong by the rubric. #385's concern was that bulk acceptance "would rapidly apply a lot of low-value material"; writing wrong types unattended at that rate is not an improvement on asking a human.
So no threshold gate ships, and the confidence field was reverted rather than left in production with no consumer. The harness stays — it is what makes the next attempt measurable instead of hopeful.
A methodology error I made and corrected
The first baseline/treatment pair spanned a fixture that grew from 7 to 15 edges mid-investigation, which made the comparison worthless — the same trap
extraction_capalready records from the other direction, where comparing fixtures at different adjudication depths under-reported Spanish recall by half. Both arms were re-run on the final fixture and the README states the rule.Labels are constructed, not adjudicated, and the README says so plainly: read accuracy as rubric-consistency, not field accuracy.
Disclosure: no review receipt
Same lens defect as PRs #503, #506, #507, #509, #510 and #511.