Skip to content

Ship JEP 514 AOT cache in jabkit app image - #16791

Closed
koppor wants to merge 8 commits into
mainfrom
aot-cache
Closed

koppor wants to merge 8 commits into
mainfrom
aot-cache

Conversation

@koppor

@koppor koppor commented Aug 31, 2026 •

Copy link
Copy Markdown
Member

Summary

🤖 The jabkit app image now ships a JEP 514 ahead-of-time cache: the build does a training run of the packaged launcher and the launcher loads the cache on every start, cutting JVM startup time (locally ~0.4 s per invocation). An unusable cache is ignored at runtime, so nothing breaks on exotic setups.

jabref-contrib-policy:4.2:reviewed​:ok

Analogies: Like honey, the cache is produced once and enjoyed on every later serving; like chocolate, it melts away startup wait without changing the recipe; and like the moon, it silently accompanies every launch without anyone having to steer it.

● Here's the measured output (Debian x64, Corretto 25 app image from the branch,
  DBUS_SESSION_BUS_ADDRESS pointed at a nonexistent socket so keyring prompts don't add noise):

  $ time ./bin/jabkit --version
  real  0m1,203s
  real  0m1,252s
  real  0m1,182s

  $ JAVA_TOOL_OPTIONS="-XX:AOTMode=off" time ./bin/jabkit --version
  real  0m1,554s                                                                            
  real  0m1,547s
  real  0m1,523s

  Three runs each: ~1.21 s with the AOT cache vs ~1.54 s without — the cache cuts roughly 0.33 s
  (~22%) off every invocation.

Steps to test

  1. Build the app image: ./gradlew :jabkit:jpackage
  2. Check jabkit/build/packages/<target>/jabkit/lib/app/ contains jabkit.aot and jabkit.cfg ends with java-options=-XX:AOTCache=$APPDIR/jabkit.aot
  3. Compare time ./bin/jabkit --version against JAVA_TOOL_OPTIONS="-XX:AOTMode=off" time ./bin/jabkit --version

Related issues and pull requests

Closes https://github.com/JabRef/jabref-issue-melting-pot/issues/947

The GUI (jabgui) is left out on purpose: creating an AOT cache needs a training run of the real launcher, which for the GUI would require driving a display on every packaging runner. Extending this to jabgui is blocked on a packaging-plugin hook between app-image creation and installer packaging; requested upstream in gradlex-org/java-module-packaging#135.

AI usage

Claude Code (model claude-fable-5), AIL3 — implemented by AI, reviewed and owned by the contributor.

AI CHECKLIST.md walkthrough

1. Code self-review

Nullability and control flow — not applicable (no Java code changed, Gradle build script only)

  • [/] No == null / != null checks — JSpecify annotations (@NullMarked, @Nullable, @NonNull) used instead.
  • [/] No Objects.requireNonNull(...) — nullability expressed via JSpecify annotations.
  • [/] New classes annotated with @NullMarked (org.jspecify.annotations.NullMarked).
  • [/] Optional consumed with ifPresent / ifPresentOrElse / map / orElseThrow — never orElse(unusedValue) nor an isPresent() + get() block.
  • [/] StringUtil.isBlank(...) used instead of s == null || s.isBlank().

Exceptions — not applicable (build script only)

  • [/] No catch (Exception e) — only specific exceptions are caught.
  • [/] No throw new RuntimeException(...) / IllegalStateException(...) — these tear down the whole application.
  • [/] Logged exceptions are passed as the last logger argument (LOGGER.info("...", e)), not concatenated into the message string.

