Skip to content

Add "View background tasks" to Help menu; descriptive quit dialog buttons - #771

Open
koppor wants to merge 19 commits into
mainfrom
help-background-tasks
Open

koppor wants to merge 19 commits into
mainfrom
help-background-tasks

Conversation

@koppor

@koppor koppor commented Sep 22, 2026

Copy link
Copy Markdown
Member

Summary

Running background tasks could only be inspected by trying to quit JabRef. The Help menu now offers "View background tasks", and the quit dialog uses the descriptive buttons "Quit anyway" and "Keep JabRef open" instead of "Yes" and "Cancel".

Steps to test

  1. Enable AI and open the "AI summary" tab of an entry with a PDF.

  2. Choose Help > View background tasks: the summary task is listed.

    Background tasks dialog

  3. Close that dialog and press Ctrl+Q while the task runs: the dialog offers "Keep JabRef open" (stays open) and "Quit anyway" (quits).

    Quit dialog

Related issues and pull requests

Refs JabRef#12706

AI usage

Claude Code (model claude-opus-5), AIL3.

AI CHECKLIST.md walkthrough

1. Code self-review

  • [/] No == null / != null checks
  • [/] No Objects.requireNonNull(...)
  • [/] New classes annotated with @NullMarked
  • [/] New packages annotated with @NullMarked
  • Optional consumed with ifPresent / map / ... — never isPresent() + get()
  • [/] StringUtil.isBlank(...)
  • [/] No catch (Exception e)
  • [/] No throw new RuntimeException(...)
  • [/] Logged exceptions as last logger argument
  • [/] BibEntry withers
  • [/] Modern Java
  • [/] Precompiled regexes
  • Alphabetical ordering kept (menu order is semantic)
  • [/] BackgroundTask for background work
  • No commented-out code, no trivial comments
  • Markdown Javadoc syntax
  • All user-facing text localized
  • Sentence case
  • [/] Placeholders for variance
  • [/] HTML escaping
  • [/] Tests for org.jabref.model / org.jabref.logic changes (GUI only)
  • [/] Test style
  • [/] Fetcher tests

2. Verification commands

  • LocalizationConsistencyTest (instead of full :jablib:check; GUI-only change)
  • ./gradlew :jabgui:checkstyleMain
  • ./gradlew modernizer (left to CI)
  • ./gradlew --no-configuration-cache :rewriteDryRun (left to CI)
  • ./gradlew javadoc (left to CI)
  • [/] markdownlint / textlint / intellij-format

3. Documentation

4. Pull request

  • PR body built from template, every section filled
  • All checklist items kept and marked
  • "Steps to test" numbered with screenshots
  • HTML comments removed
  • Created with gh pr create --body-file
  • [/] TODO placeholder in CHANGELOG

Checklist

  • I own the copyright of the code submitted and I license it under the MIT license
  • If AI tools were used, I disclosed them in the "AI usage" section and reviewed, understood, and take full ownership of all AI-generated code
  • I manually tested my changes in running JabRef (always required)
  • [/] I added JUnit tests for changes (if applicable)
  • I added screenshots in the PR description (if change is visible to the user)
  • I added one sentence (max 20 words) to CHANGELOG.md describing the change from the user's point of view (if the change is visible to the user)
  • I checked the user documentation for up to dateness and submitted a pull request to our user documentation repository

🤖 Generated with Claude Code

koppor and others added 2 commits September 22, 2026 14:13
…tons

Refs JabRef#12706

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
koppor and others added 15 commits September 22, 2026 12:50
* Link selected auto-found file on "+" in the File field

Pressing "+" with an automatically found, not yet linked file selected now links that file directly instead of opening the "Add file link" dialog.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T5ibD7MmLqVmjTFkqipStf

* Link PR in changelog

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T5ibD7MmLqVmjTFkqipStf

---------

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
…abRef#17239)

* Label new issues "status: needs-triage" and block /assign-me on them

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Fix YAML syntax of decline step

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
* Make case-sensitive search work in linked files

The Lucene index for linked files only kept the lowercased, stemmed text,
so `=!`, `==!` and `=~!` silently matched every spelling. Contents and
annotations are now additionally indexed case-preserving, and case-sensitive
comparisons are routed to those fields.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PTgPLMjHLxC6CHZAZy62jk

* Fix formatting

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PTgPLMjHLxC6CHZAZy62jk

* Say casing in CHANGELOG entry

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PTgPLMjHLxC6CHZAZy62jk

* Stop re-exporting Lucene highlighter

SearchResult no longer exposes a Highlighter in its API.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PTgPLMjHLxC6CHZAZy62jk

* Update SqlBasedLibrarySearcherWithBibFilesTest.java

* Update InMemoryLuceneSearchBackendTest.java

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com>
* New translations jabref_en.properties for (French)

* New translations jabref_en.properties for (Spanish)

* New translations jabref_en.properties for (Arabic)

* New translations jabref_en.properties for (Danish)

* New translations jabref_en.properties for (German)

* New translations jabref_en.properties for (Greek)

* New translations jabref_en.properties for (Finnish)

* New translations jabref_en.properties for (Italian)

* New translations jabref_en.properties for (Japanese)

* New translations jabref_en.properties for (Korean)

* New translations jabref_en.properties for (Dutch)

* New translations jabref_en.properties for (Norwegian)

* New translations jabref_en.properties for (Polish)

* New translations jabref_en.properties for (Portuguese)

* New translations jabref_en.properties for (Russian)

* New translations jabref_en.properties for (Swedish)

* New translations jabref_en.properties for (Turkish)

* New translations jabref_en.properties for (Ukrainian)

* New translations jabref_en.properties for (Chinese Simplified)

* New translations jabref_en.properties for (Chinese Traditional)

* New translations jabref_en.properties for (Vietnamese)

* New translations jabref_en.properties for (Portuguese, Brazilian)

* New translations jabref_en.properties for (Indonesian)

* New translations jabref_en.properties for (Persian)

