All findings · Lucene finding · LFV-957 · changes-10-6-0-checkindex-entry-cites-nonexistent-github-17820

The Lucene 10.6.0 release notes credit the CheckIndex .si change to GITHUB#17820, an issue that does not exist, instead of GITHUB#7820

In the Lucene 10.6.0 release notes, the entry "CheckIndex now reports which segment's .si file could not be read" cites GITHUB#17820 instead of GITHUB#7820, so its link on the published Changes page is a 404. The extra digit came in with the 10.x backports of #16788; main is correct.

Summary

Priority
Low, rank 1288A wrong issue number in the released 10.6.0 CHANGES.txt is a cosmetic 404 link that misleads no API use.
Impact
minor
Since
10.6.0 (the backport 1b61ada0305, 2026-10-22)introduced 2026-10-22
Affected
the 10.6.0 release notes (CHANGES.txt, the published Changes page) and branch_10_6 today; main is correct
Status
documented
Found by
non-formal: every GITHUB# number of the 10.6.0 notes resolved against the issue tracker

AI-assisted page: this finding was first signalled by code reading or testing and then checked with AI tools; the checks it went through, and what each found, are under Prior reports, history and checks. Not yet triaged by a human. Snapshot of 2026-11-06.

The finding in 30 seconds

One digit in one line of the 10.6.0 release notes: the number of the issue the change belongs to.

Background: issue numbers in the release notes

  1. lucene/CHANGES.txt lists each release's changes. By convention every entry starts with the number of its issue or pull request, written GITHUB#XXX (CONTRIBUTING.md).
  2. When the docs are built, changes2html.pl turns every GITHUB#N into a link to https://github.com/apache/lucene/issues/N. It does not check that N exists.
  3. Main keeps a copy of each stable release's section. After a release, the release manager copies the released section back to main by hand, in an editor (release wizard step "Synchronize CHANGES.txt").
Diagram of the bug: the Lucene 10.6.0 release notes entry 'CheckIndex now reports which segment's .si file could not be read' starts with GITHUB#17820, and its link, the GitHub issue page for 17820, returns 404; the change belongs to issue #7820, which the feature commit, CheckIndex.java and main's copy of the entry name. The backports of #16788 to branch_10x and branch_10_6 on 2026-10-22 changed GITHUB#7820 to GITHUB#17820; main's commit of the same PR kept 7820.
The 10.6.0 CheckIndex entry and where its link goes: GITHUB#17820 (a 404) instead of issue #7820, and the 2026-10-22 backport that added the digit. Select the still to open it at full size. Generated with AI, checked against the code.

The finding, step by step

  1. You open the Lucene 10.6.0 Changes page (or lucene/CHANGES.txt in the 10.6.0 source release) and find the Improvements entry "CheckIndex now reports which segment's .si file could not be read".
  2. You expect its issue link to lead to #7820, "CheckIndex cannot "fix" indexes that have individual segments with missing or corrupt .si files ...": the issue that the feature commit, CheckIndex.java and main's copy of the entry all name.
  3. Instead the entry says GITHUB#17820, and the GitHub issue page for 17820 returns 404. The newest issue or PR is #16959 (2026-11-01), so 17820 cannot exist yet.
  4. Why: on 2026-10-22 the backports of #16788 to branch_10x and branch_10_6 rewrote this entry to add #16788's wording and, in the same hunk, turned GITHUB#7820 into GITHUB#17820. Main's commit of the same PR kept 7820. 10.6.0 shipped from branch_10_6.

Who is affected

Readers of the 10.6.0 notes who follow this entry's issue link get a 404 instead of #7820. Nothing else: no code, index or search effect, and the entry text still leads to the change. Unfixed, it stays in branch_10_6's 10.6.0 section, and the manual release-time sync could copy it into main.

Mechanism, terms and numbers486 words

The 10.6.0 Improvements entry reads "* GITHUB#17820: CheckIndex now reports which segment's .si file could not be read, rather than only that a commit point was unreadable. SegmentInfos throws CorruptSegmentInfoException, carrying the segment name and the underlying failure, when a .si file is missing or corrupt; other I/O failures, such as transient ones, propagate unchanged. (Gokul Manoj, Serhiy Bzhezytskyy, Alex Reelsen)". The change belongs to issue #7820 (open, "CheckIndex cannot "fix" indexes that have individual segments with missing or corrupt .si files because sanity checks will fail trying to read the index initially. [LUCENE-6762]"): the feature commit, CheckIndex.java, TestCheckIndex and main's copy of the entry all name 7820. Issue 17820 does not exist, so the link on the published 10.6.0 Changes page returns 404. The extra digit came in on 2026-10-22 with the direct-push backports of #16788 to branch_10x and branch_10_6, which rewrote the entry to add #16788's wording; main's commit of the same PR kept 7820. It is a documentation defect with no code, index or search effect. The fix is a one-character edit on branch_10_6, ideally before the release-time CHANGES sync, a manual edit in which the release manager copies the 10.6.0 section back to main.

