Skip to content

Drop former default entry editor tabs on migration and add "Add classic tabs" - #16672

Closed
koppor wants to merge 22 commits into
mainfrom
drop-default-custom-tabs
Closed

koppor wants to merge 22 commits into
mainfrom
drop-default-custom-tabs

Conversation

@koppor

@koppor koppor commented Aug 24, 2026 •

Copy link
Copy Markdown
Member

Summary

🤖 Upgrading from JabRef 5.x or 6.0-alpha showed the former default tabs "General" and "Abstract" next to "Main", although "Main" already contains their fields. Upgrading now drops these former default tabs while keeping genuinely customized tabs. A new "Add classic 5.x tabs" button in the entry editor preferences brings back "General", "Abstract", and "Comments"; fields shown on a custom tab are omitted from "Main", while fields of the entry type always stay there.

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

Analogies: Like honey, this only keeps what was actually made by the user. Like chocolate, the classic tabs are still there for those who crave them — one click away. Like the moon, "Main" reflects all those fields already, so the duplicates can wane.

Steps to test

  1. Start with 6.0-alpha.6 preferences (stock "General"/"Abstract" custom tabs stored), open an entry: only the built-in tabs are shown; a user-defined tab (e.g. Mine: keywords;comment-.*) stays.
  2. Open File → Preferences → Entry editor, click Add classic 5.x tabs: "General", "Abstract", and "Comments" appear after "Main"; clicking again adds nothing.
  3. Save, open an entry: the three tabs are shown after "Main", and their fields (abstract, groups, comments, …) no longer appear in "Main", while author, title, doi, … stay.

Add classic 5.x tabs

A side-by-side comparison with the JabRef 5.15 entry editor is in this comment.

Related issues and pull requests

Follow-up to #16598; supersedes #16669.

AI usage

Claude Code (model claude-fable-5), AIL4: code, tests, and this description were generated by the AI under my guidance and reviewed by me.

AI CHECKLIST.md walkthrough

1. Code self-review

  • Nullability and control flow (one != null on a nullable backing-store read, pre-existing pattern in that method).
  • Exceptions.
  • Style and idioms.
  • User-facing text (new keys added to JabRef_en.properties).
  • [/] Security — no HTML output.
  • Tests: migration (drop default General, drop Abstract, keep customized, empty map) and view model (insert after Main, no duplicates).

2. Verification commands

  • ./gradlew :jabgui:test for the touched test classes.
  • ./gradlew :jabgui:checkstyleMain :jabgui:checkstyleTest.
  • ./gradlew rewriteRun — no changes.
  • IntelliJ formatter (2025.3.1, headless) — no changes.
  • [/] modernizer, javadoc, markdownlint — not run separately.

3. Documentation

  • CHANGELOG.md "Added" entry for the button; the migration fixes an unreleased regression, so no "Fixed" entry.
  • No matching issue found in jabref / jabref-koppor.
  • [/] No requirement / developer docs change.

