One generated line on the documentation front page: the "API Javadocs" list links a module whose javadocs the build deliberately skips.
- Each published Lucene module gets a Gradle task,
renderSiteJavadoc, that writes its javadocs into the documentation tree, for exampledocs/core/. - A module keeps its javadocs off the site by disabling that task. Luke was taken off this way in 2021 (PR #120); benchmark-jmh disables it too: "No special javadocs for JMH benchmarks."
- The
createDocumentationIndextask writes the front page. Its "API Javadocs" list should have one link per module whose javadocs are written.
- You open the Lucene 10.6.0 documentation front page (
docs/index.htmlin the binary release, or a documentation build of main) and look at "API Javadocs": 32 modules, one more than in 10.5.2. The new one isbenchmark-jmh, "Lucene JMH micro-benchmarking module". - You expect each link to open that module's javadocs, as the other 31 do, or the module not to be listed, as in 10.5.2.
- Instead
benchmark-jmh/index.htmldoes not exist. The module's build turns its site javadocs off ("No special javadocs for JMH benchmarks"), the build log shows that task SKIPPED, and the docs have nobenchmark-jmh/folder. - Why: the code that writes the list keeps every module that has a
renderSiteJavadoctask and never asks whether the task is enabled. The Groovy original checked?.enabled; the check was lost when the documentation build moved to Java (#15350, in 10.6.0 via #16592). - Adding
&& t.getEnabled()to that filter removes exactly this one line from the page; nothing else changes.
Every reader of the 10.6.0 documentation front page, and of documentation builds of main, branch_11x and branch_10_6, who clicks benchmark-jmh gets a missing page. Nothing else breaks: no code, API or index effect, and no setting is involved. It is one link of 32, to an internal micro-benchmark module, so priority is low.
Mechanism, terms and numbers391 words
The documentation front page (docs/index.html) has an "API Javadocs" list with one link per module. In 10.6.0 it lists 32 modules; 10.5.2 listed 31. The extra entry, benchmark-jmh/index.html on line 59, leads to a page that a standard documentation build does not write: lucene/benchmark-jmh/build.gradle disables the module's renderSiteJavadoc task on purpose, and the 10.6.0 binary archive has no docs/benchmark-jmh/ folder.
The list comes from MarkdownTemplateTask.withProjectList() in DocumentationConfigPlugin. Its javadoc says it lists "all subprojects with javadocs", but its filter keeps every :lucene subproject that has a task named renderSiteJavadoc, enabled or not. The Groovy version it replaced (up to 10.5.2) kept only subprojects whose task is enabled. #15350 dropped that check when it moved the documentation scripts to Java (main, 2025-10-22); the backport #16592 brought it into 10.6.0. benchmark-jmh has the task at all only because its exclusion from the published projects is spelled :lucene:benchmarks-jmh, so it never matches; until the port the enabled filter hid that.
It is a documentation defect only: code, APIs and indexes are not affected. The fix is one condition, && t.getEnabled(), which removes exactly the benchmark-jmh line.
DocumentationConfigPlugin.java:256:createDocumentationIndexcallstask.withProjectList(), which fills${projectList}under "## API Javadocs" inlucene/documentation/src/markdown/index.template.md:65-67.DocumentationConfigPlugin.java:344-347, the method's javadoc:adds a property "projectList" containing all subprojects with javadocs as markdown bullet list.DocumentationConfigPlugin.java:355-363, the filter:.filter(p -> p.getTasks().matching(t -> t.getName().equals("renderSiteJavadoc")).stream().findAny().isPresent()). It checks that the task exists, not that it is enabled. Lines 370-385 turn each kept module into**[name](path/index.html):** description.RenderJavadocPlugin.java:143-150registersrenderSiteJavadocfor every published project except:lucene:luke; it writes to the documentation root plus the module path (:180-185).RegisterBuildGlobalsPlugin.java:111-115excludes":lucene:misc:native", ":lucene:spatial-test-fixtures", ":lucene:benchmarks-jmh"from the published projects. The module islucene:benchmark-jmh(settings.gradle:67), so the exclusion never matches and the module gets the task.lucene/benchmark-jmh/build.gradle:40-49disablesrenderSiteJavadocandrenderJavadoc("// No special javadocs for JMH benchmarks.",it.enabled = false). The task is SKIPPED and writes nothing.- The Groovy original, 10.5.2
gradle/documentation/markdown.gradle:152-155, same javadoc:def projects = productProject.subprojects.findAll{ it.tasks.findByName('renderSiteJavadoc')?.enabled }.
A Gradle build model over all 32 :lucene subprojects that have the task: listed 32, rendered 31, listed-not-rendered [benchmark-jmh], rendered-not-listed [], on main, branch_11x and branch_10_6. benchmark-jmh is the only module with the task disabled, so it is the only wrong entry.
Exposure and likelihood173 words
- Who sees it: readers of
docs/index.htmlin the 10.6.0 binary release and of every documentation build of main, branch_11x and branch_10_6 (the 10.6.1 line). The 10.6.0 site copy was committed to the site repository on 2026-10-30 with the same line and nobenchmark-jmh/folder;https://lucene.apache.org/core/10_6_0/index.htmlstill returned 404 on 2026-11-02, so the dead link goes live when that copy is served. - Default, not opt-in: the standard documentation build produces it; no setting or input is involved.
- Scale: one of 32 module links. A check of all 46 relative links of the shipped 10.6.0 front page against the archive finds exactly two missing targets: this one and the File Formats link of #16939 (already fixed by #16941). 10.5.2: 45 relative links, none missing.
- Severity: low. The entry is the javadoc page of an internal micro-benchmark module with no API that users code against, and the failure is a plain "page not found".
- Release line: branch_10_6 (the 10.6.1 line) still has it, while the related fix #16941 was backported there.
One plain JUnit 4 test, one method, nothing random. It reads index.html of the documentation tree given as -Ddocs.dir and asserts that every module link resolves to a file in that tree. Build the docs, then run it: it fails on main and on the 10.6.0 docs, and passes with the fix.
package org.apache.lucene;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.regex.Pattern;
import org.junit.Test;
public class TestFrontPageJavadocLinks {
// Expected: every "API Javadocs" link in index.html exists in -Ddocs.dir; actual: benchmark-jmh/index.html is missing.
@Test
public void testListedModuleJavadocsExist() throws Exception {
Path docs = Path.of(System.getProperty("docs.dir"));
String index = Files.readString(docs.resolve("index.html"));
List<String> links =
Pattern.compile("<strong><a href=\"([^\"]+)\">").matcher(index).results().map(m -> m.group(1)).toList();
assertTrue(links.size() > 0);
assertEquals(List.of(), links.stream().filter(l -> Files.isRegularFile(docs.resolve(l)) == false).toList());
}
}
cd $LUCENE && ./gradlew :lucene:documentation:documentation && cp $REPRO/TestFrontPageJavadocLinks.java lucene/core/src/test/org/apache/lucene/ && ./gradlew :lucene:core:test --tests org.apache.lucene.TestFrontPageJavadocLinks -Ptests.seed=DEADBEEF -Ptests.asserts=true "-Ptests.jvmargs=-Ddocs.dir=$PWD/lucene/documentation/build/site"
- Expected
- The test passes: every "API Javadocs" link resolves to a page in the documentation tree.
- Observed
AssertionError: expected:<[]> but was:<[benchmark-jmh/index.html]>: the page links a folder the build never writes.
More files, environment, full output392 words
No Lucene API is involved, so the documentation tree passed in decides the result; the seed and -ea/-da cannot change it. The package only gives the file a home in lucene/core's tests. -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, so check would fail in checkLicenses with it in the tree.
For the 10.6.0 release, point docs.dir at the extracted lucene-10.6.0/docs: same failure. The 10.5.2, 10.0.0 and 9.12.3 release docs pass. The 10.6.0 and 10.5.2 runs read the release's index.html plus its module index pages, taken from the sha512-verified archive (everything this test reads); the 10.0.0 and 9.12.3 runs read full docs/ trees.
No regression test is suggested for Lucene's suite: the check needs a built documentation tree, which unit tests do not have. If maintainers want a guard, it is this same check run on the built site, or the link checker whose loss Uwe Schindler noted on #16939.
| lucene | main `e1faeba08bde` (full documentation build) and the 10.6.0 release docs: fail; main with the fix, and the 10.5.2, 10.0.0 and 9.12.3 release docs: pass |
|---|---|
| jdk | OpenJDK 25.0.3 |
| os | Linux aarch64 (the only platform run) |
cd $LUCENE # main, branch_11x or branch_10_6
./gradlew :lucene:documentation:documentation
cp $REPRO/TestFrontPageJavadocLinks.java lucene/core/src/test/org/apache/lucene/
./gradlew :lucene:core:test --tests org.apache.lucene.TestFrontPageJavadocLinks -Ptests.seed=DEADBEEF -Ptests.asserts=true "-Ptests.jvmargs=-Ddocs.dir=$PWD/lucene/documentation/build/site"
# same failure with -Ptests.asserts=false
# gradle on a scratch worktree of main e1faeba08bde, seed DEADBEEF, -Ptests.asserts=true (identical with false)
> Task :lucene:core:test FAILED
TestFrontPageJavadocLinks > testListedModuleJavadocsExist FAILED
java.lang.AssertionError: expected:<[]> but was:<[benchmark-jmh/index.html]>
at org.junit.Assert.fail(Assert.java:89)
at org.junit.Assert.failNotEquals(Assert.java:835)
at org.junit.Assert.assertEquals(Assert.java:120)
at org.junit.Assert.assertEquals(Assert.java:146)
at org.apache.lucene.TestFrontPageJavadocLinks.testListedModuleJavadocsExist(TestFrontPageJavadocLinks.java:21)
:lucene:core:test (FAILURE): 1 test, 1 failure
BUILD FAILED
# the documentation build it ran on
> Task :lucene:benchmark-jmh:renderSiteJavadoc SKIPPED (the other 31 renderSiteJavadoc tasks ran)
index.html:59 <li><strong><a href="benchmark-jmh/index.html">benchmark-jmh</a>:</strong> Lucene JMH micro-benchmarking module</li>
site top level: no benchmark-jmh/ entry
# the same test through the standalone JUnit runner, seed DEADBEEF (the test has no randomness)
# main e1faeba08bde docs build: FAIL 1/1 with -ea and -da; with the fix, rebuilt: PASS with -ea and -da
# 10.6.0 release docs (index.html + module index pages): FAIL 1/1 with -ea and -da (line 59 is identical; the archive has no docs/benchmark-jmh/)
# 10.5.2 release docs (same subset), 10.0.0 and 9.12.3 release docs: PASS with -ea and -da- The method's own javadoc says the list holds "all subprojects with javadocs"; benchmark-jmh turns its javadocs off on purpose.
- The Groovy build up to 10.5.2 listed only modules whose task is enabled; the Java port (#15350) dropped that check without saying so.
- The maintainer fixed and backported a sibling wrong link on the same page from the same port (#16939).
The full argument211 words
- The contract:
DocumentationConfigPlugin.java:345: "all subprojects with javadocs".benchmark-jmh/build.gradle:43: "No special javadocs for JMH benchmarks." - Disabling the task is how a module leaves the site. PR #120 (LUCENE-9947): "This excludes Javadocs of luke module from the documentation site by explicitly disable \"renderSiteJavadoc\" task for it. While removing the link to javadocs, ...". The Groovy
?.enabledfilter (since LUCENE-9321,06df50e759a, 2020) is what made that work. - A port, not a redesign. #15350 and #16592 carried over the link format, descriptions, core styling and sort keys, minus one dead sort key (the Groovy sort also put a
solrjmodule right aftercore, 10.5.2markdown.gradle:157; Lucene has no such module). The only change to which modules are listed is the dropped?.enabled. No PR text, commit message, CHANGES or MIGRATE entry mentions which modules are listed. - No test covers it, and, as Uwe Schindler pointed out on #16939, #14905 removed the link checker, so "the markdown files on top level were no longer checked for incorrect links". That is why it went unnoticed, not the defect.
- Precedent: #16939 ("We should fix this, but respin not needed."), the wrong File Formats link on the same page from the same port, fixed by #16941 and backported to branch_10_6.
The devil's-advocate check128 words
Strongest case for "intended": the port redefined "rendered" as "has the task". In the Java build luke is kept off the site by not registering the task at all (RenderJavadocPlugin.java:145), and #15350 allowed "some minor tweaks here and there". A second reading: the real cause is the old :lucene:benchmarks-jmh typo.
Why it fails: the method's javadoc still says "with javadocs", benchmark-jmh's build still disables the task to keep its javadocs out, nothing announces a change, and no reading makes a link to a folder the same build never writes intended. The typo dates from 10.0.0 and was harmless to the front page until the port dropped the filter (10.0.0 and 10.5.2 list 31 modules); it offers a second fix site, not an intended behaviour.
Recommended Keep only modules whose renderSiteJavadoc task is enabled (validated)
Add && t.getEnabled() to the renderSiteJavadoc filter in withProjectList(). Validated on main: the rebuilt page loses only the benchmark-jmh line, the test passes with assertions on and off, and build-infra's format, lint and forbidden-API checks pass. The same diff applies to branch_11x and branch_10_6 (on branch_10_6 with an 8-line offset).
@@ -357,7 +357,10 @@
p ->
p
.getTasks()
- .matching(t -> t.getName().equals("renderSiteJavadoc"))
+ .matching(
+ t ->
+ t.getName().equals("renderSiteJavadoc")
+ && t.getEnabled())
.stream()
.findAny()
.isPresent())All options and trade-offs3 options ยท 440 words
One condition in the build tooling restores what the Groovy build did. The alternative, correcting the benchmarks-jmh spelling, would also change what is published, so it is a separate question.
DocumentationConfigPlugin.java:360 on main e1faeba08bde and on branch_11x, line 368 on branch_10_6; the same diff applies to both (git apply places the hunk 8 lines lower on branch_10_6). It restores the Groovy semantics and matches the method's javadoc.
@@ -357,7 +357,10 @@
p ->
p
.getTasks()
- .matching(t -> t.getName().equals("renderSiteJavadoc"))
+ .matching(
+ t ->
+ t.getName().equals("renderSiteJavadoc")
+ && t.getEnabled())
.stream()
.findAny()
.isPresent())Trade-offs
None seen in the recorded builds. The enabled flag is set while the build is configured (configureEach in benchmark-jmh/build.gradle); the list is computed later, when createDocumentationIndex resolves its binding, so the check sees the final value, as the regenerated page shows. Like the Groovy ?.enabled, getEnabled() reads only that flag: an enabled task skipped for another reason (an onlyIf condition, say) would still be listed. On main today that changes nothing: with the fix, listed = rendered = 31 in the build model.
What the checks validated
In scratch worktrees of e1faeba08bde, OpenJDK 25.0.3, 2026-11-02:
- stock:
:lucene:documentation:documentationsucceeds, benchmark-jmh's task is SKIPPED, no folder, link on line 59; the minimal test fails through gradle (assertions on and off) and the standalone JUnit runner (-ea,-da); - with the diff: the rebuilt
index.htmldiffers from stock by exactly the removed benchmark-jmh line; the site's top-level listing is identical; the minimal test passes through gradle (assertions on and off) and the standalone JUnit runner (-ea,-da); ./gradlew :build-tools:build-infra-shadow:checkwith only the diff applied: BUILD SUCCESSFUL (compile, checkGoogleJavaFormat, ecjLint, forbiddenApis, validatePlugins, checkLicenses). build-infra has no test sources, so the rebuild plus the minimal test is the functional check.- The finder and an independent reproducer got the same one-line page difference on their own builds.
RegisterBuildGlobalsPlugin.java:114. benchmark-jmh would then get no renderSiteJavadoc task and drop off the list.
Trade-offs
It also makes benchmark-jmh unpublished: lucene-benchmark-jmh, on Maven Central for 10.0.0 to 10.6.0, would stop being published, and the binary distribution's modules/ would change. Whether that artifact should be published is a separate question for maintainers, and the filter would stay wrong for any other module that disables the task.
#14905 removed it, as Uwe Schindler noted on #16939.
Trade-offs
Would have caught this and #16939, but it is a larger change than this bug needs; a guard, not the fix.
Non-formal. Following Uwe Schindler's remark on #16939 that no link checker runs since #14905, a finder compared the Java documentation build with the Groovy one it replaced and saw the benchmark-jmh entry on the generated page and in the 10.6.0 release docs. A build model and a check of every front-page link confirmed it.
The method in full204 words
- First signal: a lead that took up Uwe Schindler's remark on #16939 (#14905 removed the link checker for the top-level pages) compared
withProjectListwith the Groovy filter and saw the benchmark-jmh entry in acreateDocumentationIndexbuild of main and in the 10.6.0 release docs. - Re-derived by a hunt unit: a Gradle init script over the real build computed the listed and the rendered modules for all 32
:lucenesubprojects that have the task (listed minus rendered =[benchmark-jmh], rendered minus listed =[], on main, branch_11x and branch_10_6); all 46 relative links of the shipped 10.6.0 front page were checked against the archive listing (2 missing: this one and #16939's); a line-by-line comparison of the Groovy documentation scripts with the Java port found one more defect on the same page, the Migration Guide line naming Lucene "0.x". - Verification: an independent reproducer ran a full documentation build of main, an independent reviewer from another model family (OpenAI GPT-5.6) ran a refute lens and an intended lens, and an intended-behaviour devil's advocate searched for a reason it could be intended; all called it real, and an adjudication confirmed it (high). The repro was then reduced to one test with one assertion.
No public report found (2026-11-02: two query sets of 51 queries over GitHub, commits, downstream projects, mailing lists and JIRA; 27 manual GitHub searches; all 410 open PRs' file lists; rechecked the same day). Nearest: #16939, a different wrong link on the same page.
Searches2 searches
Nobody has reported the benchmark-jmh entry, the dropped enabled check in withProjectList or the :lucene:benchmarks-jmh spelling.
Related, not this bug: #16939 (Uwe Schindler, 2026-10-29), the wrong File Formats link on the same page from the same port, with a different root cause (the default-codec regex), fixed by #16941; its comments cover only the regex and the removed link checker, and its screenshot ends above the module list. #15350 and #16592 (the introducing PRs) do not discuss which modules are listed. #14905 removed the link checker. PR #120 (LUCENE-9947) is background. Tracking issue #16937 does not mention this bug.
| Where | When | How | Found |
|---|---|---|---|
| GitHub issues, PRs and commits (apache/lucene incl. the migrated JIRA archive), downstream repositories, dev@/java-user@/issues@/commits@, JIRA, the web | 2026-11-02 | scripted prior-report search, two query sets of 51 queries (class and method names, renderSiteJavadoc, benchmarks-jmh, index.template.md, the module description, dead link / 404 phrasings); 27 manual GitHub searches incl. every issue created and PR updated since 2026-10-29; the file lists of all 410 open PRs; the three branch heads; all 29 mails of the 10.6.0 release threads | nothing reporting this defect; nearest #16939 / #16941 |
| apache/lucene upstream (GitHub API) | 2026-11-02 (registration check, then this doc) | issues and PRs for benchmark-jmh created since 2026-11-01/02, withProjectList, renderSiteJavadoc updated since 2026-11-01, getEnabled renderSiteJavadoc; commits to DocumentationConfigPlugin.java on main, branch_11x and branch_10_6 since 2026-10-29 | nothing new; the only commit is #16941 (the codec regex); the filter is unchanged on main |
Introduced on main by #15350 (a0bd3c5f3c6, 2025-10-22) and in 10.6.0 by its backport #16592 (f6fce7e42c5, 2026-09-05). Latent since 10.0.0, when benchmark-jmh arrived with its task disabled and the misspelt exclusion, but hidden by the Groovy filter. Only 10.6.0 is affected among releases so far (no 10.6.1 tag upstream on 2026-11-02).
Versions tested6 rows
git log -S "renderSiteJavadoc')?.enabled" shows exactly two removals of the Groovy filter, a0bd3c5f3c6 on main and f6fce7e42c5 on branch_10x; both parents still have it. #12663 (603cd41ca1a, 2023-10-12, first released in 10.0.0) added lucene/benchmark-jmh with renderSiteJavadoc disabled and the exclusion spelled :lucene:benchmarks-jmh. The filter is unchanged on main, branch_11x and branch_10_6 as of 2026-11-02.
| Version or commit | Verdict | Result |
|---|---|---|
10.6.0 (4ae946e5a9b, released 2026-10-29) | affected | the test fails 1 of 1 on the release's docs (-ea, -da); line 59 links benchmark-jmh/index.html, the archive has no docs/benchmark-jmh/ |
main e1faeba08bde | affected | full documentation build: task SKIPPED, no folder, link on line 59; the test fails through gradle and the standalone JUnit runner |
branch_11x da3ea39fa59, branch_10_6 91eaab4fb29 | build model | build model and a createDocumentationIndex run: listed minus rendered = [benchmark-jmh]; filter unchanged on today's heads |
| 10.0.0 to 10.5.2 | not affected | the Groovy enabled filter skips benchmark-jmh; 31 modules listed; the test passes on 10.0.0 and 10.5.2 (-ea, -da) |
| 9.x | module absent | no benchmark-jmh module; the test passes on 9.12.3 (-ea, -da) |
main e1faeba08bde + fix | not affected | the page loses only the benchmark-jmh line; the test passes |
Confirmed (high) by an adjudication after an independent reproducer, a reviewer from another model family (refute and intended lenses) and an intended-behaviour devil's advocate all called it real; re-run for this doc through gradle and the standalone JUnit runner on fresh documentation builds of main, with and without the fix.
Checks and verdicts390 words
Every verifier ran a failing check on the 10.6.0 or main documentation and a passing one on 10.5.2 or on the fixed build. The credibility audit lowered the impact rating: the dead entry is the javadoc page of an internal micro-benchmark module.
| Check | Verdict | What it found |
|---|---|---|
| Finder (build model, front-page link check, one-test JUnit) | reproduced (documentation) | Listed minus rendered = [benchmark-jmh] on main, branch_11x and branch_10_6; 2 of 46 front-page links missing in 10.6.0 (this and #16939's); the fix removes only that line. |
| Cross-model review, intended lens (OpenAI GPT-5.6) | real (high) | Its own test reproduced the dead link; the intended-behaviour case is weak. |
| Independent reproducer | real | Full documentation build of main; own test fails -ea/-da and passes after the fix; own sha512-verified 10.6.0 download fails, 10.5.2 and 10.0.0 pass. |
| Cross-model refute review (OpenAI GPT-5.6, refute lens) | real (high) | Own test fails on the main-built page and the 10.6.0 docs, passes on 10.5.2 and the fixed page; the "task existence as module metadata" reading is weak. |
| Intended-behaviour devil's advocate | real | No intended, documented, misuse or unreachable argument survives; re-downloaded the 10.6.0 archive (sha512 matches). |
| Adjudication | confirmed (high), minor, Low | Re-ran the independent reproduction's test with another seed: fails on 10.6.0 docs with -ea and -da, passes on 10.5.2. |
| Credibility audit | real and new; impact lowered | The dead link is to a rarely used module. The minimal repro fails on a fresh main documentation build and passes with the fix. |
| This doc's re-run | reproduced; fix validated | Fresh worktree: stock fails (gradle, both assertion modes; standalone JUnit runner -ea/-da); fixed passes; build-infra's checks pass with the fix. |
| Independent fact and diagram checks of this doc | reproduced; corrections applied | An independent fact check re-ran the doc's commands in a fresh worktree (documentation build, gradle test with assertions on and off, the fix) and the minimal test on the 10.6.0, 10.5.2, 10.0.0 and 9.12.3 docs; a second one, by another model family (OpenAI GPT-5.6), re-read the sources and logs. Both found the bug as described. Their corrections (the branch_10_6 line number, a dead solrj sort key the port also dropped, which runs used which seed and docs tree) are applied. The diagram check passed; one caption word was changed and the diagram re-rendered. |
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.
- PNG 348 KB
Finding record, Lucene and upstream sources, repro files and diagram notes1,241 words
- Registry title
- The documentation front page's 'API Javadocs' list links benchmark-jmh/index.html, a page no build renders: the Java port of the documentation build (#15350, backported by #16592) lists every module that has a renderSiteJavadoc task, while the Groovy build it replaced listed only modules whose task is enabled (dead link in the released 10.6.0 docs and in documentation builds of main, branch_11x and branch_10_6; documentation defect)
- Area
- build-tools / documentation build (DocumentationConfigPlugin.MarkdownTemplateTask.withProjectList: the 'API Javadocs' list of the documentation front page docs/index.html)
- Priority
- Low, rank 1289: Documentation only: the released 10.6.0 documentation front page and later documentation builds link a benchmark-jmh javadoc page that is never built. A reader who clicks it gets a 404, with no code effect and no misleading API text.
- Impact class
- minor
- Impact note
- Documentation only, with no runtime effect: every reader of the documentation front page (docs/index.html) of the 10.6.0 binary release, of every documentation build of main, branch_11x and branch_10_6 (the 10.6.1 line), and of the 10.6.0 site copy once it is served, sees benchmark-jmh listed as one of 32 'API Javadocs' modules, and following that link gives a missing page (404); code, APIs and indexes are not affected, no setting or input is involved, and 10.5.2 and earlier releases are not affected.
- Summary
- You open the front page of the Lucene 10.6.0 documentation (docs/index.html in the binary release, or a documentation build of main) and click benchmark-jmh in its 'API Javadocs' list. You expect that module's javadocs, as for the other 31 entries; instead the page does not exist, because benchmark-jmh's build disables its site javadocs ('No special javadocs for JMH benchmarks') and the Java port of the documentation build lists every module that has a renderSiteJavadoc task without checking that the task is enabled, which the Groovy build up to 10.5.2 did. Adding '&& t.getEnabled()' to that filter removes exactly this entry and nothing else.
- Introduced
- a0bd3c5f3c6 (apache/lucene#15350 'Move documentation gradle scripts to java', by dweiss, merged 2025-10-22, main) and its branch_10x backport f6fce7e42c5 (#16592 'Build infra modernization (backport)', by dweiss, merged 2026-09-05; the commit that put it in 10.6.0) [read: git log -S on the Groovy filter findByName('renderSiteJavadoc')?.enabled shows exactly these two removals, git blame of the Java filter points at them, and both parents still have the Groovy filter; neither PR text mentions changing which modules are listed] [exec: the 10.5.2 release docs pass and the 10.6.0 release docs fail]. Latent condition older than the bug: #12663 (603cd41ca1a, 2023-10-12, first released in 10.0.0) added lucene/benchmark-jmh with renderSiteJavadoc disabled and a published-project exclusion spelled ':lucene:benchmarks-jmh', so the module counts as published and gets the (disabled) task; in 10.0.0-10.5.2 the Groovy enabled filter hid it [exec: 10.0.0 and 10.5.2 front pages list 31 modules, no benchmark-jmh]. (2025-10-22 (a0bd3c5f3c6, author date = commit date 2025-10-22T14:08:45Z) on main; 2026-09-05 (f6fce7e42c5, author date = commit date 2026-09-05T09:48:44Z) on branch_10x)
- First affected version
- 10.6.0 [exec] (released 2026-10-29, revision 4ae946e5a9b: the test fails on the docs/ of the sha512-verified lucene-10.6.0.tgz, -ea and -da; 10.5.2 passes)
- Affected versions
- 10.6.0 (released 2026-10-29) [exec: fails with -ea and -da on the release's docs/, both the full extracted tree (the independent reproduction, the intended-behaviour check's own download) and the finder's module-index subset; the archive has no docs/benchmark-jmh/ entry, only modules/lucene-benchmark-jmh-10.6.0.jar]; unreleased main 12.0.0-SNAPSHOT [exec: the independent reproduction's full :lucene:documentation:documentation Gradle build of e1faeba08bde logs ':lucene:benchmark-jmh:renderSiteJavadoc SKIPPED', writes no benchmark-jmh/ folder and links benchmark-jmh/index.html on index.html line 59; the test fails on that tree with -ea and -da; read: the filter is unchanged at origin/main 254ce48660d, last commit on the file 716d6f216f5 (#16941)], branch_11x [exec: finder's createDocumentationIndex run and build model at da3ea39fa59; read: unchanged at 30abcb74db7] and branch_10_6, the 10.6.1 line [exec: build model at 91eaab4fb29; read: unchanged at facfa0d52c9, last commit on the file 7e5aec4370e (#16941)]. Not affected: 10.0.0 to 10.5.2 [exec: 10.0.0 and 10.5.2 pass with -ea and -da; read: the Groovy enabled filter at every tag] and 9.x [exec: 9.12.3 passes; 9.x has no benchmark-jmh module].
- Status
- documented (brief, checks and a per-finding doc exist)
- Verification
- Confirmed by AI-run checks: an independent repro, a cross-model review that agreed, 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-11-02: two scripted prior-report searches over GitHub issues and PRs (including the migrated JIRA archive), commits, downstream repositories, dev@/java-user@/issues@/commits@ and JIRA; 27 manual GitHub searches (23 on apache/lucene, 4 on other repositories); the file lists of all 410 open PRs; the branch heads; all 29 mails of the 10.6.0 release threads; web search; a recheck the same day: no new issue or PR, none of the 17 PRs updated in the last 48 h touches the fix-site files, and the fix site is unchanged on main, branch_11x and branch_10_6). Nearest, not this bug: #16939 (Uwe Schindler, 2026-10-29), the wrong File Formats link on the same page from the same port, with a different root cause (the default-codec regex), fixed by #16941 (main 716d6f216f5, branch_11x 3385099e0d6, branch_10_6 7e5aec4370e); its comments cover only the regex and the removed link checker (#14905), and its screenshot ends above the module list. The introducing PRs #15350 and #16592 do not discuss which modules are listed.
- Lucene commit tested
- Main
e1faeba08bde(12.0.0-SNAPSHOT), 2026-11-02: full documentation builds in a scratch worktree with and without the fix; the minimal test through gradle (assertions on and off) and the standalone JUnit runner (-ea,-da);:build-tools:build-infra-shadow:checkwith the fix. The 10.6.0, 10.5.2, 10.0.0 and 9.12.3 release docs (sha512-verified binary archives; for 10.6.0 and 10.5.2 the front page plus the module index pages) through the standalone JUnit runner,-eaand-da. A Gradle build model on main, branch_11xda3ea39fa59and branch_10_691eaab4fb29. OpenJDK 25.0.3, Linux aarch64.
- Finding record
build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/documentation/DocumentationConfigPlugin.java:344-368 (withProjectList, javadoc 'all subprojects with javadocs', filter without an enabled check)lucene/benchmark-jmh/build.gradle:40-49 ('No special javadocs for JMH benchmarks', renderSiteJavadoc and renderJavadoc disabled)build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/globals/RegisterBuildGlobalsPlugin.java:111-116 (exclusion spelled ':lucene:benchmarks-jmh')build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/java/RenderJavadocPlugin.java:143-150 (renderSiteJavadoc registered for every published project except luke)a Lucene clone releases/lucene/10.5.2:gradle/documentation/markdown.gradle:155 (Groovy filter findAll{ it.tasks.findByName('renderSiteJavadoc')?.enabled })https://github.com/apache/lucene/issues/16939 (Uwe Schindler's comment of 2026-10-29 on the link checker removed by #14905)
- The finding in 30 seconds
build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/documentation/DocumentationConfigPlugin.java:256, 344-389 (createDocumentationIndex calls withProjectList; javadoc; filter at 355-363, matching at 360; link format 370-385)lucene/documentation/src/markdown/index.template.md:65-67 ('## API Javadocs', ${projectList})build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/java/RenderJavadocPlugin.java:143-150, 180-185 (renderSiteJavadoc registration and output directory)build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/globals/RegisterBuildGlobalsPlugin.java:111-115 (exclusion spelled ':lucene:benchmarks-jmh')settings.gradle:67 (include "lucene:benchmark-jmh")lucene/benchmark-jmh/build.gradle:40-49 (renderSiteJavadoc and renderJavadoc disabled)a Lucene clone releases/lucene/10.5.2:gradle/documentation/markdown.gradle:152-155 (Groovy filter on ?.enabled)https://github.com/apache/lucene/pull/120 (LUCENE-9947, body: disabling renderSiteJavadoc keeps luke off the site and removes its link)
- Why it looks unintended
build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/documentation/DocumentationConfigPlugin.java:345 (javadoc)lucene/benchmark-jmh/build.gradle:43 (comment)https://github.com/apache/lucene/pull/120 (body)https://github.com/apache/lucene/issues/16939 (issue body; Uwe Schindler's comment of 2026-10-29 on #14905 and the link checker)a Lucene clone releases/lucene/10.5.2:gradle/documentation/markdown.gradle:156-159 (sort keys incl. the solrj key at :157) vs build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/documentation/DocumentationConfigPlugin.java:364-367
- Suggested fix
build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/globals/RegisterBuildGlobalsPlugin.java:114lucene/benchmark-jmh/build.gradle:40-49
- Prior reports
https://github.com/apache/lucene/issues/16939 (body and comments, read 2026-11-02)
- History
a Lucene clone releases/lucene/10.5.2:gradle/maven/publications.gradle:45 (':lucene:benchmarks-jmh'); releases/lucene/10.0.0:lucene/benchmark-jmh/build.gradle (task disabled)
- Diagrams
build-tools/build-infra/src/main/java/org/apache/lucene/gradle/plugins/documentation/DocumentationConfigPlugin.java:355-363; a Lucene clone releases/lucene/10.5.2:gradle/documentation/markdown.gradle:155
- TestFrontPageJavadocLinks.java (one test class):
repro/LFV-1087/TestFrontPageJavadocLinks.java(23 lines)
Made from the generated front page, the build log, the minimal repro and the code at e1faeba08bde.
assets/LFV-1087/bug.png(348 KB)