The claim

  • At the 10.6.0 tag, CHANGES.txt:6 is the Lucene 10.6.0 heading and CHANGES.txt:112 starts the entry: * GITHUB#17820: CheckIndex now reports which segment's .si file could not be read, rather than only that. The published 10.6.0 Changes page, line 293, links it to the GitHub issue page for 17820 (HTTP 404) and has no link to issues/7820. The page is byte-identical to the staged RC1 page (same sha256).

The right number is 7820

  • The feature commit f30bd1b9b4f: "GITHUB#7820: report which segment's .si could not be read (#16476)"; its CHANGES hunk adds * GITHUB#7820:.
  • CheckIndex.java:639 on main (:603 at 10.6.0): // https://github.com/apache/lucene/issues/7820: also attempt to open any older commit; TestCheckIndex.java:249 (:255 at 10.6.0) cites the same issue.
  • Main's copy of the entry, CHANGES.txt:562 at 645d4fe14a20: * GITHUB#7820: .... Main's commit of #16788 itself, 330ee57b167, kept * GITHUB#7820:.

How the digit got in

  1. 2026-10-05: #16476 adds the entry on main and on branch_10x (f30bd1b9b4f, 6758e9c3c5c) as GITHUB#7820. 2026-10-14: branch_10_6 is cut and inherits it.
  2. 2026-10-21: #16788 (by spinscale; merged by romseygeek per the PR's GitHub record) extends the wording on main and keeps 7820. 2026-10-22: the changelog sync 7cecf795236 copies branch_10_6's text of that moment (older wording, 7820) into main's 10.6.0 section.
  3. 2026-10-22: the direct-push backports of #16788 to branch_10x (081f0abb6e3) and branch_10_6 (1b61ada0305) change -* GITHUB#7820: to +* GITHUB#17820: in the same hunk that adds the #16788 wording and credit. git log -S'GITHUB#17820' on branch_10_6 finds only 1b61ada0305.
  4. 2026-10-26: RC1 4ae946e5a9b, released as 10.6.0 on 2026-10-29. changes2html.pl:28, 574-576 turns the number into the dead link; neither it nor the checks the verifiers inspected (the disabled changelog workflow, smokeTestRelease.py) validate link targets.
Exposure and likelihood294 words
  • Who meets it: readers of the 10.6.0 notes (CHANGES.txt in the source release, the published 10.6.0 Changes page) who follow this one entry's issue link. It is not tied to any setting or API.
  • What they get: a 404 when they follow the link, a routine way to learn more about a change. The entry text and CheckIndex.java still lead to #7820, so the cost is a detour.
  • What does not happen: no effect on code, indexes, queries or results.
  • Scale: one line in one release line (10.6.x). Unfixed, it stays in branch_10_6's retained 10.6.0 section (already below the new 10.6.1 section), so later 10.6.x CHANGES files would repeat it. Main has the right number. The release wizard's "Synchronize CHANGES.txt" step asks the release manager to copy the released section back to main (releaseWizard.yaml:1399-1404); it is a manual edit in an editor followed by a "Sync CHANGES" commit (:1424-1443), not a mechanical copy. Main has had no such commit for 10.6.0 yet, so main's 7820 could become 17820 if the section is copied as it is; the release manager may equally reconcile it by hand (an inference from the documented step).
  • Projection, not an observation: once the tracker reaches 17820 the link would point to an unrelated item; the tracker is at #16959.
  • How much it matters. For it: readers who follow the published link get a 404, the fix is one character, and Lucene has merged this kind of fix before. Against it: main is already right, a branch_10_6 edit cannot repair the published 10.6.0 files, and the entry text and CheckIndex.java still lead to #7820. Whether a dead link counts as user impact is a judgement call, not a demonstrated software defect.

Minimal repro

One JUnit test, one method, no index, nothing random: it reads a CHANGES.txt (path in -Dchanges.txt), finds the CheckIndex .si entry and asserts that it starts with GITHUB#7820. It fails on the 10.6.0 text and on today's branch_10_6, and passes on main's text and on the fixed 10.6.0 text.

TestChangesCheckIndexEntryIssue.java (one test class)18 lines
package org.apache.lucene.index;

import java.nio.file.Files;
import java.nio.file.Path;
import org.apache.lucene.tests.util.LuceneTestCase;

public class TestChangesCheckIndexEntryIssue extends LuceneTestCase {

  public void testCheckIndexEntryCitesIssue7820() throws Exception {
    // -Dchanges.txt=<lucene/CHANGES.txt>; expected GITHUB#7820 (the issue CheckIndex.java links); actual in 10.6.0 RC1: GITHUB#17820 (404).
    String entry =
        Files.readAllLines(Path.of(System.getProperty("changes.txt"))).stream()
            .filter(line -> line.contains("CheckIndex now reports which segment's .si file could not be read"))
            .findFirst()
            .orElseThrow();
    assertEquals("GITHUB#7820", entry.substring(2, entry.indexOf(':')));
  }
}
Command
cd $LUCENE && ./gradlew :lucene:core:test --tests org.apache.lucene.index.TestChangesCheckIndexEntryIssue -Ptests.seed=DEADBEEF -Ptests.asserts=true "-Ptests.jvmargs=-Dchanges.txt=$PWD/lucene/CHANGES.txt"
Expected
The test passes: the CheckIndex .si entry starts with GITHUB#7820, the issue the change belongs to.
Observed
ComparisonFailure: expected:<GITHUB#[]7820> but was:<GITHUB#[1]7820>; the published page links issues/17820, a 404.

