Repository navigation
fix: keep check-bib off same-title records and read Hangul titles as titles - #38
Merged
Merged
Conversation
The E2E evaluation and holdout-v2 found the search path attaching to same-title letters, SI components, and book reviews, and Korean titles being read as absent. These cases, with controls where the cited record really is a letter, review, book, or preprint, are frozen before any before/after run so the fix cannot be tuned against them afterwards. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Search order is not identity. The E2E evaluation and holdout-v2 caught check-bib attaching references to a same-title letter (hiding Wakefield's retraction), to an SI component, and to journal reviews of a book, which sends the reader to the wrong paper. Candidates that cannot be the cited work are dropped, a book citation only matches book records, partial title overlap needs an agreeing first author, and matching candidates are ranked by first author, type, year, and container before search position. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The title-less check counted only Latin words, so a Korean reference with a title, carrying another paper's DOI, was explained as having no title. Hangul words and CJK runs now count (leading Hangul or Han author names excepted), and when CrossRef stores a Korean title for the DOI, the reference's Korean title is compared with it by syllable pairs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Shows the fix on the regression set and that the three earlier sets gain no fabricated PASS, lose no real PASS, and keep every retraction. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 9, 2026
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.
Why
The E2E evaluation (#37) and holdout-v2 found two engine problems.
1. The search path attaches a reference to the wrong CrossRef record, so the reader is sent to another paper or a retraction is missed. Observed cases:
PAPER_RETRACTED.type: component,.s003).2. A Korean reference with a title was treated as title-less, because only Latin words were counted. A DOI swap was then explained as "The reference has no article title".
What
Fix 1:
fix: keep search-path matches from landing on a same-title recordCandidates that cannot be the cited work are dropped:
componentandpeer-reviewrecords.A reference that reads as a book matches only book records (book, monograph, edited-book, chapters, …), never journal reviews of the book. A reference reads as a book when:
@book/@inbook/@incollectionor RISBOOK/CHAP; orA partial title match needs an agreeing first author. A title that only mostly appears in plain text (≥ 80% of its words) now counts only when the first author also agrees. A title found whole still counts with a different first author, so chimera references keep their "first author differs" WARN.
Matching candidates are ranked instead of taken in search order:
Fix 2:
fix: count Hangul and CJK words when deciding a reference has a title_titleless_differences,_looks_titleless) count Hangul words and Han/kana runs, one per four characters, in addition to Latin words.original-title) for the DOI, a Korean reference's title is compared with it by syllable pairs, so particles such as "하이드로젤의" still match.Tests and data
tests/fixtures/crossref/wrong_record_cases.json. The tests make no network calls._script_title_wordsdoes not exist there). The controls pass on both engines: a cited letter, an edited-book record, a cited book review, a Korean citation without a title, and a Korean title with spacing variants.benchmarks/references-regress-v3.jsonl(23 items) was frozen in 6f4386b before any run. It contains the three failure types and Hangul-title cases, plus close-call controls where the cited record really is a letter, a review, a book, or a preprint. It is a regression set, not a held-out score.benchmarks/results/2026-10-09-{6f4386b,fe8e810}-*.json: before and after runs of all four sets, each on a fresh cache,REF_VERIFY_MAILTOunset.Before / after
regress-v3 (frozen before the runs; n per category in parentheses)
r3-ctrl-07, a preprint resolved to the journal version)r3-hangul-01,-06)Regression check on the earlier sets. No set gained a fabricated PASS or a REJECT on an unindexed reference, lost a real PASS, or lost a
PAPER_RETRACTED.h2-notincr-05Feynman: PASS on the review → UNVERIFIED;h2-real-17: WARN on an unrelated record → UNVERIFIEDh2-notincr-05), was among the reported failure cases, so that item is no longer a clean held-out measurement.Risks
Verification
PYTHONPATH=src python3 -m unittest discover -s tests: OK.python3 -m py_compile src/ref_verify/*.py tests/*.py scripts/*.py: OK.🤖 Generated with Claude Code