4. Pull request

  • Template body, all sections filled, HTML comments removed, created with --body-file.
  • [/] No TODO placeholder in CHANGELOG.md.

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 a screenshot in the PR description showing a library with a single entry with me as author and as title the issue number
  • I described the change in CHANGELOG.md in a way that can be understood by the average user (if 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 August 25, 2026 00:17
…tabs"

Old versions stored the default "General" and "Abstract" tabs as if the
user had defined them, so upgrading duplicated fields already shown in
the "Main" tab. The migration now drops stored tabs whose field set is
one of the former defaults and keeps genuinely customized tabs. Users who
want the split get it back via "Add classic tabs" in the entry editor
preferences.

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

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

Copy link
Copy Markdown
Contributor

PR Summary by Qodo

Drop legacy default tabs and restore classic entry editor tabs

🐞 Bug fix ✨ Enhancement 🧪 Tests 📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Removes duplicated legacy default tabs during migration while preserving customized
 configurations.
• Adds idempotent, localized restoration of classic General, Abstract, and Comments tabs.
• Keeps custom-tab fields off Main unless defined by the entry type.
Diagram

graph TD
  Legacy["Legacy preferences"] --> Migration["Tab migration"] --> Match{"Exact legacy default?"} -->|"no: preserve"| Config["JSON tab config"] --> UI["Tab preferences"] --> Model["Classic tab model"] --> Editor["Entry editor"]
  Match -->|"yes"| Drop["Drop duplicate"] --> Config
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Persist typed tab metadata
  • ➕ Avoids sentinel-prefixed names for localization.
  • ➕ Supports future localized or predefined tab families explicitly.
  • ➖ Requires a broader JSON schema and migration change.
  • ➖ Adds compatibility risk for a targeted restoration feature.

Recommendation: Keep the PR's whitelisted % localization-key approach for this targeted, backward-compatible change. A typed persisted tab kind would be preferable only if more predefined or localized preference values are introduced.

Files changed (19) +349 / -24

Enhancement (7) +125 / -15
AllFieldsTab.javaExclude custom-tab fields from Main remaining fields +6/-1

Exclude custom-tab fields from Main remaining fields

• Filters fields resolved onto custom tabs from Main's remaining-fields section. Citation keys and fields defined by the entry type remain because they are inserted earlier.

jabgui/src/main/java/org/jabref/gui/entryeditor/AllFieldsTab.java

EntryEditorPreferences.javaResolve fields assigned to custom tabs +14/-0

Resolve fields assigned to custom tabs

• Adds an entry-aware helper that combines plain and regex-resolved fields from every configured custom tab.

jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditorPreferences.java

EntryEditorTabModel.javaDefine localized classic tab models +44/-0

Define localized classic tab models

• Defines the classic General, Abstract, and Comments field sets and persists their names as whitelisted localization keys. Adds localized display-name resolution without interpreting arbitrary user-entered percent-prefixed names.

jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditorTabModel.java

UserDefinedFieldsTab.javaRender localized custom tab names +1/-1

Render localized custom tab names

• Uses the model's display name so predefined classic tabs follow the active UI language.

jabgui/src/main/java/org/jabref/gui/entryeditor/UserDefinedFieldsTab.java

EditorTabViewModel.javaExpose stored names and localized display names +6/-1

Expose stored names and localized display names

• Separates a custom tab's persisted name from its displayed name, enabling localized classic tabs without changing user-defined names.

jabgui/src/main/java/org/jabref/gui/preferences/entryeditor/EditorTabViewModel.java

EntryEditorTab.javaAdd classic-tabs action and documentation help +25/-12

Add classic-tabs action and documentation help

• Adds the classic-tab and reset buttons below the tab configuration columns. Replaces the inline regex hint with a help action linking to entry-editor tab documentation.

jabgui/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTab.java

EntryEditorTabViewModel.javaInsert classic tabs idempotently after Main +29/-0

Insert classic tabs idempotently after Main

• Adds classic tabs directly after Main while skipping matches by stored key, localized display name, or case-insensitive field set. Locale-independent normalization prevents duplicate detection failures in languages such as Turkish.

jabgui/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModel.java

Bug fix (1) +67 / -2
PreferencesMigrations.javaDrop exact legacy default tabs during migration +67/-2

Drop exact legacy default tabs during migration

• Filters former General and Abstract defaults only when both a shipped localized name and an exact historical field set match. Preserves renamed, edited, and cross-matched customizations and writes an empty JSON map when all stored tabs are dropped.

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

Tests (4) +144 / -2
EntryEditorPreferencesTest.javaTest custom-tab field aggregation +28/-0

Test custom-tab field aggregation

• Verifies that custom-tab field collection includes plain fields and entry-specific fields resolved from regular expressions.

jabgui/src/test/java/org/jabref/gui/entryeditor/EntryEditorPreferencesTest.java

EntryEditorTabModelTest.javaTest localized classic tab names +12/-0

Test localized classic tab names

• Verifies classic keys remain persisted while their display names are localized, and arbitrary user names remain verbatim.

jabgui/src/test/java/org/jabref/gui/entryeditor/EntryEditorTabModelTest.java

EntryEditorTabViewModelTest.javaTest classic tab insertion and deduplication +48/-0

Test classic tab insertion and deduplication

• Covers insertion order, idempotency, localization-key persistence, field-set duplicate detection across languages, and locale-independent case folding.

jabgui/src/test/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModelTest.java

GuiPreferencesMigrationsTest.javaTest selective legacy tab cleanup +56/-2

Test selective legacy tab cleanup

• Covers removal of stock Abstract and General tabs, retention of customized lookalikes, localized names, historical field sets, and empty migration results.

jabgui/src/test/java/org/jabref/migrations/GuiPreferencesMigrationsTest.java

Documentation (4) +11 / -2
CHANGELOG.mdDocument classic tab restoration button +1/-0

Document classic tab restoration button

• Adds a user-facing changelog entry for restoring the JabRef 5 General, Abstract, and Comments tabs.

CHANGELOG.md

0023-localized-preferences.mdRecord localized classic tab-name implementation +1/-1

Record localized classic tab-name implementation

• Updates ADR 23 to note that classic custom entry editor tab names now use localized persisted keys, while other preferences remain unmigrated.

docs/decisions/0023-localized-preferences.md

entry-editor.mdSpecify classic tabs and Main-field behavior +8/-1

Specify classic tabs and Main-field behavior

• Defines how custom-tab fields are omitted from Main, how entry-type fields remain, and how classic tabs are added, localized, deduplicated, and migrated.

docs/requirements/entry-editor.md

HelpFile.javaRegister entry editor tabs help target +1/-0

Register entry editor tabs help target

• Adds a help-file route to the documentation section explaining entry editor fields and regular-expression patterns.

jablib/src/main/java/org/jabref/logic/help/HelpFile.java

Other (3) +2 / -3
JabRef_en.propertiesAdd classic tab action text +2/-1

Add classic tab action text

• Adds English labels and tooltip text for the classic-tabs button and removes the obsolete inline regex hint.

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

JabRef_fr.propertiesRemove obsolete French regex hint +0/-1

Remove obsolete French regex hint

• Removes the French translation for the inline regex guidance now replaced by a documentation help link.

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

JabRef_it.propertiesRemove obsolete Italian regex hint +0/-1

Remove obsolete Italian regex hint

• Removes the Italian translation for the inline regex guidance now replaced by a documentation help link.

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

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

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

Copy link
Copy Markdown
Contributor

Code Review by Qodo

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

Grey Divider


Action required

1. New labels lack locale keys 📘 Rule violation ≡ Correctness
Description
The two new localized UI strings are added only to the English bundle, while the other locale
bundles contain neither key. This violates the requirement that every code-used localization key
exist across all locale bundles.
Code

jablib/src/main/resources/l10n/JabRef_en.properties[R2223-2224]

+Add\ classic\ 5.x\ tabs=Add classic 5.x tabs
+Adds\ the\ tabs\ "General",\ "Abstract",\ and\ "Comments"\ known\ from\ JabRef\ 5.=Adds the tabs "General", "Abstract", and "Comments" known from JabRef 5.
Evidence
The added English entries define the exact keys used by the new button and tooltip, while a
repository-wide search of JabRef_*.properties finds those keys only in JabRef_en.properties.

jablib/src/main/resources/l10n/JabRef_en.properties[2223-2224]
Best Practice: Learned patterns

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 entry-editor button and tooltip localization keys exist only in the English bundle.
## Issue Context
PR Compliance ID 39 requires every code-used key to exist consistently in every translated bundle, with matching punctuation and placeholders.
## Fix Focus Areas
- jablib/src/main/resources/l10n/JabRef_en.properties[2223-2224]

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


2. Translated bundles edited manually 📘 Rule violation ⚙ Maintainability
Description
The PR manually removes an entry from the French and Italian translation bundles. JabRef's Crowdin
workflow requires localization-source changes to remain confined to JabRef_en.properties.
Code

jablib/src/main/resources/l10n/JabRef_fr.properties[2225]

-A\ field\ name\ can\ also\ be\ a\ regular\ expression,\ e.g.\ "comment-.*".=Un nom de champ peut également être une expression régulière, par exemple "comment-.*".
Evidence
The diff deletes the same translated localization entry directly from both the French and Italian
bundles, contrary to the English-only localization workflow.

AGENTS.md: Maintain Localization Keys Only in the English Source File: AGENTS.md: Maintain Localization Keys Only in the English Source File: AGENTS.md: Maintain Localization Keys Only in the English Source File: AGENTS.md: Maintain Localization Keys Only in the English Source File
jablib/src/main/resources/l10n/JabRef_fr.properties[2225-2225]
jablib/src/main/resources/l10n/JabRef_it.properties[2222-2222]

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 edits translated localization bundles by deleting the obsolete regular-expression help key.
## Issue Context
PR Compliance ID 20 requires translated property files to remain unchanged so Crowdin can manage them.
## Fix Focus Areas
- jablib/src/main/resources/l10n/JabRef_fr.properties[2225-2225]
- jablib/src/main/resources/l10n/JabRef_it.properties[2222-2222]

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


3. Locale mutation lacks resource lock 📘 Rule violation ☼ Reliability
Description
The new test changes the process-wide default Locale without acquiring the repository's
Localization.lang resource lock. Under parallel execution it can race localization-dependent tests
and cause nondeterministic results despite restoring the locale afterward.
Code

jabgui/src/test/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModelTest.java[R78-80]

+        Locale defaultLocale = Locale.getDefault();
+        try {
+            Locale.setDefault(Locale.of("tr", "TR"));
Evidence
The changed test saves and then mutates Locale.getDefault() at lines 78-80, but its class and
method have no @ResourceLock; repository localization tests use
@ResourceLock("Localization.lang") to serialize access to this global state.

AGENTS.md: Add Deterministic Tests for Behavior Changes: AGENTS.md: Add Deterministic Tests for Behavior Changes: AGENTS.md: Add Deterministic Tests for Behavior Changes: AGENTS.md: Add Deterministic Tests for Behavior Changes
jabgui/src/test/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModelTest.java[73-90]
jablib/src/test/java/org/jabref/logic/l10n/LocalizationTest.java[8-13]

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 test mutates the JVM-wide default locale without coordinating with other parallel tests.
## Issue Context
Existing localization tests use JUnit's `@ResourceLock("Localization.lang")`; apply the same lock to this test method or class while retaining restoration in `finally`.
## Fix Focus Areas
- jabgui/src/test/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModelTest.java[73-90]

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


View high (5)
4. Tab test asserts predicates 📘 Rule violation ⚙ Maintainability
Description
The new test validates tab contents through assertFalse(names.contains(...)) and
assertTrue(names.contains(...)) instead of directly comparing expected values. This produces less
useful diagnostics and violates the prescribed object-content assertion style.
Code

jabgui/src/test/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModelTest.java[R89-90]

+        assertFalse(names.contains(general.displayName()));
+        assertTrue(names.contains(Localization.lang("Abstract")));
Evidence
Lines 89-90 use Boolean assertions over two List.contains predicates even though the expected
names can be compared directly.

AGENTS.md: Assert Object Contents Directly: AGENTS.md: Assert Object Contents Directly: AGENTS.md: Assert Object Contents Directly: AGENTS.md: Assert Object Contents Directly
jabgui/src/test/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModelTest.java[88-90]

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 test asserts computed `contains` predicates rather than the expected tab-name contents.
## Issue Context
PR Compliance ID 24 requires direct content or value assertions such as `assertEquals` when validating object state. Build the relevant actual tab-name collection and compare it to the expected names.
## Fix Focus Areas
- jabgui/src/test/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModelTest.java[88-90]

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


5. New test lacks @NullMarked 📘 Rule violation ⚙ Maintainability
Description
The newly introduced EntryEditorPreferencesTest class has no @NullMarked annotation, and its
package has no package-level null marking. This leaves the new class outside the checklist's
mandatory non-null-by-default model.
Code

jabgui/src/test/java/org/jabref/gui/entryeditor/EntryEditorPreferencesTest.java[15]

+class EntryEditorPreferencesTest {
Evidence
The PR adds the class declaration at line 15 without @NullMarked, and no package-info.java
exists for this test package to establish the same default.

AGENTS.md: Enforce Explicit Nullability with JSpecify: AGENTS.md: Enforce Explicit Nullability with JSpecify: AGENTS.md: Enforce Explicit Nullability with JSpecify: AGENTS.md: Enforce Explicit Nullability with JSpecify
jabgui/src/test/java/org/jabref/gui/entryeditor/EntryEditorPreferencesTest.java[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 test class is not explicitly non-null by default.
## Issue Context
PR Compliance ID 12 requires every new class to carry JSpecify `@NullMarked`; this package has no package-level annotation providing that default.
## Fix Focus Areas
- jabgui/src/test/java/org/jabref/gui/entryeditor/EntryEditorPreferencesTest.java[15-15]

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


6. isLegacyDefaultTab cross-matches tabs ✓ Resolved 📘 Rule violation ≡ Correctness
Description
isLegacyDefaultTab independently accepts either localized legacy name and either legacy field set,
so a customized General tab containing only abstract—or an Abstract tab containing General
fields—is incorrectly classified as a former default. The migration then permanently omits that
genuinely customized tab from the new JSON preference, breaking backward compatibility and
discarding user configuration.
Code

jabgui/src/main/java/org/jabref/migrations/PreferencesMigrations.java[R127-128]

+        return stored.equals(Set.of(StandardField.ABSTRACT.getName()))
+                || legacyGeneralFieldSets().contains(stored);
Evidence
Compliance rule 1 requires backward compatibility, and the method's contract and changed requirement
specify that a tab must exactly match one formerly shipped default. However, the predicate combines
all translated General and Abstract names into one set and independently accepts either the Abstract
field set or any General field set, losing the association between each name and its corresponding
fields; because the migration loop omits every value classified as true, mismatched name/field-set
pairs are incorrectly dropped.

AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope
jabgui/src/main/java/org/jabref/migrations/PreferencesMigrations.java[122-128]
docs/requirements/entry-editor.md[85-88]
jabgui/src/main/java/org/jabref/migrations/PreferencesMigrations.java[97-104]
jabgui/src/main/java/org/jabref/migrations/PreferencesMigrations.java[114-144]

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

## Issue description
`isLegacyDefaultTab` independently checks whether a tab has either legacy name and either legacy field set. This cross-matches customized General/Abstract tabs with the other default's fields, classifies combinations that were never shipped defaults as legacy defaults, and can permanently delete user configuration during migration.
## Issue Context
Only matching localized name/field-set pairs should be removed: a localized `Abstract` name paired with the abstract field set, or a localized `General` name paired with a shipped General field set. Mismatched pairs represent potentially customized tabs and must be retained.
## Fix Focus Areas
- jabgui/src/main/java/org/jabref/migrations/PreferencesMigrations.java[122-144]
- jabgui/src/test/java/org/jabref/migrations/GuiPreferencesMigrationsTest.java[367-395]

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


7. Percent-prefixed names can crash 📘 Rule violation ☼ Reliability
Description
Every custom tab name beginning with % is now treated as a resource key even though the public add
flow accepts any nonblank name and % had no reserved meaning for existing stored names.
Consequently, a valid user-entered, newly added, or migrated name such as %Mine causes
ResourceBundle.getString("Mine") to throw MissingResourceException when preferences or the entry
editor renders the tab instead of displaying the name verbatim.
Code

jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditorTabModel.java[R148-149]

+            ResourceBundle messages = Localization.getMessages();
+            return messages.getString(name.substring(1));
Evidence
Compliance rule 1 requires compatible behavior, and the documented requirement says user-typed names
are displayed verbatim. Custom-name validation rejects only blank names, while both preference rows
and editor tabs now route custom names through the localization method, which unconditionally calls
ResourceBundle.getString for every % prefix; therefore, an unknown suffix propagates an
exception on both display paths.

AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope: AGENTS.md: Preserve Architecture, Compatibility, and Focused Change Scope
jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditorTabModel.java[141-153]
jabgui/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModel.java[109-124]
docs/requirements/entry-editor.md[85-88]
jabgui/src/main/java/org/jabref/gui/preferences/entryeditor/EditorTabViewModel.java[63-74]
jabgui/src/main/java/org/jabref/gui/entryeditor/UserDefinedFieldsTab.java[68-72]
jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditorTabModel.java[141-154]

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 `%` prefix alone is insufficient to distinguish internal classic-tab localization keys from arbitrary user-entered tab names. Arbitrary `%`-prefixed names whose suffix is not a resource key currently throw `MissingResourceException` when displayed.
## Issue Context
The UI accepts any nonblank custom name, `%` had no reserved meaning for existing stored names, and user-typed names must remain verbatim. Restrict localization to known internal classic-tab keys or represent localized names explicitly without overloading unrestricted user text; unknown `%`-prefixed names must remain displayable verbatim, with regression coverage for this case.
## Fix Focus Areas
- jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditorTabModel.java[141-154]
- jabgui/src/main/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModel.java[109-124]
- jabgui/src/test/java/org/jabref/gui/entryeditor/EntryEditorTabModelTest.java[58-65]

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


8. Changelog entry exceeds limit 📘 Rule violation ⚙ Maintainability
Description
The added changelog sentence is approximately 25 words before its link, exceeding the mandated
maximum of 20 words. This violates the strict unreleased changelog format.
Code

CHANGELOG.md[68]

+- We added a button "Add classic 5.x tabs" to the entry editor preferences, which adds the tabs "General", "Abstract", and "Comments" known from JabRef 5. [#16672](https://github.com/JabRef/jabref/pull/16672)
Evidence
Compliance rule 29 limits each user-visible changelog sentence to at most 20 words. The newly added
sentence exceeds that limit.

AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only for User-Visible Changes: AGENTS.md: Add Strictly Formatted Changelog Entries Only fo...

Custom tab names are persisted verbatim, so a classic tab added under one
language was added again after switching languages.

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

ThiloteE commented Aug 25, 2026 •

Copy link
Copy Markdown
Member

The right side (which is supposed to be about the fields) now looks a little crammed, especially since there is this comment about regex as well.

  1. The comment could be moved to the documentation and a "?" button could be added to link to it.
  2. The "Classic tabs" and "Reset to default tabs" buttons could be moved to the bottom left in a new row, then we also have more space for longer field names.

Two more unrelated things (could be addressed in a follow up or never, as it's low prio):

  • Classic and Custom tabs cannot be toggled on and off.
  • Users cannot see the fields attached to Default tabs (such as "main"). It's ok, if that is not configurable, but a read only list could be good in a situation where users need to quickly compare what fields are supported by default and what fields need to be added in a custom tab.

@koppor

koppor commented Aug 26, 2026

Copy link
Copy Markdown
Member Author

🤖 Generated with Claude Code

Done, thanks:

  1. The regex hint is gone; a "?" button next to "Add" links to the documentation (the docs PR Update entry editor tabs docs for restored custom tabs user-documentation#659 already covers regular expressions and now also the two buttons).
  2. "Add classic tabs" and "Reset to default tabs" moved to a new row below the two columns, left-aligned; the field name box now takes the full width of the Fields column.

Editor tabs layout

The two unrelated points (toggling custom tabs, read-only field list of built-in tabs) are left for a follow-up.

koppor and others added 2 commits August 27, 2026 00:08
A stored tab is dropped only when its name is a translation of "General"
or "Abstract" and its fields are exactly one of the shipped default sets.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rutjr6iPghPfrMLgDzNLFL
The classic "General"/"Abstract" tabs are stored as "%General" and
"%Abstract" and translated on display, so they follow a language change
and have a locale-independent identity; user-typed names stay verbatim.

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

koppor commented Aug 26, 2026

Copy link
Copy Markdown
Member Author

🤖 Generated with Claude Code

a8b2268 applies ADR 0023 (Localized Preferences) to the classic tabs: their names are stored as %General / %Abstract and translated on display (CustomizedFieldsTab#localizedName, annotated @ADR(23)), so they follow a language change and have a locale-independent identity. User-typed tab names are still stored and shown verbatim. The ADR's "not implemented yet" note now points to this first use.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rutjr6iPghPfrMLgDzNLFL
@koppor
koppor requested a review from calixtus August 26, 2026 23:09
@koppor koppor added the status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers label Aug 26, 2026
@github-actions github-actions Bot added status: changes-required Pull requests that are not yet complete and removed component: internationalization i18n status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers labels Aug 26, 2026
@koppor koppor added status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers and removed status: changes-required Pull requests that are not yet complete labels Aug 28, 2026
@github-actions github-actions Bot added status: changes-required Pull requests that are not yet complete and removed status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers labels Aug 28, 2026
@koppor

This comment has been minimized.

@koppor

koppor commented Aug 31, 2026

Copy link
Copy Markdown
Member Author

🤖 Generated with Claude Code

Updated screenshots (the earlier comparison predates the "Comments" classic tab and is marked outdated).

Top: JabRef 5.15 (last release) — the classic editor with Required/Optional/… tabs plus Comments, General, Abstract; below its "General" tab.
Bottom: this PR after clicking "Add classic 5.x tabs" — "Main" keeps the type-defined fields (author, title, doi, …), while General, Abstract, and Comments hold the moved fields, which "Main" then omits from its remaining-fields list:

JabRef 5.15 vs this PR

@koppor

koppor commented Aug 31, 2026

Copy link
Copy Markdown
Member Author

OMG, we had "DOI" at "General"?

@koppor
koppor marked this pull request as ready for review August 31, 2026 12:43
Comment thread CHANGELOG.md Outdated
- We added an option to include currently selected entries when creating a new explicit group. [#16588](https://github.com/JabRef/jabref/pull/16588)
- We added an offer to initialize a Git repository when committing a library that is not yet version controlled. [#16722](https://github.com/JabRef/jabref/pull/16722)
- We added OCR language selection to the OCR preferences, allowing users to configure which Tesseract languages to use. [#16618](https://github.com/JabRef/jabref/issues/16618)
- We added a button "Add classic 5.x tabs" to the entry editor preferences, which adds the tabs "General", "Abstract", and "Comments" known from JabRef 5. [#16672](https://github.com/JabRef/jabref/pull/16672)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Action required

3. Changelog entry exceeds limit 📘 Rule violation ⚙ Maintainability

The added changelog sentence is approximately 25 words before its link, exceeding the mandated
maximum of 20 words. This violates the strict unreleased changelog format.
Agent Prompt
## Issue description
The new user-visible changelog sentence exceeds the 20-word maximum required by the changelog compliance rule.

## Issue Context
Keep one sentence under `Unreleased` → `Added`, retain the `We added` prefix, describe only the visible outcome, and preserve an appropriate reference.

## Fix Focus Areas
- CHANGELOG.md[68-68]

ⓘ 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

Fixed in 73489fa: shortened to 17 words before the link.

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

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit 7c5a93e

With a Turkish default locale, "FILE".toLowerCase() is "fıle" and the
duplicate detection (and the migration default-set match) missed
equivalent field names.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rutjr6iPghPfrMLgDzNLFL
@koppor
koppor marked this pull request as draft August 31, 2026 12:50
koppor and others added 3 commits August 31, 2026 14:51
A user-typed %-prefixed tab name is shown verbatim instead of being
treated as a localization key.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rutjr6iPghPfrMLgDzNLFL
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rutjr6iPghPfrMLgDzNLFL
An "Abstract"-named tab holding the General field set (or vice versa)
was never a shipped default and is kept as a customization.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rutjr6iPghPfrMLgDzNLFL
@koppor
koppor marked this pull request as ready for review August 31, 2026 12:59
This\ tab\ has\ no\ fields\ yet.=Cet onglet n'a pas encore de champs.
The\ field\ is\ contained\ in\ multiple\ tabs.=Le champ apparaît dans plusieurs onglets.
Remove\ field\ %0\ from\ currently\ selected\ tab=Supprimer le champ %0 de l'onglet actuellement sélectionné
A\ field\ name\ can\ also\ be\ a\ regular\ expression,\ e.g.\ "comment-.*".=Un nom de champ peut également être une expression régulière, par exemple "comment-.*".

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Action required

2. Translated bundles edited manually 📘 Rule violation ⚙ Maintainability

The PR manually removes an entry from the French and Italian translation bundles. JabRef's Crowdin
workflow requires localization-source changes to remain confined to JabRef_en.properties.
Agent Prompt
## Issue description
The PR directly edits translated localization bundles by deleting the obsolete regular-expression help key.

## Issue Context
PR Compliance ID 20 requires translated property files to remain unchanged so Crowdin can manage them.

## Fix Focus Areas
- jablib/src/main/resources/l10n/JabRef_fr.properties[2225-2225]
- jablib/src/main/resources/l10n/JabRef_it.properties[2222-2222]

ⓘ 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

Fixed in 73489fa: the hand-removed fr/it lines are restored; only JabRef_en.properties is edited, Crowdin will retire the obsolete translations.

Comment on lines +78 to +80
Locale defaultLocale = Locale.getDefault();
try {
Locale.setDefault(Locale.of("tr", "TR"));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Action required

3. Locale mutation lacks resource lock 📘 Rule violation ☼ Reliability

The new test changes the process-wide default Locale without acquiring the repository's
Localization.lang resource lock. Under parallel execution it can race localization-dependent tests
and cause nondeterministic results despite restoring the locale afterward.
Agent Prompt
## Issue description
The test mutates the JVM-wide default locale without coordinating with other parallel tests.

## Issue Context
Existing localization tests use JUnit's `@ResourceLock("Localization.lang")`; apply the same lock to this test method or class while retaining restoration in `finally`.

## Fix Focus Areas
- jabgui/src/test/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModelTest.java[73-90]

ⓘ 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

Fixed in 73489fa: the locale-mutating test is annotated @ResourceLock(Resources.LOCALE).

Comment on lines +89 to +90
assertFalse(names.contains(general.displayName()));
assertTrue(names.contains(Localization.lang("Abstract")));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Action required

4. Tab test asserts predicates 📘 Rule violation ⚙ Maintainability

The new test validates tab contents through assertFalse(names.contains(...)) and
assertTrue(names.contains(...)) instead of directly comparing expected values. This produces less
useful diagnostics and violates the prescribed object-content assertion style.
Agent Prompt
## Issue description
The test asserts computed `contains` predicates rather than the expected tab-name contents.

## Issue Context
PR Compliance ID 24 requires direct content or value assertions such as `assertEquals` when validating object state. Build the relevant actual tab-name collection and compare it to the expected names.

## Fix Focus Areas
- jabgui/src/test/java/org/jabref/gui/preferences/entryeditor/EntryEditorTabViewModelTest.java[88-90]

ⓘ 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

Fixed in 73489fa: the test now asserts the complete expected tab-name list via assertEquals.

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

Copy link
Copy Markdown
Contributor

Code review by qodo was updated up to the latest commit d77c616

@ThiloteE

Copy link
Copy Markdown
Member
grafik grafik grafik

@calixtus

Copy link
Copy Markdown
Member

?

@ThiloteE

Copy link
Copy Markdown
Member

Koppor asked me to review.
We can talk in the dev-call about the screenshots if you want.

@calixtus

Copy link
Copy Markdown
Member

I just require information what it is you want to talk about. Just screenshots are very mysterious, but not very helpful. And I won't be in the devcall tonight, im on vacation.

koppor and others added 2 commits August 31, 2026 19:52
- Locate the "Main" tab by built-in type, not display name (a custom tab
  may be named "Main")
- Assert the full tab list instead of contains-checks; guard the locale
  mutation with @ResourceLock(Resources.LOCALE)
- @NullMarked on the new test class; shorten the CHANGELOG entry to the
  20-word limit; restore the Crowdin-managed fr/it lines removed by hand

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

koppor commented Aug 31, 2026

Copy link
Copy Markdown
Member Author

DevCall: User whish wrongly understood.

#16598 introduced the issue.

@koppor

koppor commented Aug 31, 2026

Copy link
Copy Markdown
Member Author

🤖 Generated with Claude Code

Superseded by #16780: only the migration dropping the former default tabs is kept (now also covering JabRef ≤ 4.x defaults), without the "Add classic 5.x tabs" button — users upgrading from a default configuration get the reworked entry editor as-is.

@koppor
koppor deleted the drop-default-custom-tabs branch August 31, 2026 19:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

component: entry-editor component: preferences 📌 Pinned status: ready-for-review Pull Requests that are ready to be reviewed by the maintainers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants