Conversation
The synchronizer keeps the inbound direction and the lifecycle; SidecarWriteBack writes sidecars (including the pair rename), BibMirror maintains the .bib mirror and its merge-back, PendingWrites debounces and retries writes, and TrackedFiles holds the fingerprints and merge bases both directions share. Public API and behaviour are unchanged; the package gets its package-info. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Vr3E1Gg5DRU4LQDDVnhPys
Fixes the CI format check. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DDcHNMt9fPWnpYaHheFvry
Resolve the synchronizer split against the upstream resync. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DDcHNMt9fPWnpYaHheFvry
Upstream added a 0071 ADR after this stack claimed the number, so the MADR duplicate-ID check failed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This was referenced Sep 7, 2026
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CajtxjcCEjS87f4hoTBTJD
31 tasks
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
🤖 The directory-library synchronizer had grown to about 1100 lines with six responsibilities, so every layer of the stack kept editing the same class and reviews and merges suffered. It now keeps the inbound direction and lifecycle while separate collaborators handle writing sidecars, maintaining the
.bibmirror, debouncing writes, and the shared file bookkeeping. Behaviour and public API are unchanged.jabref-contrib-policy:4.2:reviewed:okAnalogies
Like honey, the split is slow-poured but leaves each class sweetly single-purpose. Like chocolate, it breaks along the lines that were already there, one square per responsibility. And like the moon, the synchronizer still shows the same face to its callers while the collaborators do the pulling behind it.
Steps to test
.bibmirror externally and check the change is merged into the library.No visible UI change, hence no screenshot.
Related issues and pull requests
Stacked on #745 (base branch
directory-rest-api). Closes NAAI usage
Claude Code (model claude-fable-5-1), AIL4.
AI CHECKLIST.md walkthrough
1. Code self-review
Nullability and control flow
== null/!= nullchecks — JSpecify annotations used instead.Objects.requireNonNull(...).@NullMarked.Optionalconsumed withifPresent/ifPresentOrElse/map/orElseThrow.StringUtil.isBlank(...)— no null-or-blank checks needed.Exceptions
catch (Exception e).throw new RuntimeException(...)/IllegalStateException(...).Style and idioms
BibEntryobjects in tests (tests unchanged).List.of(),SequencedSet, unnamed lambda parameters.///) with Markdown syntax.User-facing text
Security
Tests
DirectoryLibrarySynchronizerTest(43 tests) andServerUtilsTestcover the moved code and pass unchanged.@DisplayName,@TempDir.2. Verification commands
./gradlew :jablib:test --tests 'org.jabref.logic.directorylibrary.*'and:jabsrv:test --tests '*ServerUtilsTest'./gradlew :jablib:checkstyleMain :jablib:checkstyleTest :jabgui:checkstyleMain :jabsrv:checkstyleMain./gradlew modernizer— not run separately (part of CI)../gradlew --no-configuration-cache :rewriteRunreports no changes../gradlew traceRequirements3. Documentation
CHANGELOG.mdentry: internal refactoring of an unreleased feature.package-info.javaadded fororg.jabref.logic.directorylibrary.4. Pull request
.github/PULL_REQUEST_TEMPLATE.md, every section filled.--body-file.TODOplaceholder inCHANGELOG.md.Checklist
DirectoryLibrarySynchronizerTest+ServerUtilsTestcases, all greenCHANGELOG.mddescribing the change from the user's point of view (if the change is visible to the user)🤖 Generated with Claude Code
https://claude.ai/code/session_01Vr3E1Gg5DRU4LQDDVnhPys