All files of this repro: repro/LFV-957/

More files, environment, full output346 words

No Lucene API is involved; the package only keeps the file next to TestCheckIndex, and the result does not depend on the seed or on assertions. The test does not use the network, so it checks the number, not the 404. -Ptests.jvmargs passes the path to the forked test JVM; it replaces gradle's default extra test JVM flags, which does not matter here. The file has no Apache license header.

The simplest demonstration needs no test: git show releases/lucene/10.6.0:lucene/CHANGES.txt | grep -n 'GITHUB#17820' prints line 112, and the GitHub issue page for 17820 is a 404.

No regression test is suggested. The fix is a text edit, and a test that reads CHANGES.txt and pins one entry is not something Lucene's suite does; this test is evidence only.

Environment

lucene10.6.0 (`4ae946e5a9b9`, tag releases/lucene/10.6.0) and branch_10_6 head `91eaab4fb29`: fail; main `645d4fe14a20` and `f815e679bf6`: pass (main has the right number)
jdkOpenJDK 25.0.3
osLinux aarch64 (the only platform run)
Command (environment)
cd $LUCENE && git checkout releases/lucene/10.6.0      # or branch_10_6
cp $REPRO/TestChangesCheckIndexEntryIssue.java lucene/core/src/test/org/apache/lucene/index/
./gradlew :lucene:core:test --tests org.apache.lucene.index.TestChangesCheckIndexEntryIssue -Ptests.seed=DEADBEEF -Ptests.asserts=true "-Ptests.jvmargs=-Dchanges.txt=$PWD/lucene/CHANGES.txt"
# same failure with -Ptests.asserts=false

Observed output

# gradle on a worktree of releases/lucene/10.6.0 (4ae946e5a9b), seed DEADBEEF, -Ptests.asserts=true (identical with false)
> Task :lucene:core:test FAILED
TestChangesCheckIndexEntryIssue > testCheckIndexEntryCitesIssue7820 FAILED
    org.junit.ComparisonFailure: expected:<GITHUB#[]7820> but was:<GITHUB#[1]7820>
        at __randomizedtesting.SeedInfo.seed([DEADBEEF:208B4075A96A5DCB]:0)
        at app//org.junit.Assert.assertEquals(Assert.java:117)
        at app//org.junit.Assert.assertEquals(Assert.java:146)
        at app//org.apache.lucene.index.TestChangesCheckIndexEntryIssue.testCheckIndexEntryCitesIssue7820(TestChangesCheckIndexEntryIssue.java:16)
:lucene:core:test (FAILURE): 1 test, 1  failure
BUILD FAILED

# a separate re-run on the jars (no gradle), seed DEADBEEF
# released 10.6.0 jars + the 10.6.0 tag's CHANGES.txt (line 112): FAIL tests_run=1 failures=1, -ea and -da, same message
# main 645d4fe14a20 jars + main's CHANGES.txt (line 562): PASS, -ea and -da
# main jars + today's branch_10_6 text (91eaab4fb29, line 119): FAIL; + today's main text (f815e679bf6, line 593): PASS

# the published 10.6.0 Changes page, line 293 (fetched 2026-11-01; the link target is given in words)
<li><a href="[the GitHub issue page for 17820]">GITHUB#17820</a>: CheckIndex now reports which segment's .si file could not be read, rather than only that
# the GitHub issue page for 17820 -> HTTP 404; https://github.com/apache/lucene/issues/7820 -> HTTP 200

Why it looks unintended

  • Every other source names #7820: the feature commit, CheckIndex.java, TestCheckIndex, and main's commit of the same #16788 change.
  • CONTRIBUTING.md: an entry "should start with the issue or pull request number GITHUB#XXX"; 17820 is neither.
  • Lucene has fixed wrong CHANGES numbers before, e.g. GITHUB#2472 -> GITHUB#12472 (2023) and "Fix up PR number in changes entry for #16428" (2026).
The full argument147 words
  • The convention. CONTRIBUTING.md:107 (10.6.0: line 101): "A CHANGES entry should start with the issue or pull request number GITHUB#XXX that is followed by the description of the change and contributors' name."
  • Main and the branch are meant to agree. dev-tools/scripts/diff_lucene_changes.py:24-29: "It's best to keep these 1) identical and 2) matching what changes were actually backported to be honest to users".
  • Most likely an accidental extra digit (an inference; nothing records why). The backport hunk changes the number next to the intended wording change, the commit message does not mention renumbering, and no comment on #16788, #16476, #7820 or the backport commits mentions 17820.
  • Precedent. 18a71043c80 "Fix up PR number in changes entry for #16428" (2026-08-03, GITHUB#16408 -> GITHUB#16428); 51ade888f32 "Update wrong PR number in CHANGES.txt" (2023-09-19, GITHUB#2472 -> GITHUB#12472) and its siblings ac62c58d46c, f5d5dc289ed; 367cd2ea95b "Associate correct PR with DrillSideway change in CHANGES" (2022).
The devil's-advocate check188 words

Strongest case for leaving it (the intended-behaviour devil's advocate): CHANGES is curated prose that the release manager reworks into the release notes (the wizard's draft-release-notes step says to edit its contents "into a more concise format for public consumption", releaseWizard.yaml:606; that step writes the wiki release notes and does not edit CHANGES.txt); CONTRIBUTING only says "should"; a wrong link is no reason to respin a release; and main's wording differs anyway, so the entry is in flux until the release sync.

Why it fails: each point is about severity or process, not intent. Nothing in code, tests, PRs or lists treats 17820 as meaningful, the published 10.6.0 page links a 404, and the project has corrected exactly this kind of slip before. The fix is a text edit, not a respin. An independent reviewer from another model family (OpenAI GPT-5.6, reading only) rated the 'intended' argument weak; the earlier refute review (reading only, so it could not run code) returned a procedural "not real" (it expected a failure on main, which is correctly unaffected) and it called the release text "a genuine, minor documentation typo".

Suggested fix

Recommended Restore GITHUB#7820 in the 10.6.0 entry on branch_10_6 (validated)

Change GITHUB#17820 back to GITHUB#7820 in the 10.6.0 CheckIndex entry on branch_10_6 (one character), ideally before the release-time CHANGES sync (a manual edit) reconciles main. Validated on the 10.6.0 tag: the test fails before and passes after (assertions on and off), TestCheckIndex passes, and the rendered Changes page links issues/7820.

@@ -116,7 +116,7 @@
 * GITHUB#16091: Replace deprecated IndexSearcher#search(Query, Collector) usage with CollectorManager
   in JoinUtil#createJoinQuery for the GlobalOrdinalsCollector case. (Luca Cavanna)
 
-* GITHUB#17820: CheckIndex now reports which segment's .si file could not be read, rather than only that
+* GITHUB#7820: CheckIndex now reports which segment's .si file could not be read, rather than only that
   a commit point was unreadable. SegmentInfos throws CorruptSegmentInfoException, carrying the segment
   name and the underlying failure, when a .si file is missing or corrupt; other I/O failures, such as
   transient ones, propagate unchanged. (Gokul Manoj, Serhiy Bzhezytskyy, Alex Reelsen)
All options and trade-offs2 options · 374 words

One CHANGES.txt edit on branch_10_6. Main already has the right number; branch_10x needs nothing (decommissioned on 2026-10-29, #16911). The released 10.6.0 files and the published 10.6.0 page keep the dead link; whether to republish the page is the committers' call. The sibling LFV-948 (the 10.6.0 StableTflSimilarity entry advertises k3) is another 10.6.0 CHANGES defect.

Restore GITHUB#7820 in the 10.6.0 entry on branch_10_6 (validated) (recommended)

Line 119 on today's branch_10_6 head 91eaab4fb29 (line 112 at the 10.6.0 tag; the new 10.6.1 section moved it down by 7 lines).

@@ -116,7 +116,7 @@
 * GITHUB#16091: Replace deprecated IndexSearcher#search(Query, Collector) usage with CollectorManager
   in JoinUtil#createJoinQuery for the GlobalOrdinalsCollector case. (Luca Cavanna)
 
-* GITHUB#17820: CheckIndex now reports which segment's .si file could not be read, rather than only that
+* GITHUB#7820: CheckIndex now reports which segment's .si file could not be read, rather than only that
   a commit point was unreadable. SegmentInfos throws CorruptSegmentInfoException, carrying the segment
   name and the underlying failure, when a .si file is missing or corrupt; other I/O failures, such as
   transient ones, propagate unchanged. (Gokul Manoj, Serhiy Bzhezytskyy, Alex Reelsen)

Trade-offs

None in code. Doing it before the release-time "Synchronize CHANGES.txt" step means a release manager who copies the section back to main copies the right number; the step is a manual edit, so inspect the sync diff either way.

What the checks validated

In a scratch worktree of the 10.6.0 tag (main already has the right number, so the fix has nothing to change there), OpenJDK 25.0.3: the diff applies and no GITHUB#17820 is left; the minimal test fails before and passes after, and TestCheckIndex passes (1 + 9 tests, -Ptests.asserts=true and false; a text edit cannot affect it, so this only shows nothing breaks); ./gradlew :lucene:documentation:changesToHtml renders line 293 as a link to issues/7820 with no issues/17820 left; the diff applies to today's branch_10_6 text with a 7-line offset (patch --dry-run).

Also bring main's 10.6.0 entry in line now (optional, not run)

Alongside the fix, replace main's older wording of the entry (CHANGES.txt:562-564 at 645d4fe14a20) with the released wording, keeping GITHUB#7820: what the release-time sync should produce.

Trade-offs

That step belongs to the release manager; doing it with the fix only makes main match branch_10_6 earlier.

How it was found

Non-formal. While re-reading the 10.6.0 release notes, a finder resolved all 110 distinct GITHUB# numbers of the section through the issue tracker: 109 matched their entries and 17820 did not exist. An offline check of the numbers and git history then traced the digit to the #16788 backports.

The method in full141 words
  • Tracker check (a hunt unit): every GITHUB# number of the RC's 10.6.0 section (110 distinct, 112 occurrences) was looked up through the GitHub issues API and its title compared with the entry; 109 match, 17820 is a 404.
  • Offline check: no number may be newer than every issue or PR the release branch's commit subjects name (max #16910 on the RC branch); it fails on the RC text and passes on main's text and on the fixed text. Its known limit: it false-fails on 9.12.3, whose commit subjects omit a valid number.
  • Verification: an independent reproducer with its own oracle (tracker maximum, and the entry), an independent reviewer from another model family (OpenAI GPT-5.6) and an intended-behaviour devil's advocate all called it real; an adjudication confirmed it (high). The repro was then reduced to one test with one assertion.

Prior reports, history and checks

Prior reports

No public report found (2026-10-28: 97 scripted queries and 18 manual GitHub searches, the RC1 vote and feature-freeze threads, recent PRs' CHANGES diffs; rechecked 2026-11-01). Nearest items: #16788 (the PR whose backports added the digit), #16476 and #7820 (the feature and its issue).

Searches2 searches

Nobody has reported that the 10.6.0 CheckIndex entry cites GITHUB#17820. Related, not this bug: #16788 (no comment about the number), #16476 (the feature PR), #7820 (the right issue, open), #16474 (an open, unmerged PR whose diff would add a separate GITHUB#7820 entry on main), #12872 (an earlier attempt at the feature), #16912 (fixed a different 10.6.0 entry), the commits@ mails of the two backports (no replies), and tracking issue #16937, which lists no individual bugs. elastic/elasticsearch#17820 and opensearch-project/OpenSearch#17820 are unrelated items that share the number.

Recheck 2026-11-01: the wrong number is still on branch_10_6 91eaab4fb29 (line 119); main f815e679bf6 (line 593) has 7820. GitHub searches for 17820 and issues/17820 return nothing; a full, paginated listing of the PRs whose base is branch_10_6 (any state) returns only #16910 and #16945 (unrelated), and its CHANGES commits since 2026-10-26 do not touch the entry.

What was searched, when, and what turned up
WhereWhenHowFound
GitHub issues, PRs and commits (apache/lucene incl. the migrated JIRA archive), downstream repositories (Solr, Elasticsearch, OpenSearch), dev@/java-user@/issues@/commits@ lists, the web2026-10-28scripted prior-report search, two runs (45 and 52 queries, incl. 17820, GITHUB#17820, issues/17820, CHANGES typo 10.6, 16788 backport CHANGES); 18 manual GitHub searches; every issue/PR created or updated since 2026-10-26; the CHANGES diffs of all 15 PRs created since 2026-10-20; comments on #16788, #16476, #7820, #16474, #12872 and the backport commits; the RC1 vote (13 mails) and feature-freeze (11 mails) threadsnothing reporting the number; nearest #16788, #16476, #7820, #16474, #12872, #16912
apache/lucene upstream (GitHub API: branch heads, raw CHANGES.txt, issues, search, PRs against branch_10_6)2026-11-01the entry on main and branch_10_6; issues/17820 and issues/7820; GitHub search for 17820, issues/17820, GITHUB#7820 and CHANGES items updated since 2026-10-28; branch_10_6 PRs and CHANGES commitsstill present on branch_10_6; no issue or PR about it

History

Introduced on 2026-10-22 by the backports of #16788 to branch_10x (081f0abb6e3) and branch_10_6 (1b61ada0305); 10.6.0 shipped with it. Main has the right number at every commit checked. 9.x and 10.0.0-10.5.2 have neither the entry nor the feature.

Versions tested7 rows

The hunt's checks (the offline number check and the reproducer's oracle), run on the CHANGES.txt text at each commit, pass at the parents of the backports (88c0bd4c346 on branch_10_6, 9f18a6bceea on branch_10x) and fail from the backports on, with -ea and -da, through RC1 and the branch_10x head before it was decommissioned. Main passes at f30bd1b9b4f, 330ee57b167, 7cecf795236, a9779ef3c193 and 645d4fe14a20; for this doc also on today's main f815e679bf6. Both backports carry #16788's author date (2026-10-21); their commit date, 2026-10-22, dates the typo.

Versions and branches executed, with results
Version or commitVerdictResult
10.6.0 (4ae946e5a9b9, released) affectedthe minimal test fails 1 of 1 on the released jars (-ea, -da) and through gradle on the tag; CHANGES.txt:112 and the published Changes page (line 293) cite 17820
branch_10_6 head 91eaab4fb29 textstill GITHUB#17820 at CHANGES.txt:119 (2026-11-01); the minimal test fails
branch_10_6 3e416dce059, 88c0bd4c346 not affectedbefore the backport: GITHUB#7820; both checks pass
branch_10x 081f0abb6e3 to its last head retiredGITHUB#17820 at CHANGES.txt:138 until the branch was decommissioned on 2026-10-29 (#16911)
main 645d4fe14a20, f815e679bf6 not affectedGITHUB#7820 (lines 562 and 593, older wording); the minimal test passes
9.x, 10.0.0 to 10.5.2 entry absentno such entry and no CorruptSegmentInfoException (checked on 9.12.3, 10.5.0, 10.5.2)
10.6.0 + fix not affectedthe minimal test and TestCheckIndex pass; the rendered page links issues/7820

Independent checks

Confirmed (high) by an adjudication after an independent reproducer, a reviewer from another model family and a devil's advocate all called it real; re-run for this doc on the released 10.6.0 jars, through gradle on the 10.6.0 tag and on today's branch_10_6 text.

Checks and verdicts296 words

Every verifier ran a failing check on the 10.6 text and a passing one on main's text. The only "not real" verdict came from the refute review, which expected a failure on main; main is correctly unaffected.

Each independent check and its verdict
CheckVerdictWhat it found
Finder (tracker check, offline number check) reproduced (doc)109 of 110 numbers match their entries, 17820 is a 404; the offline check fails on the RC text and passes on main's and on the fixed text.
Cross-model refute review (OpenAI GPT-5.6, reading only) not real (procedural)Its only objection was that main does not fail, and main is correctly unaffected (reading only, it could not run code); called the release text a genuine, minor documentation typo; root cause agreed; added CONTRIBUTING.md and CheckIndex.java as intent evidence.
Independent reproducer realOwn oracle fails on the RC text (-ea, -da) and passes on main and the fixed text; found the staged RC1 Changes.html link and the branch_10x copy.
Cross-model adversary (intended lens, reading only) real (high)Intended argument weak: a renderer without online validation is no decision to publish a wrong number. Root cause and fix agreed.
Intended-behaviour devil's advocate realThe strongest 'intended' case is about severity and process, not intent; found the precedent commits; fetched the staged RC1 page.
Adjudication confirmed (high)Re-ran the check (RC fails, main and the fixed text pass) and git log -S'GITHUB#17820' (only the backport).
This doc's runs (released 10.6.0 jars, gradle on the tag, fix check) reproduced; fix validatedMinimal test fails 1 of 1 on the released jars and through gradle (assertions on and off); passes after the fix with TestCheckIndex; the rendered page links issues/7820; today's branch_10_6 text still fails.

Diagram file

The diagram as a still image, generated with AI and checked against the code. It is under 10 MB, the limit for a GitHub attachment.

Sources and provenance

Finding record, Lucene and upstream sources, repro files and diagram notes1,516 words

Finding record

LFV-957, snapshot of 2026-11-06

Registry title
The Lucene 10.6.0 RC1 release notes credit the CheckIndex '.si file could not be read' change to GITHUB#17820, an issue that does not exist, instead of GITHUB#7820, so the generated Changes page links to a 404; the extra digit came in with the stable-branch backports of #16788 (documentation defect, released in 10.6.0; main is correct)
Area
release notes / lucene/CHANGES.txt 10.6.0 Improvements (CheckIndex / CorruptSegmentInfoException entry, GITHUB#7820)
Priority
Low, rank 1288: A wrong issue number in the released 10.6.0 CHANGES.txt is a cosmetic 404 link that misleads no API use.
Impact class
minor
Impact note
Release-notes text only, in 10.6.0 (released 2026-10-29): every reader of the 10.6.0 CHANGES.txt or of the Changes.html that changes2html.pl generates from it who follows the GITHUB#17820 link of the CheckIndex entry reaches a missing issue (HTTP 404; the newest issue or PR was #16959 on 2026-11-01) instead of GITHUB#7820; no code, index or search effect, no earlier release is affected, and main's copy of the entry has the right number.
Summary
You read the Lucene 10.6.0 release notes (CHANGES.txt or the generated Changes.html of RC1) and follow the issue link of the entry 'CheckIndex now reports which segment's .si file could not be read'. You expect it to lead to GITHUB#7820, the issue the feature commit, CheckIndex.java and main's copy of the entry all name; instead the entry says GITHUB#17820 and its GitHub issue link (number 17820) returns 404. The extra digit was added when #16788 was backported to branch_10x and branch_10_6 (main's commit of the same PR kept 7820), and it ships in the RC1 source release.
Introduced
1b61ada0305 (branch_10_6, the 10.6.0 RC1 line) and its twin 081f0abb6e3 (branch_10x): the direct-push backports (no PRs of their own) of apache/lucene#16788 'SegmentInfos: Ensure IOExceptions are not hidden behind CorruptSegmentInfoException' (authored by Alexander Reelsen, pushed by Alan Woodward). Their identical CHANGES hunk changes '* GITHUB#7820:' to '* GITHUB#17820:' while adding the #16788 wording and credit; main's commit of the same PR, 330ee57b167, keeps GITHUB#7820 [exec: the reference checks pass at the parents 88c0bd4c346 (branch_10_6) and 9f18a6bceea (branch_10x) and fail from the backports on, -ea and -da; read: git log -S'GITHUB#17820' on 4ae946e5a9b finds only 1b61ada0305, git patch-id of the two backports is identical]. The entry itself was correct since the feature commit f30bd1b9b4f (#16476, main, 2026-10-05), its branch_10x backport 6758e9c3c5c and the branch_10_6 cut 3e416dce059 [exec] (2026-10-22 (commit dates: branch_10x 081f0abb6e3 2026-10-22, branch_10_6 1b61ada0305 2026-10-22; both carry the #16788 author date 2026-10-21, which main's correct 330ee57b167 shares, so the author date does not date the typo))
First affected version
10.6.0 (released 2026-10-29 from RC1, built from branch_10_6 4ae946e5a9b; tag releases/lucene/10.6.0). The entry and the CorruptSegmentInfoException feature are new in 10.6.0, so no earlier release can carry the wrong number [exec: 9.12.3, 10.5.0 and 10.5.2 pass with the entry absent; read: CorruptSegmentInfoException.java absent from those releases, branch_10_5 lacks 6758e9c3c5c]
Affected versions
10.6.0 RC1 [exec: branch_10_6 4ae946e5a9b lucene/CHANGES.txt:112 and the RC1 source tarball's CHANGES.txt (same blob 57021931b735) fail both reference checks, -ea and -da; the staged RC1 changes/Changes.html line 293 links the GitHub issue numbered 17820 (HTTP 404) and has no link to issues/7820]; branch_10_6 from 1b61ada0305 to its head 91eaab4fb29 (line 119 on 2026-11-01; line 112 in RC1 4ae946e5a9b) and branch_10x from 081f0abb6e3 to its last head 657014b3c57 (line 138; #16911 decommissioned the branch on 2026-10-29) [exec; upstream recheck 2026-10-28: both heads unchanged and still say GITHUB#17820; exec 2026-10-29: the independent reproduction's check fails on the branch_10x 657014b3c57 text with -da; exec 2026-11-01: the minimal test fails on the branch_10_6 head 91eaab4fb29 text, -ea]. Not affected: main at every commit checked (f30bd1b9b4f, 330ee57b167, 7cecf795236, a9779ef3c193 line 552, upstream head 645d4fe14a2 line 562: GITHUB#7820) [exec]; branch_10_6 before 1b61ada0305 (3e416dce059, 88c0bd4c346) and branch_10x before 081f0abb6e3 (6758e9c3c5c, 9f18a6bceea) [exec]; 9.x and 10.0.0-10.5.2 (entry absent) [exec on 9.12.3, 10.5.0, 10.5.2; read for the rest]. Main's copy of the entry has the older pre-#16788 wording (from the release-manager sync 7cecf795236, which ran before the backports); that is an expected interim state, not a separate defect. All runs JDK 25.0.3 on Linux aarch64; the checks read only text, so the classpath and -ea/-da do not change the result
Status
documented (brief, checks and a per-finding doc exist)
Verification
Confirmed by AI-run checks: an independent repro, a cross-model review that could only read the code (its “not real” is procedural), an intended-behaviour check, a prior-report search and a skeptical audit; not yet triaged by a person.
Found by
non-formal
Upstream and prior reports
none found (searched 2026-10-28: two scripted prior-report searches (45 and 52 queries over GitHub issues and PRs, commits, downstream repositories, dev@/java-user@/issues@/commits@, the JIRA archive and the web) incl. '17820', 'GITHUB#17820', 'issues/17820', 'CHANGES typo 10.6', '16788 backport CHANGES'; 18 manual GitHub searches incl. items created since 2026-10-14/20/26; every issue/PR created or updated since 2026-10-26; the diffs of all 15 PRs created since 2026-10-20 that touch a CHANGES file; all PRs based on branch_10_6 and branch_10x; comments on #16788, #16476, #7820, #16474, #12872 and on the backport commits; the CHANGES.txt commits since 2026-10-20 on branch_10_6, branch_10x and main (author and committer dates compared); the dev@ '[VOTE] Release Lucene 10.6.0 RC1' (13 mails) and 'New branch and feature freeze for Lucene 10.6.0' (11 mails) threads). Nearest items, not this bug: #16788 (the PR whose backports introduced the number; no comment about it), #16476 (the feature PR, 'GITHUB#7820: report which segment's .si could not be read'), #7820 (the correct issue, open), #16474 (open, adds a separate GITHUB#7820 entry on main), #12872 (earlier attempt at the feature), #16912 (moved a different 10.6.0 entry to 11.0.0: precedent for 10.6.0 CHANGES fixes), #16911 (open when searched; merged on 2026-10-29 as 48cf3f515d6, it decommissioned branch_10x and so removed only that branch's copy), and the commits@ mails of the two backports (no replies); elastic/elasticsearch#17820 and opensearch-project/OpenSearch#17820 are unrelated items that only share the number. Not fixed upstream. Recheck 2026-10-28: branch heads unchanged, issue 17820 is HTTP 404, GitHub search for 17820 in apache/lucene returns nothing, the 3 items updated since a recent cutoff (#16937, #16931, #16900) do not touch the entry, and a dev@ archive search over the last 3 days finds 0 mails for 17820 or 7820 and, for CHANGES, only the hunt's own thread (no vote-thread mail); recheck 2026-10-29: branch heads unchanged, a GitHub search for 17820 in apache/lucene gives 0 hits, the newest item is #16937; #16929 (merged 2026-10-29: main 3386cdab564, branch_11x 13564969139; CI and config only) and #16930 (merged 2026-10-29: main 2a32d42e5e8, branch_11x b40f497d736; removed only the empty 10.7.0 section) do not touch the entry; the branch_10x copy went with #16911 (48cf3f515d6, 2026-10-29); branch_10_6 91eaab4fb29 still says GITHUB#17820 (CHANGES.txt:119)
Lucene commit tested
The minimal test on the released 10.6.0 jars (Maven Central) with the 10.6.0 tag's CHANGES.txt (releases/lucene/10.6.0 = 4ae946e5a9b9, blob 57021931b735, line 112): fails 1 of 1 with -ea and -da, seed DEADBEEF. Through gradle on a scratch worktree of the tag: fails with assertions on and off; after the one-line fix it passes, with TestCheckIndex (1 + 9 tests), and changesToHtml renders a link to issues/7820. On main 645d4fe14a20 jars: main's own CHANGES.txt (line 562) passes; today's branch_10_6 text (91eaab4fb29, line 119) fails; today's main text (f815e679bf6, line 593) passes. The published 10.6.0 Changes page (line 293, issues/17820) and the 404 were re-fetched on 2026-11-01. The hunt's checks (2026-10-28) ran on branch_10_6 4ae946e5a9b and main a9779ef3c193; the 2026-10-29 re-run and the minimal repro on 645d4fe14a20. OpenJDK 25.0.3, Linux aarch64.

Lucene and upstream sources

Finding record
  • lucene/CHANGES.txt:552 (main's 10.6.0 entry, GITHUB#7820, pre-#16788 wording); lucene/core/src/java/org/apache/lucene/index/CheckIndex.java:639 ('issues/7820'); CONTRIBUTING.md:107 (an entry starts with the issue or PR number GITHUB#XXX); gradle/documentation/changes-to-html/changes2html.pl:28,574-576 (GITHUB#N becomes a link to issues/N)
  • a Lucene clone git: 4ae946e5a9b:lucene/CHANGES.txt:112; commits 1b61ada0305 (branch_10_6), 081f0abb6e3 (branch_10x), 330ee57b167 (main, #16788), f30bd1b9b4f (#16476), 7cecf795236 (main 10.6.0 changelog sync)
  • lucene/CHANGES.txt:562 (GITHUB#7820) on main 645d4fe14a2
The finding in 30 seconds
  • a Lucene clone releases/lucene/10.6.0 (4ae946e5a9b) lucene/CHANGES.txt:6, 112-115; CheckIndex.java:603; TestCheckIndex.java:255; gradle/documentation/changes-to-html/changes2html.pl:28, 574-576
  • a Lucene main checkout (645d4fe14a20) lucene/CHANGES.txt:562-564; lucene/core/src/java/org/apache/lucene/index/CheckIndex.java:639; lucene/core/src/test/org/apache/lucene/index/TestCheckIndex.java:249; CONTRIBUTING.md:107; dev-tools/scripts/releaseWizard.yaml:1399-1404
  • a Lucene clone git show f30bd1b9b4f, 330ee57b167, 7cecf795236, 081f0abb6e3, 1b61ada0305 (lucene/CHANGES.txt hunks); git log -S'GITHUB#17820' origin/branch_10_6 -- lucene/CHANGES.txt
Who is affected
  • a Lucene main checkout dev-tools/scripts/releaseWizard.yaml:1399-1404, 1424-1443 (the sync is an editor step)
Why it looks unintended
  • a Lucene main checkout CONTRIBUTING.md:107; dev-tools/scripts/diff_lucene_changes.py:24-29; dev-tools/scripts/releaseWizard.yaml:606
  • a Lucene clone releases/lucene/10.6.0 CONTRIBUTING.md:101
  • a Lucene clone git show 18a71043c80, 51ade888f32, ac62c58d46c, f5d5dc289ed, 367cd2ea95b (lucene/CHANGES.txt hunks)
Suggested fix
  • a Lucene clone git show 48cf3f515d6 (Decommission branch 10x (#16911)); a Lucene main checkout dev-tools/scripts/releaseWizard.yaml:1399-1404
History
  • a Lucene clone releases/lucene/10.6.0 (tag object e29d290eeb0, 2026-10-29); git log -S'GITHUB#17820'; git show 48cf3f515d6
Diagrams
  • a Lucene clone releases/lucene/10.6.0 lucene/CHANGES.txt:112; git show 1b61ada0305, 330ee57b167

Other statements trace to the hunt's working files (models, logs, reviews and briefs), which are not published.

Repro files

About the diagrams

Made in parallel with this doc from the 10.6.0 tag's CHANGES.txt, the published Changes page, the minimal repro and the git history.

Built 2026-11-06 from the hunt's record of this finding and its doc file. Lucene main under test in this hunt: ea57360912ed. Every listed finding was re-run on Lucene main e1faeba08bde on 2026-11-02.