* New translations jabref_en.properties for (Tagalog)
…-specobject (JabRef#17248)

Bumps [org.itsallcode.openfasttrace:openfasttrace-exporter-specobject](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace-exporter-specobject
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…Ref#17244)

Bumps [org.itsallcode.openfasttrace:openfasttrace-api](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace-api
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…17243)

Bumps [org.itsallcode.openfasttrace:openfasttrace](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…-specobject (JabRef#17245)

Bumps [org.itsallcode.openfasttrace:openfasttrace-exporter-specobject](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace-exporter-specobject
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…Ref#17249)

Bumps [org.itsallcode.openfasttrace:openfasttrace-api](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace-api
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…17247)

Bumps [org.itsallcode.openfasttrace:openfasttrace](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…bRef#17246)

Bumps [org.itsallcode.openfasttrace:openfasttrace-core](https://github.com/itsallcode/openfasttrace) from 4.9.0 to 4.10.0.
- [Release notes](https://github.com/itsallcode/openfasttrace/releases)
- [Commits](itsallcode/openfasttrace@4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: org.itsallcode.openfasttrace:openfasttrace-core
  dependency-version: 4.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…#17252)

Bumps [org.hibernate.validator:hibernate-validator](https://github.com/hibernate/hibernate-validator) from 9.1.3.Final to 9.1.4.Final.
- [Release notes](https://github.com/hibernate/hibernate-validator/releases)
- [Changelog](https://github.com/hibernate/hibernate-validator/blob/9.1.4.Final/changelog.md)
- [Commits](hibernate/hibernate-validator@9.1.3.Final...9.1.4.Final)

---
updated-dependencies:
- dependency-name: org.hibernate.validator:hibernate-validator
  dependency-version: 9.1.4.Final
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
….3.0 in /build-logic (JabRef#17250)

* Chore(deps): Bump org.itsallcode:openfasttrace-gradle in /build-logic

Bumps org.itsallcode:openfasttrace-gradle from 3.2.0 to 3.3.0.

---
updated-dependencies:
- dependency-name: org.itsallcode:openfasttrace-gradle
  dependency-version: 3.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* remove workaround for openfassttrace

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Christoph <siedlerkiller@gmail.com>
* Update Grobid url from http to https

* fix test

* fix(preferences): migrate Grobid URL

Migrate the legacy endpoint during GUI and JabKit startup without changing custom URLs.

* public no longer needed in main

* changelog

* restore public

* Apply suggestion from @subhramit

---------

Co-authored-by: Subhramit Basu <subhramit.bb@live.in>
* Clarify requirements documentation

* Apply batched suggestions from code review

Co-authored-by: InAnYan <ruslanpopov1512@gmail.com>

---------

Co-authored-by: Ruslan <ruslan@example.com>
Co-authored-by: Oliver Kopp <kopp.dev@gmail.com>
@koppor
koppor marked this pull request as ready for review September 23, 2026 10:31
@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

PR Summary by Qodo

Add background task viewer and cross-cutting maintenance fixes

✨ Enhancement 🐞 Bug fix 🧪 Tests 📝 Documentation ⚙️ Configuration changes 🕐 40+ Minutes

Grey Divider

AI Description

• Adds background-task inspection and clearer quit choices.
• Fixes linked-file actions, case-sensitive full-text search, and Grobid connectivity.
• Adds issue triage automation and modernizes requirement tracing documentation.
Diagram

graph TD
  Changes["Change set"] --> UI["Desktop UI"] --> Dialog["Task dialogs"] --> State["Task state"]
  Changes --> Search["Search pipeline"] --> Index[("Lucene index")] --> Results["Highlighted results"]
  Changes --> Support["Platform support"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Split changes into focused PRs
  • ➕ Aligns each PR title and description with its actual scope.
  • ➕ Allows UI, search, Grobid, automation, and dependency changes to be reviewed independently.
  • ➕ Reduces regression risk and enables targeted rollback or backporting.
  • ➕ Makes CI failures easier to attribute to a specific concern.
  • ➖ Requires branch cleanup and multiple CI runs.
  • ➖ Introduces coordination overhead where changelog or localization files overlap.

Recommendation: Split this branch into focused PRs before review: background-task UI, case-sensitive linked-file search, Grobid migration, linked-file editor behavior, issue triage automation, and requirement-tracing tooling. The implementations themselves are generally appropriate—especially dedicated case-preserving Lucene fields—but bundling unrelated merged work makes the current PR difficult to validate against its stated purpose.

Files changed (63) +699 / -251

Enhancement (4) +53 / -17
DialogService.javaExpose background-task dialog operations +5/-1

Expose background-task dialog operations

• Changes the blocking quit dialog to return a boolean decision and adds an API for showing a non-modal task viewer.

jabgui/src/main/java/org/jabref/gui/DialogService.java

JabRefDialogService.javaImplement reusable background-task views +40/-16

Implement reusable background-task views

• Adds descriptive quit buttons and a non-modal task dialog while sharing task-view creation and cleaning up bindings and listeners when dialogs close.

jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java

StandardActions.javaDefine the background-task menu action +1/-0

Define the background-task menu action

• Adds localized action metadata for viewing running background tasks.

jabgui/src/main/java/org/jabref/gui/actions/StandardActions.java

MainMenu.javaAdd task viewer to the Help menu +7/-0

Add task viewer to the Help menu

• Connects the new View background tasks action to the dialog service and its traceable UX requirement.

jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java

Bug fix (11) +151 / -38
LinkedFilesEditor.javaLink selected file suggestions directly +10/-0

Link selected file suggestions directly

• Makes the add button accept selected automatically found files instead of opening the manual file-link dialog.

jabgui/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java

JabRefFrameViewModel.javaUse explicit quit-dialog decisions +2/-3

Use explicit quit-dialog decisions

• Consumes the background-task dialog's boolean result and keeps JabRef open when the user declines to quit.

jabgui/src/main/java/org/jabref/gui/frame/JabRefFrameViewModel.java

PreferencesMigrations.javaRun the Grobid URL migration in JabRef +2/-0

Run the Grobid URL migration in JabRef

• Adds migration of the legacy HTTP Grobid endpoint during GUI preference startup.

jabgui/src/main/java/org/jabref/migrations/PreferencesMigrations.java

JabKitLauncher.javaMigrate Grobid settings in JabKit +3/-1

Migrate Grobid settings in JabKit

• Runs the shared Grobid URL migration during CLI startup and clarifies that only GUI-specific migrations are omitted.

jabkit/src/main/java/org/jabref/toolkit/JabKitLauncher.java

GrobidPreferences.javaUse the secure Grobid endpoint +1/-1

Use the secure Grobid endpoint

• Changes the default Grobid service URL from legacy HTTP with a custom port to HTTPS.

jablib/src/main/java/org/jabref/logic/importer/util/GrobidPreferences.java

GrobidService.javaRecognize current empty Grobid responses +6/-3

Recognize current empty Grobid responses

• Updates empty-citation response detection for the current Grobid output and removes obsolete custom-server documentation.

jablib/src/main/java/org/jabref/logic/importer/util/GrobidService.java

GrobidUrlMigration.javaMigrate the legacy Grobid URL +19/-0

Migrate the legacy Grobid URL

• Introduces a shared migration that replaces only the old JabRef Grobid endpoint while preserving custom URLs.

jablib/src/main/java/org/jabref/logic/preferences/GrobidUrlMigration.java

SearchToLuceneVisitor.javaRoute case-sensitive searches to preserved fields +43/-16

Route case-sensitive searches to preserved fields

• Translates case-sensitive operators and search-bar flags into explicit queries over case-preserving content and annotation fields.

jablib/src/main/java/org/jabref/logic/search/query/SearchToLuceneVisitor.java

DocumentReader.javaIndex case-preserving linked-file text +9/-2

Index case-preserving linked-file text

• Writes PDF content and annotations to additional non-stored fields used by case-sensitive searches.

jablib/src/main/java/org/jabref/logic/search/sqlbased/indexing/DocumentReader.java

LinkedFilesConstants.javaDefine case-preserving Lucene fields +32/-2

Define case-preserving Lucene fields

• Adds parallel content and annotation fields with tokenizer-only analyzers, maps normal fields to them, and increments the index version to force rebuilding.

jablib/src/main/java/org/jabref/model/search/LinkedFilesConstants.java

SearchResult.javaHighlight matches with field-specific analyzers +24/-10

Highlight matches with field-specific analyzers

• Builds highlighters per normal and case-sensitive field, filters zero-score fragments, and combines distinct matching snippets.

jablib/src/main/java/org/jabref/model/search/query/SearchResult.java

Refactor (1) +1 / -5
LinkedFilesSearcher.javaPass queries into search results +1/-5

Pass queries into search results

• Moves highlighter construction out of the search loop by passing the Lucene query to each result for field-aware highlighting.

jablib/src/main/java/org/jabref/logic/search/sqlbased/retrieval/LinkedFilesSearcher.java

Tests (8) +150 / -11
JabRefFrameViewModelTest.javaTest declining quit during active tasks +20/-0

Test declining quit during active tasks

• Stubs observable task state and verifies that declining the quit dialog prevents tab closure.

jabgui/src/test/java/org/jabref/gui/frame/JabRefFrameViewModelTest.java

PdfMergeMetadataImporterTest.javaUpdate PDF importer Grobid endpoint +1/-1

Update PDF importer Grobid endpoint

• Adjusts the mocked Grobid URL to the new HTTPS service endpoint.

jablib/src/test/java/org/jabref/logic/importer/fileformat/pdf/PdfMergeMetadataImporterTest.java

GrobidServiceTest.javaAlign Grobid integration expectations +5/-5

Align Grobid integration expectations

• Uses the HTTPS endpoint and updates expected citation metadata and extracted author formatting for the current service.

jablib/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java

PreferenceMigrationTest.javaTest Grobid URL migration behavior +31/-0

Test Grobid URL migration behavior

• Verifies migration of the legacy endpoint, preservation of custom URLs, and restoration of test preference state.

jablib/src/test/java/org/jabref/logic/preferences/PreferenceMigrationTest.java

InMemoryLuceneSearchBackendTest.javaTest case-sensitive in-memory full-text search +23/-1

Test case-sensitive in-memory full-text search

• Adds parameterized coverage for exact, phrase-like, and regular-expression operators across PDF contents and annotations.

jablib/src/test/java/org/jabref/logic/search/inmemory/InMemoryLuceneSearchBackendTest.java

SearchQueryLuceneConversionTest.javaTest case-sensitive Lucene conversion +15/-3

Test case-sensitive Lucene conversion

• Updates expected queries for case-preserving fields and verifies that the global case-sensitive flag applies to unfielded terms.

jablib/src/test/java/org/jabref/logic/search/query/SearchQueryLuceneConversionTest.java

SqlBasedLibrarySearcherWithBibFilesTest.javaTest SQL-backed case-sensitive search +9/-1

Test SQL-backed case-sensitive search

• Adds full-text cases covering uppercase and lowercase exact and regular-expression matches.

jablib/src/test/java/org/jabref/logic/search/sqlbased/SqlBasedLibrarySearcherWithBibFilesTest.java

SearchResultTest.javaTest case-aware result highlighting +46/-0

Test case-aware result highlighting

• Covers insensitive, sensitive, compound, and annotation highlighting against field-specific Lucene queries.

jablib/src/test/java/org/jabref/model/search/query/SearchResultTest.java

Documentation (6) +244 / -66
CHANGELOG.mdDocument bundled user-visible changes +4/-0

Document bundled user-visible changes

• Adds entries for the background-task UI, Grobid restoration, linked-file linking behavior, and case-sensitive full-text search.

CHANGELOG.md

CONTRIBUTING.mdDocument the issue triage gate +1/-0

Document the issue triage gate

• Explains that contributors cannot self-assign issues carrying the needs-triage label.

CONTRIBUTING.md

requirements.mdAdd comprehensive requirement-tracing guide +218/-0

Add comprehensive requirement-tracing guide

• Documents OpenFastTrace setup, artifact syntax, conventions, implementation links, writing style, and handling of draft requirements.

docs/code-howtos/requirements.md

index.mdSimplify the requirements index +3/-66

Simplify the requirements index

• Replaces duplicated OpenFastTrace instructions with a concise overview and link to the new code how-to.

docs/requirements/index.md

search-within-library.mdSpecify case-sensitive full-text search +10/-0

Specify case-sensitive full-text search

• Adds a traceable requirement covering case-sensitive operators for linked-file contents and annotations.

docs/requirements/search-within-library.md

ux.mdSpecify background-task visibility +8/-0

Specify background-task visibility

• Adds a requirement that running tasks remain inspectable and cancellable without quitting JabRef.

docs/requirements/ux.md

Other (33) +100 / -114
bug_report.ymlLabel new bug reports for triage +1/-0

Label new bug reports for triage

• Configures newly submitted bug reports with the 'status: needs-triage' label.

.github/ISSUE_TEMPLATE/bug_report.yml

suggestion-for-improvement.mdLabel new suggestions for triage +1/-1

Label new suggestions for triage

• Assigns the 'status: needs-triage' label to new improvement suggestions.

.github/ISSUE_TEMPLATE/suggestion-for-improvement.md

on-issue-comment.ymlBlock self-assignment before triage +8/-0

Block self-assignment before triage

• Declines '/assign-me' requests on untriaged issues, explains why, and runs the assignment action only when triage permits it.

.github/workflows/on-issue-comment.yml

build.gradle.ktsUpgrade OpenFastTrace dependencies +5/-5

Upgrade OpenFastTrace dependencies

• Updates the OpenFastTrace Gradle plugin and libraries to versions 3.4.0 and 4.10.0.

build-logic/build.gradle.kts

org.jabref.gradle.feature.requirementtracing.gradle.ktsAdopt the standard OpenFastTrace plugin +2/-106

Adopt the standard OpenFastTrace plugin

• Replaces custom task and extension wiring with the upstream 'org.itsallcode.openfasttrace' Gradle plugin.

build-logic/src/main/kotlin/org.jabref.gradle.feature.requirementtracing.gradle.kts

module-info.javaNarrow Lucene highlighter module exposure +1/-1

Narrow Lucene highlighter module exposure

• Changes the Lucene highlighter dependency from transitive to an internal module requirement.

jablib/src/main/java/module-info.java

JabRef_ar.propertiesSynchronize Arabic localization sections +2/-0

Synchronize Arabic localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_ar.properties

JabRef_da.propertiesSynchronize Danish localization sections +2/-0

Synchronize Danish localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_da.properties

JabRef_de.propertiesSynchronize German localization sections +2/-0

Synchronize German localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_de.properties

JabRef_el.propertiesSynchronize Greek localization sections +2/-0

Synchronize Greek localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_el.properties

JabRef_en.propertiesLocalize background-task controls +5/-0

Localize background-task controls

• Adds English strings for the task viewer, task dialog title, action description, and descriptive quit choices.

jablib/src/main/resources/l10n/JabRef_en.properties

JabRef_es.propertiesSynchronize Spanish localization sections +2/-0

Synchronize Spanish localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_es.properties

JabRef_fa.propertiesSynchronize Persian localization sections +2/-0

Synchronize Persian localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_fa.properties

JabRef_fi.propertiesSynchronize Finnish localization sections +2/-0

Synchronize Finnish localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_fi.properties

JabRef_fr.propertiesAdd French merge-driver translations +15/-0

Add French merge-driver translations

• Adds French messages for semantic merge outcomes, conflicts, and unsupported input conditions.

jablib/src/main/resources/l10n/JabRef_fr.properties

JabRef_id.propertiesSynchronize Indonesian localization sections +2/-0

Synchronize Indonesian localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_id.properties

JabRef_it.propertiesAdd Italian merge-driver translations +15/-0

Add Italian merge-driver translations

• Adds Italian messages for semantic merge outcomes, conflicts, and unsupported input conditions.

jablib/src/main/resources/l10n/JabRef_it.properties

JabRef_ja.propertiesSynchronize Japanese localization sections +2/-0

Synchronize Japanese localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_ja.properties

JabRef_ko.propertiesSynchronize Korean localization sections +2/-0

Synchronize Korean localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_ko.properties

JabRef_nl.propertiesSynchronize Dutch localization sections +2/-0

Synchronize Dutch localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_nl.properties

JabRef_no.propertiesSynchronize Norwegian localization sections +2/-0

Synchronize Norwegian localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_no.properties

JabRef_pl.propertiesSynchronize Polish localization sections +2/-0

Synchronize Polish localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_pl.properties

JabRef_pt.propertiesSynchronize Portuguese localization sections +2/-0

Synchronize Portuguese localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_pt.properties

JabRef_pt_BR.propertiesSynchronize Brazilian Portuguese sections +2/-0

Synchronize Brazilian Portuguese sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_pt_BR.properties

JabRef_ru.propertiesSynchronize Russian localization sections +2/-0

Synchronize Russian localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_ru.properties

JabRef_sv.propertiesSynchronize Swedish localization sections +2/-0

Synchronize Swedish localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_sv.properties

JabRef_tl.propertiesSynchronize Tagalog localization sections +2/-0

Synchronize Tagalog localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_tl.properties

JabRef_tr.propertiesSynchronize Turkish localization sections +2/-0

Synchronize Turkish localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_tr.properties

JabRef_uk.propertiesSynchronize Ukrainian localization sections +2/-0

Synchronize Ukrainian localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_uk.properties

JabRef_vi.propertiesSynchronize Vietnamese localization sections +2/-0

Synchronize Vietnamese localization sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_vi.properties

JabRef_zh_CN.propertiesSynchronize Simplified Chinese sections +2/-0

Synchronize Simplified Chinese sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_zh_CN.properties

JabRef_zh_TW.propertiesSynchronize Traditional Chinese sections +2/-0

Synchronize Traditional Chinese sections

• Adds the merge-driver section marker to keep localization resources structurally aligned.

jablib/src/main/resources/l10n/JabRef_zh_TW.properties

build.gradle.ktsUpgrade Hibernate Validator +1/-1

Upgrade Hibernate Validator

• Updates the constrained Hibernate Validator version from 9.1.3.Final to 9.1.4.Final.

versions/build.gradle.kts

@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Sep 23, 2026 •

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (1) 📘 Rule violations (5) 📜 Skill insights (0)

Grey Divider


Action required

1. Task changes cannot be reviewed alone 📘 Rule violation ⚙ Maintainability ⭐ New
Description
The task-viewer PR also changes issue-triage automation, requirement-tracing dependencies, Grobid
networking, file linking, and full-text search behavior. These independent code paths force review,
release, and rollback of the Help-menu feature to carry unrelated behavior changes with it.
Code

.github/workflows/on-issue-comment.yml[R15-18]

+      - name: Decline self-assignment of untriaged issues
+        id: untriaged
+        if: "${{ contains(github.event.comment.body, '/assign-me') && contains(github.event.issue.labels.*.name, 'status: needs-triage') }}"
+        run: |
Evidence
Compliance rule 2 requires a narrowly focused change without unrelated rewrites. The cited files
show that this task-viewer PR also introduces issue-triage automation, a Grobid response change, and
substantial search conversion behavior.

AGENTS.md: Preserve Existing Architecture, Compatibility, and Focused Scope
.github/workflows/on-issue-comment.yml[15-24]
jablib/src/main/java/org/jabref/logic/importer/util/GrobidService.java[69-74]
jablib/src/main/java/org/jabref/logic/search/query/SearchToLuceneVisitor.java[95-119]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The background-task viewer is bundled with several unrelated features and maintenance changes, preventing focused review and rollback.

## Fix Focus Areas
- .github/workflows/on-issue-comment.yml[15-24]
- jablib/src/main/java/org/jabref/logic/importer/util/GrobidService.java[69-74]
- jablib/src/main/java/org/jabref/logic/search/query/SearchToLuceneVisitor.java[95-119]

## Recommended Fix
Rebase or cherry-pick the background-task viewer changes onto a clean branch. Move issue triage, Grobid, linked-file, search, dependency, and localization work into independently reviewed pull requests.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Build versions remain decentralized 📘 Rule violation ⚙ Maintainability ⭐ New
Description
build-logic/build.gradle.kts hard-codes five upgraded OpenFastTrace versions instead of declaring
them in versions/build.gradle.kts. A later dependency update must discover and synchronize version
metadata outside the approved catalog for the plugin and its runtime components.
Code

build-logic/build.gradle.kts[R31-34]

+    implementation("org.itsallcode:openfasttrace-gradle:3.4.0")
+    implementation("org.itsallcode.openfasttrace:openfasttrace-api:4.10.0")
+    implementation("org.itsallcode.openfasttrace:openfasttrace-core:4.10.0")
+    implementation("org.itsallcode.openfasttrace:openfasttrace-exporter-specobject:4.10.0")
Evidence
Compliance rule 1 requires changed dependency versions to reside in the designated version catalog.
The cited build file embeds version literals for every upgraded OpenFastTrace component.

AGENTS.md: Declare Dependencies in the Approved Module and Version Files
build-logic/build.gradle.kts[31-35]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The OpenFastTrace dependency versions are upgraded directly in the build-logic dependency declarations rather than through the designated version file.

## Fix Focus Areas
- build-logic/build.gradle.kts[31-35]
- versions/build.gradle.kts[135-138]

## Recommended Fix
Declare the OpenFastTrace versions in `versions/build.gradle.kts` and make the build-logic dependency declarations consume those centralized versions, retaining any required module mappings in `gradle/modules.properties`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Translated bundles bypass Crowdin 📘 Rule violation ⚙ Maintainability ⭐ New
Description
JabRef_fr.properties and JabRef_it.properties add translated merge-driver keys, while numerous
other translated bundles receive the same new section comment. These changes modify Crowdin-owned
outputs outside JabRef_en.properties, allowing the next localization synchronization to replace or
conflict with them.
Code

jablib/src/main/resources/l10n/JabRef_fr.properties[R3509-3512]

+Unable\ to\ merge\ %0.=Impossible de fusionner %0.
+Merged\ %0\ without\ conflicts.=%0 fusionné sans conflit.
+%0\ entries\ could\ not\ be\ merged\ automatically\:=%0 entrées n'ont pas pu être fusionnées automatiquement \:
+%0\:\ deleted\ in\ CURRENT,\ changed\ in\ OTHER=%0 \: supprimé de ACTUEL, changé dans AUTRE
Evidence
Compliance rule 23 requires translated properties files to remain untouched. The cited French and
Italian bundles contain newly added translated keys, and the Arabic bundle demonstrates the broader
direct modification of translated files.

AGENTS.md: Maintain Localization Keys Only in the English Source Bundle
jablib/src/main/resources/l10n/JabRef_fr.properties[3508-3522]
jablib/src/main/resources/l10n/JabRef_it.properties[3443-3457]
jablib/src/main/resources/l10n/JabRef_ar.properties[779-780]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The PR directly modifies Crowdin-managed translated localization bundles instead of limiting localization metadata changes to the English source bundle.

## Fix Focus Areas
- jablib/src/main/resources/l10n/JabRef_fr.properties[3508-3522]
- jablib/src/main/resources/l10n/JabRef_it.properties[3443-3457]
- jablib/src/main/resources/l10n/JabRef_ar.properties[779-780]

## Recommended Fix
Revert all changes under translated `JabRef_<lang>.properties` bundles. Keep new or changed localization keys only in `JabRef_en.properties` and allow Crowdin to update translated bundles.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View high (4)
4. Two release notes break house style 📘 Rule violation ⚙ Maintainability ⭐ New
Description
CHANGELOG.md adds a two-sentence Grobid entry beginning with We re-enabled and a linked-file
entry longer than 20 words. Both appear under Unreleased, leaving end users with notes that
violate the required prefix and concise one-sentence structure.
Code

CHANGELOG.md[R21-23]

+- We re-enabled the [Grobid](https://github.com/grobidOrg/grobid) citation fetcher again. It is now reachable via https. [#16668](https://github.com/JabRef/jabref/issues/16668)
- We fixed an issue where the AI chat lost its scroll position when switching back to an entry. [#17172](https://github.com/JabRef/jabref/pull/17172)
+- We fixed an issue where pressing "+" in the "File" field with an automatically found file selected opened the "Add file link" dialog instead of linking the selected file. [#16938](https://github.com/JabRef/jabref/pull/16938)
Evidence
Compliance rule 38 permits only one sentence of at most 20 words beginning with an approved prefix.
The Grobid entry uses two sentences and an unsupported prefix, while the linked-file entry exceeds
the word limit.

AGENTS.md: Format Changelog Entries for End Users
CHANGELOG.md[21-23]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Two added changelog entries do not satisfy the required prefix, sentence-count, and word-count conventions.

## Fix Focus Areas
- CHANGELOG.md[21-23]

## Recommended Fix
Rewrite the Grobid entry as one sentence beginning with an allowed prefix such as `We fixed`. Shorten the linked-file entry to at most 20 words while retaining only its user-visible effect.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. Two public surfaces lack package docs 📘 Rule violation ⚙ Maintainability ⭐ New
Description
DialogService adds a public task-viewer operation and GrobidUrlMigration adds a public class to
an exported logic package, but neither package receives corresponding package documentation.
Generated developer documentation therefore omits the purpose and contract of both newly exposed
surfaces.
Code

jabgui/src/main/java/org/jabref/gui/DialogService.java[R219-220]

+    /// Shows a non-modal dialog listing the running background tasks.
+    void showBackgroundTasksDialog(StateManager stateManager);
Evidence
Compliance rule 42 requires documentation when a package or module public surface changes. The cited
interface adds a public method, the migration is a new public class, and the module descriptor
confirms that its package is exported.

AGENTS.md: Document New or Changed Package and Module Public Surfaces
jabgui/src/main/java/org/jabref/gui/DialogService.java[216-220]
jablib/src/main/java/org/jabref/logic/preferences/GrobidUrlMigration.java[7-16]
jablib/src/main/java/module-info.java[26-26]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Two packages gain new public surfaces without corresponding package or module documentation updates.

## Fix Focus Areas
- jabgui/src/main/java/org/jabref/gui/DialogService.java[219-220]
- jablib/src/main/java/org/jabref/logic/preferences/GrobidUrlMigration.java[7-16]
- jablib/src/main/java/module-info.java[26-26]

## Recommended Fix
Add or update `package-info.java` documentation for `org.jabref.gui` and `org.jabref.logic.preferences` using Markdown Javadoc. Describe the task-dialog service surface and the preference-migration responsibility without documenting implementation details.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


6. Task viewer lacks a requirement ✓ Resolved 📘 Rule violation ⚙ Maintainability
Description
SHOW_BACKGROUND_TASKS introduces a user-facing task viewer without adding its behavior to
docs/requirements. The Help-menu feature is therefore absent from the repository’s OpenFastTrace
requirement set, leaving future implementation and test links without a matching product
requirement.
Code

jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java[R379-382]

+                factory.createMenuItem(StandardActions.SHOW_BACKGROUND_TASKS, new SimpleCommand() {
+                    @Override
+                    public void execute() {
+                        dialogService.showBackgroundTasksDialog(stateManager);
Evidence
Compliance rule 25 requires every new feature to add a correctly formatted requirement. The changed
menu code and changelog establish that this PR adds a user-visible feature, while the PR contains no
corresponding requirements-file change.

AGENTS.md: Add Requirements for New Features and Significant Bug Fixes: AGENTS.md: Add Requirements for New Features and Significant Bug Fixes: AGENTS.md: Add Requirements for New Features and Significant Bug Fixes: AGENTS.md: Add Requirements for New Features and Significant Bug Fixes: AGENTS.md: Add Requirements for New Features and Significant Bug Fixes: AGENTS.md: Add Requirements for New Features and Significant Bug Fixes: AGENTS.md: Add Requirements for New Features and Significant Bug Fixes: AGENTS.md: Add Requirements for New Features and Significant Bug Fixes
jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java[379-382]
CHANGELOG.md[15-15]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new background-task viewer has no documented requirement or OpenFastTrace identifier.
## Fix Focus Areas
- docs/requirements/ux.md[189-191]
- jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java[379-382]
## Recommended Fix
Add a focused UX requirement describing access to currently running background tasks. Place a `req~...~1` identifier immediately below its heading, retain the file’s MD022 suppression, and add tracing only if the project uses full implementation tracing for this feature.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


7. Task dialog regressions go undetected ✓ Resolved 📘 Rule violation ☼ Reliability
Description
showBackgroundTasksDialog and the revised quit result handling are added without tests for
task-list display, automatic completion, or either user choice. Changes to dialog closure or the
returned decision can therefore alter whether JabRef remains open without any automated failure
identifying the regression.
Code

jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[R455-459]

+        return alert.showAndWait().filter(quit::equals).isPresent();
+    }
+
+    @Override
+    public void showBackgroundTasksDialog(StateManager stateManager) {
Evidence
Compliance rule 22 requires added or updated tests for behavior changes. This PR adds a non-modal
task dialog and changes the quit dialog to return a Boolean decision, but no test files are changed
and the existing frame view-model test covers only parser-result behavior.

AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes: AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes: AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes: AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes: AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes: AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes: AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes: AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes
jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[455-475]
jabgui/src/main/java/org/jabref/gui/frame/JabRefFrameViewModel.java[139-145]
jabgui/src/test/java/org/jabref/gui/frame/JabRefFrameViewModelTest.java[82-129]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new task-viewer dialog and changed quit-decision behavior have no automated regression coverage.
## Fix Focus Areas
- jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[455-475]
- jabgui/src/main/java/org/jabref/gui/frame/JabRefFrameViewModel.java[139-145]
- jabgui/src/test/java/org/jabref/gui/frame/JabRefFrameViewModelTest.java[82-129]
## Recommended Fix
Add deterministic JavaFX tests covering the task viewer’s running-task binding and closure behavior. Extend the frame view-model tests to verify that declining the quit action keeps JabRef open, accepting it closes JabRef, and task completion follows the documented close path.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

8. Server users keep the obsolete URL 🐞 Bug ≡ Correctness ⭐ New
Description
GrobidUrlMigration.migrate only runs where each launcher invokes it, but this PR wires it into the
GUI and JabKit initialization while leaving ServerCli.call untouched. When standalone-server users
retain the old default and select Grobid parsing, ServerUtils propagates that URL into
GrobidService, which requests the obsolete HTTP endpoint.
Code

jablib/src/main/java/org/jabref/logic/preferences/GrobidUrlMigration.java[R14-16]

+    public static void migrate(JabRefCliPreferences preferences) {
+        if (LEGACY_GROBID_URL.equals(preferences.get(JabRefCliPreferences.GROBID_URL, ""))) {
+            preferences.put(JabRefCliPreferences.GROBID_URL, GrobidPreferences.getDefault().getGrobidURL());
Evidence
The migration replaces the legacy URL only when explicitly called. The GUI and JabKit launchers call
it, but the standalone server reads the singleton preferences and constructs Server without
migration; its citation parsing path obtains Grobid preferences and GrobidService appends
/api/processCitation to the persisted URL.

jablib/src/main/java/org/jabref/logic/preferences/GrobidUrlMigration.java[14-17]
jabgui/src/main/java/org/jabref/migrations/PreferencesMigrations.java[102-105]
jabkit/src/main/java/org/jabref/toolkit/JabKitLauncher.java[71-75]
jabsrv-cli/src/main/java/org/jabref/http/server/cli/ServerCli.java[49-74]
jabsrv/src/main/java/org/jabref/http/server/services/ServerUtils.java[82-103]
jablib/src/main/java/org/jabref/logic/importer/util/GrobidService.java[57-60]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The Grobid URL migration is invoked by the GUI and JabKit launchers but not by the standalone server. Existing server users can therefore retain the obsolete HTTP endpoint and fail Grobid-backed citation requests.

## Fix Focus Areas
- jabsrv-cli/src/main/java/org/jabref/http/server/cli/ServerCli.java[49-74]
- jablib/src/main/java/org/jabref/logic/preferences/GrobidUrlMigration.java[14-17]

## Recommended Fix
Obtain one `JabRefCliPreferences` instance at the start of `ServerCli.call`, invoke `GrobidUrlMigration.migrate(preferences)` before reading or passing preferences, and reuse that migrated instance when constructing `Server`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


9. Closed task dialogs remain in memory ✓ Resolved 🐞 Bug ➹ Performance
Description
showBackgroundTasksDialog installs a content binding through createBackgroundTasksView but does
not unbind it when the non-modal dialog closes. Repeatedly choosing the new Help action accumulates
hidden task views and listeners, and future background-task changes continue updating every retained
view.
Code

jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[R460-461]

+        DialogPane contentPane = new DialogPane();
+        contentPane.setContent(createBackgroundTasksView(stateManager));
Evidence
Each invocation creates a fresh task view bound to the persistent state-manager list, while the new
non-modal dialog is shown without any hidden/close cleanup. The Help command can invoke this path
repeatedly, and repository dialogs with listeners to long-lived data explicitly remove or dispose
those listeners when hidden.

jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[459-475]
jabgui/src/main/java/org/jabref/gui/JabRefGuiStateManager.java[86-89]
jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java[379-384]
jabgui/src/main/java/org/jabref/gui/errorconsole/ErrorConsoleView.java[69-80]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The non-modal background-task dialog remains bound to the long-lived running-task list after it closes, retaining its task view and listener.
## Fix Focus Areas
- jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[459-475]
## Recommended Fix
Retain enough information to dispose the task-list content binding and register an `onHidden` handler on each dialog that unbinds its `TaskProgressView`. Prefer an explicitly paired JavaFX `Bindings.bindContent` and `Bindings.unbindContent`, and apply the same lifecycle cleanup to the shared view used by the modal quit dialog.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
Review mode: 🧠 Deep: This PR combines multiple unrelated behavioral changes across GUI dialogs, full-text search, migrations, CI/build tooling, and localization, creating a high density of independent defects that benefits from redundant review passes.

Grey Divider

Tip of the day
💡 Did you know, you can keep summaries lean with Finding overflow, which tucks the rest behind 'View more'

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Previous reviews

Review updated until commit 9d6d381 🧠 Deep

Results up to commit N/A


🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 🎨 UX issues (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)


Action required
1. Task viewer lacks a requirement ✓ Resolved 📘 Rule violation ⚙ Maintainability
Description
SHOW_BACKGROUND_TASKS introduces a user-facing task viewer without adding its behavior to
docs/requirements. The Help-menu feature is therefore absent from the repository’s OpenFastTrace
requirement set, leaving future implementation and test links without a matching product
requirement.
Code

jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java[R379-382]

+                factory.createMenuItem(StandardActions.SHOW_BACKGROUND_TASKS, new SimpleCommand() {
+                    @Override
+                    public void execute() {
+                        dialogService.showBackgroundTasksDialog(stateManager);
Evidence
Compliance rule 25 requires every new feature to add a correctly formatted requirement. The changed
menu code and changelog establish that this PR adds a user-visible feature, while the PR contains no
corresponding requirements-file change.

AGENTS.md: Add Requirements for New Features and Significant Bug Fixes: AGENTS.md: Add Requirements for New Features and Significant Bug Fixes: AGENTS.md: Add Requirements for New Features and Significant Bug Fixes: AGENTS.md: Add Requirements for New Features and Significant Bug Fixes
jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java[379-382]
CHANGELOG.md[15-15]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new background-task viewer has no documented requirement or OpenFastTrace identifier.
## Fix Focus Areas
- docs/requirements/ux.md[189-191]
- jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java[379-382]
## Recommended Fix
Add a focused UX requirement describing access to currently running background tasks. Place a `req~...~1` identifier immediately below its heading, retain the file’s MD022 suppression, and add tracing only if the project uses full implementation tracing for this feature.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Task dialog regressions go undetected ✓ Resolved 📘 Rule violation ☼ Reliability
Description
showBackgroundTasksDialog and the revised quit result handling are added without tests for
task-list display, automatic completion, or either user choice. Changes to dialog closure or the
returned decision can therefore alter whether JabRef remains open without any automated failure
identifying the regression.
Code

jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[R455-459]

+        return alert.showAndWait().filter(quit::equals).isPresent();
+    }
+
+    @Override
+    public void showBackgroundTasksDialog(StateManager stateManager) {
Evidence
Compliance rule 22 requires added or updated tests for behavior changes. This PR adds a non-modal
task dialog and changes the quit dialog to return a Boolean decision, but no test files are changed
and the existing frame view-model test covers only parser-result behavior.

AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes: AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes: AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes: AGENTS.md: Add Strong, Deterministic Tests for Behavior Changes
jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[455-475]
jabgui/src/main/java/org/jabref/gui/frame/JabRefFrameViewModel.java[139-145]
jabgui/src/test/java/org/jabref/gui/frame/JabRefFrameViewModelTest.java[82-129]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new task-viewer dialog and changed quit-decision behavior have no automated regression coverage.
## Fix Focus Areas
- jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[455-475]
- jabgui/src/main/java/org/jabref/gui/frame/JabRefFrameViewModel.java[139-145]
- jabgui/src/test/java/org/jabref/gui/frame/JabRefFrameViewModelTest.java[82-129]
## Recommended Fix
Add deterministic JavaFX tests covering the task viewer’s running-task binding and closure behavior. Extend the frame view-model tests to verify that declining the quit action keeps JabRef open, accepting it closes JabRef, and task completion follows the documented close path.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended
3. Closed task dialogs remain in memory ✓ Resolved 🐞 Bug ➹ Performance
Description
showBackgroundTasksDialog installs a content binding through createBackgroundTasksView but does
not unbind it when the non-modal dialog closes. Repeatedly choosing the new Help action accumulates
hidden task views and listeners, and future background-task changes continue updating every retained
view.
Code

jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[R460-461]

+        DialogPane contentPane = new DialogPane();
+        contentPane.setContent(createBackgroundTasksView(stateManager));
Evidence
Each invocation creates a fresh task view bound to the persistent state-manager list, while the new
non-modal dialog is shown without any hidden/close cleanup. The Help command can invoke this path
repeatedly, and repository dialogs with listeners to long-lived data explicitly remove or dispose
those listeners when hidden.

jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[459-475]
jabgui/src/main/java/org/jabref/gui/JabRefGuiStateManager.java[86-89]
jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java[379-384]
jabgui/src/main/java/org/jabref/gui/errorconsole/ErrorConsoleView.java[69-80]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The non-modal background-task dialog remains bound to the long-lived running-task list after it closes, retaining its task view and listener.
## Fix Focus Areas
- jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java[459-475]
## Recommended Fix
Retain enough information to dispose the task-list content binding and register an `onHidden` handler on each dialog that unbinds its `TaskProgressView`. Prefer an explicitly paired JavaFX `Bindings.bindContent` and `Bindings.unbindContent`, and apply the same lifecycle cleanup to the shared view used by the modal quit dialog.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment thread jabgui/src/main/java/org/jabref/gui/frame/MainMenu.java
Comment thread jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java
Comment thread jabgui/src/main/java/org/jabref/gui/JabRefDialogService.java Outdated
@koppor
koppor marked this pull request as draft September 23, 2026 13:18
@koppor
koppor marked this pull request as ready for review September 23, 2026 13:19
Comment on lines +15 to +18
- name: Decline self-assignment of untriaged issues
id: untriaged
if: "${{ contains(github.event.comment.body, '/assign-me') && contains(github.event.issue.labels.*.name, 'status: needs-triage') }}"
run: |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Task changes cannot be reviewed alone 📘 Rule violation ⚙ Maintainability

The task-viewer PR also changes issue-triage automation, requirement-tracing dependencies, Grobid
networking, file linking, and full-text search behavior. These independent code paths force review,
release, and rollback of the Help-menu feature to carry unrelated behavior changes with it.
Agent Prompt
## Issue description
The background-task viewer is bundled with several unrelated features and maintenance changes, preventing focused review and rollback.

## Fix Focus Areas
- .github/workflows/on-issue-comment.yml[15-24]
- jablib/src/main/java/org/jabref/logic/importer/util/GrobidService.java[69-74]
- jablib/src/main/java/org/jabref/logic/search/query/SearchToLuceneVisitor.java[95-119]

## Recommended Fix
Rebase or cherry-pick the background-task viewer changes onto a clean branch. Move issue triage, Grobid, linked-file, search, dependency, and localization work into independently reviewed pull requests.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Generated with Claude Code

Not done: all flagged files come from the merged origin/main, not this PR.

Comment on lines +31 to +34
implementation("org.itsallcode:openfasttrace-gradle:3.4.0")
implementation("org.itsallcode.openfasttrace:openfasttrace-api:4.10.0")
implementation("org.itsallcode.openfasttrace:openfasttrace-core:4.10.0")
implementation("org.itsallcode.openfasttrace:openfasttrace-exporter-specobject:4.10.0")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Build versions remain decentralized 📘 Rule violation ⚙ Maintainability

build-logic/build.gradle.kts hard-codes five upgraded OpenFastTrace versions instead of declaring
them in versions/build.gradle.kts. A later dependency update must discover and synchronize version
metadata outside the approved catalog for the plugin and its runtime components.
Agent Prompt
## Issue description
The OpenFastTrace dependency versions are upgraded directly in the build-logic dependency declarations rather than through the designated version file.

## Fix Focus Areas
- build-logic/build.gradle.kts[31-35]
- versions/build.gradle.kts[135-138]

## Recommended Fix
Declare the OpenFastTrace versions in `versions/build.gradle.kts` and make the build-logic dependency declarations consume those centralized versions, retaining any required module mappings in `gradle/modules.properties`.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Generated with Claude Code

Not done: build-logic versions arrived with the merged origin/main.

Comment on lines +3509 to +3512
Unable\ to\ merge\ %0.=Impossible de fusionner %0.
Merged\ %0\ without\ conflicts.=%0 fusionné sans conflit.
%0\ entries\ could\ not\ be\ merged\ automatically\:=%0 entrées n'ont pas pu être fusionnées automatiquement \:
%0\:\ deleted\ in\ CURRENT,\ changed\ in\ OTHER=%0 \: supprimé de ACTUEL, changé dans AUTRE

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

3. Translated bundles bypass crowdin 📘 Rule violation ⚙ Maintainability

JabRef_fr.properties and JabRef_it.properties add translated merge-driver keys, while numerous
other translated bundles receive the same new section comment. These changes modify Crowdin-owned
outputs outside JabRef_en.properties, allowing the next localization synchronization to replace or
conflict with them.
Agent Prompt
## Issue description
The PR directly modifies Crowdin-managed translated localization bundles instead of limiting localization metadata changes to the English source bundle.

## Fix Focus Areas
- jablib/src/main/resources/l10n/JabRef_fr.properties[3508-3522]
- jablib/src/main/resources/l10n/JabRef_it.properties[3443-3457]
- jablib/src/main/resources/l10n/JabRef_ar.properties[779-780]

## Recommended Fix
Revert all changes under translated `JabRef_<lang>.properties` bundles. Keep new or changed localization keys only in `JabRef_en.properties` and allow Crowdin to update translated bundles.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Generated with Claude Code

Not done: only JabRef_en.properties is maintained here; other bundles come from Crowdin.

Comment thread CHANGELOG.md
Comment on lines +219 to +220
/// Shows a non-modal dialog listing the running background tasks.
void showBackgroundTasksDialog(StateManager stateManager);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

5. Two public surfaces lack package docs 📘 Rule violation ⚙ Maintainability

DialogService adds a public task-viewer operation and GrobidUrlMigration adds a public class to
an exported logic package, but neither package receives corresponding package documentation.
Generated developer documentation therefore omits the purpose and contract of both newly exposed
surfaces.
Agent Prompt
## Issue description
Two packages gain new public surfaces without corresponding package or module documentation updates.

## Fix Focus Areas
- jabgui/src/main/java/org/jabref/gui/DialogService.java[219-220]
- jablib/src/main/java/org/jabref/logic/preferences/GrobidUrlMigration.java[7-16]
- jablib/src/main/java/module-info.java[26-26]

## Recommended Fix
Add or update `package-info.java` documentation for `org.jabref.gui` and `org.jabref.logic.preferences` using Markdown Javadoc. Describe the task-dialog service surface and the preference-migration responsibility without documenting implementation details.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Generated with Claude Code

Not done: jablib has package-info only for a handful of packages; helper classes stay below that bar.

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

Code review by qodo was updated up to the latest commit 9d6d381

koppor pushed a commit that referenced this pull request Sep 23, 2026
JabRef:hayagriva-writer (#736)
JabRef:help-background-tasks (#771)
JabRef:directory-split (#760)

This branch has not been deployed

No deployments
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.

3 participants