Style and idioms

  • [/] New BibEntry objects built with withers (withField, not setField).
  • [/] Modern Java used: List.of() / Map.of() / Set.of(), Path.of(), SequencedCollection / SequencedSet, text blocks.
  • [/] Regexes use a precompiled Pattern.compile(...) constant, not String.matches(...).
  • [/] Background work uses org.jabref.logic.util.BackgroundTask, not new Thread().
  • No commented-out code, no trivial comments restating the code, no AI-disclosure comments in source.
  • [/] Markdown Javadoc (///) uses Markdown syntax, not JavaDoc inline tags: code instead of {@code}, [ClassName] instead of {@link}.

User-facing text — not applicable (no UI change)

  • [/] All user-facing text localized (Localization.lang in Java, % prefix in FXML).
  • [/] Sentence case (not Title Case); no trailing !; labels do not end with :.
  • [/] Variance expressed with placeholders ("...: %0"), not string concatenation.

Security

  • [/] User-controlled data (request params, entry fields, file contents) is HTML-escaped before being written into any text/html response — including exception/error messages, not just the success body (XSS).

Tests

  • [/] Behavior changes in org.jabref.model / org.jabref.logic have added or updated tests.
  • [/] Tests assert object contents (assertEquals), use plain JUnit asserts (not AssertJ), have no @DisplayName, do not catch exceptions (let them propagate so JUnit reports setup/teardown failures directly), and use @TempDir instead of manual temp directories.
  • [/] Fetcher tests hit the live endpoints — the remote API is not mocked or stubbed (automated-review suggestions to mock it are rejected on purpose).

2. Verification commands — not applicable except markdownlint (no Java touched); :jabkit:jpackage built and ran successfully instead

  • [/] ./gradlew :jablib:check (or ./gradlew check for all modules).
  • [/] ./gradlew checkstyleMain checkstyleTest checkstyleJmh.
  • [/] ./gradlew modernizer.
  • [/] ./gradlew --no-configuration-cache :rewriteDryRun reports no changes (run ./gradlew rewriteRun to fix).
  • [/] ./gradlew javadoc.
  • npx markdownlint-cli2 "docs/**/*.md" "*.md" (only if Markdown changed).
  • [/] Only if formatting is still off after rewriteRun: intellij-format docker.

3. Documentation

  • CHANGELOG.md entry added if the change is visible to the user (end-user wording, no extra blank lines).
  • Searched issues for a related issue; linked the melting-pot issue.
  • [/] Requirement added to docs/requirements/<area>.md (build/packaging change, no functional feature).
  • [/] Developer documentation under docs/ updated if behavior or architecture changed.

4. Pull request

  • PR body built from .github/PULL_REQUEST_TEMPLATE.md, every section filled.
  • All checklist items kept and marked [x], [ ], or [/].
  • All HTML comments removed from the PR body.
  • PR created with gh pr create --body-file <file> (not --body).
  • [/] CHANGELOG.md TODO placeholder replacement (issue link used directly).

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

Train the packaged launcher after jpackage and reference the resulting
cache from the launcher configuration, improving jabkit startup time.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9bGZAT6xPeH3ueCA8PzPW
@qodo-free-for-open-source-projects

qodo-free-for-open-source-projects Bot commented Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

PR Summary by Qodo

Ship JEP 514 AOT cache with jabkit app images

✨ Enhancement ⚙️ Configuration changes 📝 Documentation 🕐 20-40 Minutes

Grey Divider

AI Description

• Train and package a JEP 514 cache to reduce jabkit startup latency.
• Load caches automatically while tolerating missing, incompatible, or unsupported runtime
 environments.
• Train Docker caches in its glibc runtime stage and document the behavior.
Diagram

graph TD
  A["jpackage task"] --> B["App image"] --> C{"Training location"}
  C -->|Build host| D["Gradle training"] --> F["AOT cache"]
  C -->|Docker runtime| E["Runtime training"] --> F
  F --> G["Launcher config"] --> H["jabkit startup"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Shared AOT training helper
  • ➕ Avoids duplicating training commands between Gradle and Docker.
  • ➕ Centralizes cache validation and launcher configuration changes.
  • ➖ Requires a portable helper that supports Linux, macOS, and Windows layouts.
  • ➖ Adds another packaged or build-time artifact to maintain.
  • ➖ Docker still needs deferred execution in its glibc runtime stage.

Recommendation: The PR's host-aware training approach is appropriate because jpackage output must be executed to produce the cache, while Alpine cannot run the launcher before the glibc stage. Keeping the compact Docker-specific command is pragmatic; a shared helper would only become preferable if training logic grows or the two implementations begin to diverge.

Files changed (4) +58 / -1

Enhancement (1) +40 / -0
build.gradle.ktsGenerate AOT caches after app-image packaging +40/-0

Generate AOT caches after app-image packaging

• Extends compatible 'Jpackage' tasks with a post-packaging launcher training run across Linux, macOS, and Windows layouts. It validates cache creation, configures automatic cache loading, skips unsupported IBM/OpenJ9 builds, and supports explicit training suppression for incompatible hosts.

jabkit/build.gradle.kts

Documentation (2) +10 / -0
CHANGELOG.mdAnnounce faster jabkit binary startup +1/-0

Announce faster jabkit binary startup

• Adds an end-user changelog entry describing the improved startup speed and links the associated issue.

CHANGELOG.md

cli.mdSpecify the jabkit AOT startup requirement +9/-0

Specify the jabkit AOT startup requirement

• Documents that packaged app images include a JEP 514 cache trained during packaging. It also requires missing or unusable caches to remain non-fatal at startup.

docs/requirements/cli.md

Other (1) +8 / -1
Dockerfile.jabkitTrain the AOT cache in the glibc runtime stage +8/-1

Train the AOT cache in the glibc runtime stage

• Skips Gradle-side training in the Alpine build stage because the packaged launcher requires glibc. The runtime stage executes 'jabkit --version' to create the cache and appends its APPDIR-relative option to the launcher configuration.

Dockerfile.jabkit

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

qodo-free-for-open-source-projects Bot commented Aug 31, 2026 •

Copy link
Copy Markdown
Contributor

Code Review by Qodo

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

Grey Divider


Action required

1. Docker distribution omits AOT cache ✓ Resolved 📘 Rule violation ≡ Correctness
Description
Dockerfile.jabkit sets skipAotTraining=true and copies the resulting app image unchanged into
the runtime image, bypassing both jabkit.aot creation and launcher configuration. Consequently,
the distributed Docker launcher neither ships nor loads the AOT cache, contradicting the documented
requirement and preventing the advertised startup improvement from applying to this distribution.
Code

Dockerfile.jabkit[52]

+RUN ./gradlew --no-daemon -PprojVersion="${VERSION}" -PprojVersionInfo="${VERSION_INFO}" -Ptagbuild="${TAG_BUILD}" -PskipAotTraining=true :jabkit:jpackage
Evidence
Rule 33 requires developer documentation to match implemented behavior. The guard at
jabkit/build.gradle.kts:87-88 bypasses AOT cache generation and launcher modification when
skipAotTraining is true, while lines 99-110 are the only code that creates jabkit.aot and
appends the corresponding JVM option; Dockerfile.jabkit sets that property, copies the package
unchanged into /jabref, and directly uses its launcher as the entry point, despite the requirement
stating that the JabKit app image ships and loads the cache.

AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes: AGENTS.md: Update Developer Documentation for Behavior and Feature Changes
Dockerfile.jabkit[51-52]
jabkit/build.gradle.kts[87-110]
docs/requirements/cli.md[83-90]
Dockerfile.jabkit[51-56]
Dockerfile.jabkit[68-72]

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 Docker build disables AOT training, so the distributed JabKit app image does not contain `jabkit.aot` or configure its launcher to load the advertised cache.
## Issue Context
The documented feature states that the `jabkit` app image ships and loads an AOT cache. Training requires glibc because the generated launcher cannot execute in the current plain-Alpine build stage; move packaging or deferred cache training to a glibc-capable stage, or install a compatible glibc environment before packaging, rather than permanently skipping the post-processing for the distributed image.
## Fix Focus Areas
- Dockerfile.jabkit[51-68]
- jabkit/build.gradle.kts[87-110]
- docs/requirements/cli.md[83-90]

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


2. Changelog exposes AOT implementation ✓ Resolved 📘 Rule violation ⚙ Maintainability
Description
The changelog describes the internal AOT-cache mechanism rather than only the user-visible result,
contrary to the required end-user-oriented format.
Code

CHANGELOG.md[72]

+- We changed the `jabkit` binary distribution to ship an ahead-of-time (AOT) cache, improving startup time. [#947](https://github.com/JabRef/jabref-issue-melting-pot/issues/947)
Evidence
Rule 31 requires changelog entries to describe only user-visible results without implementation
knowledge. The new entry specifically discusses shipping an ahead-of-time (AOT) cache, an internal
JVM implementation detail.

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

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 changelog entry exposes the technical AOT-cache implementation instead of stating only the user-visible improvement.
## Issue Context
Keep the valid `We changed` prefix and issue link, but rewrite the entry in end-user language, such as saying that the `jabkit` binary starts faster.
## Fix Focus Areas
- CHANGELOG.md[72-72]

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


3. AOT feature lacks requirement ✓ Resolved 📘 Rule violation ⚙ Maintainability
Description
The PR adds a new user-visible JabKit startup feature without adding an OpenFastTrace requirement
under docs/requirements. This breaks traceability for the new AOT-cache behavior.
Code

jabkit/build.gradle.kts[R78-80]

+// AOT cache (JEP 514): after jpackage has assembled the app image, do a training run of the packaged
+// launcher (-XX:AOTCacheOutput records and assembles the cache in one go) and ship the cache inside
+// the image. -XX:AOTCache and -XX:AOTCacheOutput are mutually exclusive, so the -XX:AOTCache line is
Evidence
Compliance rule 27 requires every new feature to add a requirement. The changed build script
introduces and ships the AOT cache, while the existing JabKit requirements file contains no
requirement describing AOT-cache packaging or startup behavior.

AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements: AGENTS.md: Document New Features and Significant Bug Fixes as Requirements
jabkit/build.gradle.kts[78-103]
docs/requirements/cli.md[4-83]

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 JabKit AOT-cache feature has no corresponding OpenFastTrace requirement.
## Issue Context
Add a requirement with its `req~...~` identifier immediately following the heading, without a blank line, and preserve the required file-level MD022 directive.
## Fix Focus Areas
- jabkit/build.gradle.kts[78-103]
- docs/requirements/cli.md[4-83]

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


View action required (2)
4. Changelog uses invalid prefix ✓ Resolved 📘 Rule violation ⚙ Maintainability
Description
The new release-note entry starts with We improved, but permitted prefixes are only We added,
We changed, We fixed, or We removed. The entry therefore does not meet the required changelog
form.
Code

CHANGELOG.md[72]

+- We improved the startup time of the `jabkit` binary distribution by shipping an ahead-of-time (AOT) cache. [#947](https://github.com/JabRef/jabref-issue-melting-pot/issues/947)
Evidence
Compliance rule 29 mandates one of four exact release-note prefixes. The added line begins with `We
improved`, which is not among them.

AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form: AGENTS.md: Maintain User-Facing CHANGELOG Entries in the Required Form
CHANGELOG.md[72-72]

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 changelog entry uses the unsupported prefix `We improved`.
## Issue Context
Keep the entry under `Unreleased` → `Changed`, but begin it with an allowed prefix such as `We changed` while retaining the concise user impact and issue link.
## Fix Focus Areas
- CHANGELOG.md[72-72]

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


5. Alpine Docker build breaks ✓ Resolved 🐞 Bug ≡ Correctness
Description
The new doLast executes the packaged launcher during :jabkit:jpackage, but Dockerfile.jabkit
runs that task in plain Alpine and explicitly documents that the generated jpackage binaries require
glibc. The launcher therefore cannot run during the Docker build, so the training check fails before
the image is copied into the glibc-enabled runtime stage.
Code

jabkit/build.gradle.kts[R96-99]

+            val process = ProcessBuilder(launcher.absolutePath, "--version")
+                .redirectErrorStream(true)
+                .apply { environment()["JAVA_TOOL_OPTIONS"] = "-XX:AOTCacheOutput=${cache.absolutePath}" }
+                .start()
Evidence
The Docker build stage is amazoncorretto:25-alpine and invokes :jabkit:jpackage; only afterward
does it switch to alpine-glibc, with an explicit comment that jpackage binaries need glibc. The
added task action now starts that binary and requires a successful exit plus cache creation.

Dockerfile.jabkit[1-1]
Dockerfile.jabkit[51-59]
jabkit/build.gradle.kts[96-101]

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 AOT training launch runs inside the plain-Alpine build stage used by `Dockerfile.jabkit`, although the Dockerfile states that jpackage binaries require glibc. This causes the Docker packaging build to fail before reaching its glibc-enabled runtime stage.
## Issue Context
Keep normal desktop packaging behavior while ensuring the Docker build does not execute the packaged launcher until glibc is available. Possible approaches include using a glibc-based build stage or moving the cache-training step into a glibc-enabled stage.
## Fix Focus Areas
- jabkit/build.gradle.kts[84-104]
- Dockerfile.jabkit[1-59]

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



Remediation recommended

6. Spaced paths break training ✓ Resolved 🐞 Bug ☼ Reliability
Description
The cache's absolute path is inserted unquoted into JAVA_TOOL_OPTIONS, whose contents are
tokenized as JVM arguments. If the checkout or Gradle output path contains spaces, the AOT output
option is split into invalid arguments and :jabkit:jpackage fails its training check.
Code

jabkit/build.gradle.kts[98]

+                .apply { environment()["JAVA_TOOL_OPTIONS"] = "-XX:AOTCacheOutput=${cache.absolutePath}" }
Evidence
The cache location is derived from an absolute package path, and that path is interpolated directly
into the environment option without quoting. The subsequent check makes any resulting launcher parse
failure fatal to packaging.

jabkit/build.gradle.kts[95-101]

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 unquoted absolute cache path in `JAVA_TOOL_OPTIONS` is split when any parent directory contains whitespace, causing the packaged training launcher to fail.
## Issue Context
Preserve the AOT output option as one JVM argument regardless of checkout path. Ensure quoting/escaping works on Linux, macOS, and Windows.
## Fix Focus Areas
- jabkit/build.gradle.kts[95-101]

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


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

Qodo Logo

Comment thread jabkit/build.gradle.kts
Comment thread CHANGELOG.md Outdated
Comment thread jabkit/build.gradle.kts
Comment thread jabkit/build.gradle.kts Outdated
@koppor
koppor marked this pull request as draft September 1, 2026 22:00
koppor and others added 2 commits September 2, 2026 00:02
@koppor
koppor marked this pull request as ready for review September 1, 2026 22:05
Comment thread Dockerfile.jabkit
Comment thread CHANGELOG.md Outdated
@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 254e26e

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9bGZAT6xPeH3ueCA8PzPW
@koppor
koppor marked this pull request as draft September 2, 2026 12:05
The glibc runtime stage can execute the packaged launcher, so the Docker
image ships the cache the Alpine build stage cannot create.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9bGZAT6xPeH3ueCA8PzPW
@koppor
koppor marked this pull request as ready for review September 2, 2026 12:06
@qodo-free-for-open-source-projects

Copy link
Copy Markdown
Contributor

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

@koppor

koppor commented Sep 3, 2026

Copy link
Copy Markdown
Member Author

🤖 Generated with Claude Code

jabgui feasibility check (local Linux, jabgui app image, time until the main window appears under Xvfb, 3 runs):

Training run Cache size Time to window
none — 1.36 / 1.36 / 1.15 s
JabRef --version (no display needed, exits before JavaFX) 32 MB 1.22 / 1.26 / 1.05 s (~10%)
full GUI under xvfb-run, then SIGTERM 91 MB 1.10 / 1.00 / 0.99 s (~26%)

Training works (SIGTERM does trigger cache assembly). The blocker is the packaging plugin: installers are built from the app image in the same task action, so a doLast-trained cache would reach only the portable archive, never deb/rpm/msi/dmg. Hook requested upstream in gradlex-org/java-module-packaging#135 (implementation: gradlex-org/java-module-packaging#136); jabgui follows as a separate PR once released.

@koppor
koppor marked this pull request as draft September 5, 2026 11:08
@koppor

koppor commented Sep 5, 2026

Copy link
Copy Markdown
Member Author

Marked as draft, because devcall labels was put on

@koppor koppor removed the status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers label Sep 5, 2026
@koppor

koppor commented Sep 6, 2026

Copy link
Copy Markdown
Member Author

Discussion: 30 to 100 MB larger distribution size for 10% more startup speed. Not worth. Because we need much more storage space because of the many distributions.

@koppor koppor closed this Sep 6, 2026
@koppor
koppor deleted the aot-cache branch September 6, 2026 22:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants