Skip to content

SLR : Adding Routing Dispatch to StudyFetcher#16098

Open
faneeshh wants to merge 13 commits into
JabRef:mainfrom
faneeshh:slr-routing-dispatch
Open

SLR : Adding Routing Dispatch to StudyFetcher#16098
faneeshh wants to merge 13 commits into
JabRef:mainfrom
faneeshh:slr-routing-dispatch

Conversation

@faneeshh

Copy link
Copy Markdown
Collaborator

Related issues and pull requests

SLR related routing work.

PR Description

StudyFetcher previously sent every query through the standard search path regardless of catalog. This PR adds routing dispatch in performSearchOnQueryForFetcher: if a StudyQuery has a catalogSpecific override for the active fetcher, the raw query string is sent directly via performRawSearchQuery / performRawSearchQueryPaged, bypassing the query transformer.

If no override is present the standard path runs unchanged. This makes the catalogSpecific field in study.yml actually functional end-to-end.

Analogies

Like honey, this PR is specific to its source — each catalog gets exactly the query it was meant to receive, not a generic one-size-fits-all version. Like chocolate, it works in two forms (paged and plain) while tasting the same to the researcher writing their study definition. Like the moon, it only shows one face at a time — either the raw path or the standard path fires, never both.

Steps to test

  1. Create a study definition with a catalogSpecific override on a query for IEEEXplore
  2. Run a crawl and verify the IEEE results reflect the native query, not the transformed one
  3. Verify catalogs without a catalogSpecific entry still return results normally via the standard path
  4. Run StudyFetcherTest and all three tests should pass

AI usage

Claude Sonnet 4.6

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

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

Copy link
Copy Markdown
Contributor

PR Summary by Qodo

Add catalog-specific routing dispatch to StudyFetcher (raw query bypass)
✨ Enhancement 🧪 Tests 🕐 10-20 Minutes

Grey Divider

Description

• Route StudyQuery execution per fetcher using catalogSpecific native query overrides.
• Bypass query transformation when an override exists; preserve standard search path otherwise.
• Add unit tests covering paged, non-paged, and fallback behavior.
Diagram

graph TD
  A["StudyFetcher"] --> B["performSearchOnQueryForFetcher"] --> C{"catalogSpecific override?"}
  C -->|yes| D["Raw search"] --> E["SearchBasedFetcher / Paged"] --> F["FetchResult + QueryResult"]
  C -->|no| G["Standard search"] --> E
  subgraph Legend
    direction LR
    _proc["Process"] ~~~ _dec{"Decision"}
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Apply paging/limits to raw override path (symmetry with standard path)
  • ➕ Consistent result limiting behavior across override and non-override queries
  • ➕ Supports catalogs requiring multiple pages for complete results
  • ➖ Requires defining how to page native queries (some catalogs may not support it meaningfully)
  • ➖ Slightly more code and more test cases
2. Move routing into fetchers (strategy/policy per fetcher)
  • ➕ Keeps StudyFetcher orchestration simpler; fetcher owns interpretation of native query
  • ➕ Allows per-catalog nuance (paging, throttling, query validation) without StudyFetcher branching
  • ➖ More invasive refactor across multiple fetchers/interfaces
  • ➖ Harder to ensure consistent behavior in one place

Recommendation: The current approach is a good incremental step: it makes study.yml catalogSpecific functional end-to-end with minimal disruption. Consider a follow-up to clarify/align semantics for raw overrides on paged fetchers (e.g., whether to fetch multiple pages and enforce resultLimits) to avoid unexpected truncation or unbounded results depending on catalog behavior.

Files changed (2) +96 / -8

Enhancement (1) +17 / -8
StudyFetcher.javaDispatch to raw search APIs when a catalogSpecific override exists +17/-8

Dispatch to raw search APIs when a catalogSpecific override exists

• Adds a per-fetcher lookup of StudyQuery.catalogSpecific and routes execution accordingly. For paged fetchers, the override triggers performRawSearchQueryPaged; otherwise the existing paged + limit logic remains. For non-paged fetchers, the override triggers performRawSearchQuery; otherwise performSearch is used.

jablib/src/main/java/org/jabref/logic/crawler/StudyFetcher.java

Tests (1) +79 / -0
StudyFetcherTest.javaAdd unit tests for catalogSpecific routing behavior +79/-0

Add unit tests for catalogSpecific routing behavior

• Introduces tests verifying that catalogSpecific overrides call raw-search methods for both paged and plain fetchers and that the standard path is used when no override is present. Uses Mockito to assert the non-selected path is never invoked.

jablib/src/test/java/org/jabref/logic/crawler/StudyFetcherTest.java

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

qodo-free-for-open-source-projects Bot commented Jun 27, 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. Raw paged search ignores limits ✓ Resolved 📘 Rule violation ≡ Correctness
Description
When a catalogSpecific override is present for a PagedSearchBasedFetcher, the code only fetches
page 0 via performRawSearchQueryPaged(...) and bypasses the existing paging/limit logic used in
the standard path. This can silently truncate results (e.g., for IEEE where pageNumber affects
start_record) and makes override behavior inconsistent and harder to maintain and reason about.
Code

jablib/src/main/java/org/jabref/logic/crawler/StudyFetcher.java[R64-66]

+                if (catalogOverride != null) {
+                    fetchResult.addAll(basedFetcher.performRawSearchQueryPaged(catalogOverride, 0).getContent());
+                } else {
Evidence
The override branch introduces a special-case that hard-codes a single call to
performRawSearchQueryPaged(..., 0) instead of reusing the standard behavior that computes a
per-catalog limit (via DEFAULT_RESULT_LIMIT/resultLimits), iterates over `ceil(limit /
pageSize) pages, and truncates the final list to limit`, which conflicts with PR Compliance ID 3’s
requirement for maintainable, non-duplicated logic. This has real semantic impact because IEEE’s
paging logic derives start_record from pageNumber, so requesting only page 0 effectively caps
results to one page (often ~20) even when the default limit is higher (e.g., 100). Additionally, per
PR Compliance ID 16, tests should reflect behavior changes; the added/updated test asserts only a
single page-0 call in the override path and does not cover or validate the expected paging/limit
behavior for overrides.

AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions): AGENTS.md: Keep Code Small, Focused, and Maintainable (SRP, No Duplication, No Premature Abstractions)
AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Update Tests for Behavior Changes and Follow JabRef JUnit Conventions: AGENTS.md: Testing Standards: Up...

Comment thread jablib/src/main/java/org/jabref/logic/crawler/StudyFetcher.java Outdated
Comment on lines 62 to 84
String catalogOverride = searchQuery.getCatalogSpecific().get(fetcher.getName());
if (fetcher instanceof PagedSearchBasedFetcher basedFetcher) {
int limit = resultLimits.getOrDefault(fetcher.getName(), StudyRepository.DEFAULT_RESULT_LIMIT);
int pages = (int) Math.ceil((double) limit / basedFetcher.getPageSize());
for (int page = 0; page < pages; page++) {
fetchResult.addAll(basedFetcher.performSearchPaged(searchQuery.getQuery(), page).getContent());
}
if (fetchResult.size() > limit) {
fetchResult = new ArrayList<>(fetchResult.subList(0, limit));
if (catalogOverride != null) {
fetchResult.addAll(basedFetcher.performRawSearchQueryPaged(catalogOverride, 0).getContent());
} else {
int limit = resultLimits.getOrDefault(fetcher.getName(), StudyRepository.DEFAULT_RESULT_LIMIT);
int pages = (int) Math.ceil((double) limit / basedFetcher.getPageSize());
for (int page = 0; page < pages; page++) {
fetchResult.addAll(basedFetcher.performSearchPaged(searchQuery.getQuery(), page).getContent());
}
if (fetchResult.size() > limit) {
fetchResult = new ArrayList<>(fetchResult.subList(0, limit));
}
}
} else {
fetchResult = fetcher.performSearch(searchQuery.getQuery());
if (catalogOverride != null) {
fetchResult = fetcher.performRawSearchQuery(catalogOverride);
} else {
fetchResult = fetcher.performSearch(searchQuery.getQuery());
}
}
return new FetchResult(fetcher.getName(), new BibDatabase(fetchResult));
} catch (FetcherException e) {

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. Uncaught raw-query exceptions 🐞 Bug ☼ Reliability

StudyFetcher calls performRawSearchQuery/performRawSearchQueryPaged for catalogSpecific overrides
but only catches FetcherException; the default interface implementations throw
UnsupportedOperationException, which will escape and abort crawl processing. This makes a study.yml
override capable of crashing a crawl instead of cleanly skipping/falling back for an unmigrated
fetcher.
Agent Prompt
## Issue description
`StudyFetcher.performSearchOnQueryForFetcher` routes catalog-specific overrides to `performRawSearchQuery(...)` / `performRawSearchQueryPaged(...)`, but those raw methods default to throwing `UnsupportedOperationException` unless the fetcher overrides them. `StudyFetcher` only catches `FetcherException`, so the unchecked exception can propagate and abort the crawl.

## Issue Context
- `SearchBasedFetcher.performRawSearchQuery` and `PagedSearchBasedFetcher.performRawSearchQueryPaged` have default implementations that throw `UnsupportedOperationException`.
- A user can add `catalog-specific` entries in `study.yml` for a catalog that isn’t migrated to raw-query methods.

## Fix Focus Areas
- Add guarded execution + fallback/skip on `UnsupportedOperationException` (and possibly other runtime exceptions coming from fetchers) around the raw-query dispatch.
- Decide on policy: either **fallback to standard search path** when raw is unsupported, or **log and skip only that fetcher** (but do not crash the whole crawl).
- Update/add a unit test to cover this scenario (override present + fetcher not implementing raw => no crash).

### Code pointers
- jablib/src/main/java/org/jabref/logic/crawler/StudyFetcher.java[59-87]
- jablib/src/main/java/org/jabref/logic/importer/SearchBasedFetcher.java[42-45]
- jablib/src/main/java/org/jabref/logic/importer/PagedSearchBasedFetcher.java[31-34]
- jablib/src/test/java/org/jabref/logic/crawler/StudyFetcherTest.java[1-79]

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

@LoayTarek5 LoayTarek5 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

small things to address, great works as usual

Comment thread jablib/src/main/java/org/jabref/logic/crawler/StudyFetcher.java Outdated
private FetchResult performSearchOnQueryForFetcher(StudyQuery searchQuery, SearchBasedFetcher fetcher) {
try {
List<BibEntry> fetchResult = new ArrayList<>();
String catalogOverride = searchQuery.getCatalogSpecific().get(fetcher.getName());

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

this case sensitive lookup, but catalog and fetcher names match ignoring case, for example an override keyed ieeexplore silently misses and falls back to the translated query, i think it's good to addcase insensitive lookup to stay consistent with how catalog names are matched everywhere else

}
return new FetchResult(fetcher.getName(), new BibDatabase(fetchResult));
} catch (FetcherException e) {
} catch (FetcherException | UnsupportedOperationException e) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I think it wraps the whole try so a "UnsupportedOperationException" on the standard path also gets hidden as "API request failed", maybe better to scope it to just the raw call

also an override on unmigrated catalog returns zero results with only a log line is that intended, or should it fall back to the normal query?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

also an override on unmigrated catalog returns zero results with only a log line is that intended, or should it fall back to the normal query?

It's intentional behavior since falling back silently would be misleading to the user

@github-actions github-actions Bot added status: changes-required Pull requests that are not yet complete and removed status: no-bot-comments labels Jun 27, 2026

@LoayTarek5 LoayTarek5 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Also i notice that two behaviors are not covered
one for an override fetching multiple pages, respecting the limit
and other of an override on an unmigrated fetcher not crashing the crawl

@faneeshh

Copy link
Copy Markdown
Collaborator Author

I still need to update the tests to use the same pattern as noOverrideFallsBackToStandardPath( ) and write 2 new tests for the two behaviors that we just added.

@faneeshh faneeshh requested a review from LoayTarek5 June 28, 2026 00:42
@github-actions github-actions Bot added status: no-bot-comments and removed status: changes-required Pull requests that are not yet complete labels Jun 28, 2026

@LoayTarek5 LoayTarek5 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

almost done

Comment on lines +65 to +66
.findFirst()
.orElse(null);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

what if a study.yml entry has a key but no value, i think this throws NullPointerException, Optional can't wrap null, also blank value ("") is non-null too, so it would send an empty raw query and return nothing

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Good catch.

Comment on lines +68 to +90
if (catalogOverride != null) {
int limit = resultLimits.getOrDefault(fetcher.getName(), StudyRepository.DEFAULT_RESULT_LIMIT);
int pages = (int) Math.ceil((double) limit / basedFetcher.getPageSize());
try {
for (int page = 0; page < pages; page++) {
fetchResult.addAll(basedFetcher.performRawSearchQueryPaged(catalogOverride, page).getContent());
}
} catch (UnsupportedOperationException e) {
LOGGER.warn("{} does not support raw search queries", fetcher.getName(), e);
fetchResult = new ArrayList<>();
}
if (fetchResult.size() > limit) {
fetchResult = new ArrayList<>(fetchResult.subList(0, limit));
}
} else {
int limit = resultLimits.getOrDefault(fetcher.getName(), StudyRepository.DEFAULT_RESULT_LIMIT);
int pages = (int) Math.ceil((double) limit / basedFetcher.getPageSize());
for (int page = 0; page < pages; page++) {
fetchResult.addAll(basedFetcher.performSearchPaged(searchQuery.getQuery(), page).getContent());
}
if (fetchResult.size() > limit) {
fetchResult = new ArrayList<>(fetchResult.subList(0, limit));
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

These almost the same,only the method call differs, so maybe it better like collapsing into one loop that just picks the call.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

I think it's better to keep these loops separate for easier readability. The code duplication is minor anyways.

Comment on lines +37 to +41
when(pagedFetcher.performRawSearchQueryPaged(anyString(), anyInt()))
.thenReturn(new Page<>("native:query", 0, List.of()));
when(pagedFetcher.performRawSearchQueryPaged("native:query", 0))
.thenReturn(new Page<>("native:query", 0, List.of(new BibEntry())));

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The paged tests only page 0, so the multi-page loop (the thing that was fixed) isn't actually verified

Comment on lines +75 to +78
} catch (UnsupportedOperationException e) {
LOGGER.warn("{} does not support raw search queries", fetcher.getName(), e);
fetchResult = new ArrayList<>();
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

when an override a catalog not migrated to raw, it returns zero results for that query, for slr, should it fall back to the standard query instead of dropping the catalog?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

you are right, i agree that silent fallback would mislead, but the current path which zero results with just a log line means the since the user can't tell it happened(from what i understand)
for example let it throw a FetcherException to be visible, or record it in the study output, either way the user should know the catalog couldn't run their raw query.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

feel free to correct me, i may be missing something

@github-actions github-actions Bot added status: changes-required Pull requests that are not yet complete and removed status: no-bot-comments labels Jun 28, 2026
@github-actions github-actions Bot added status: no-bot-comments status: changes-required Pull requests that are not yet complete and removed status: changes-required Pull requests that are not yet complete status: no-bot-comments labels Jun 28, 2026
@faneeshh faneeshh force-pushed the slr-routing-dispatch branch from edcd873 to e48d353 Compare June 28, 2026 20:48
@github-actions github-actions Bot added status: no-bot-comments and removed status: changes-required Pull requests that are not yet complete labels Jun 30, 2026
Comment on lines +64 to +67
.map(Map.Entry::getValue)
.findFirst()
.filter(s -> !s.isBlank())
.orElse(null);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

the blank string case is handled now, but the null case is still there: findFirst() throws the NPE before the .filter runs, so study.yml entry with a key and no value still crashes,
the guard needs to be in the stream filter, before findFirst()

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

How did I miss that... Should be good now!

@github-actions github-actions Bot added status: changes-required Pull requests that are not yet complete and removed status: no-bot-comments labels Jun 30, 2026
@github-actions github-actions Bot added status: no-bot-comments and removed status: changes-required Pull requests that are not yet complete labels Jun 30, 2026
@faneeshh faneeshh requested a review from LoayTarek5 July 1, 2026 04:19
LoayTarek5
LoayTarek5 previously approved these changes Jul 1, 2026

@LoayTarek5 LoayTarek5 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM to me, great and solid work, @faneeshh

@LoayTarek5 LoayTarek5 added the status: awaiting-second-review For non-trivial changes label Jul 2, 2026
.map(Map.Entry::getValue)
.filter(v -> v != null && !v.isBlank())
.findFirst()
.orElse(null);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

no null in the code. -- Use Optionals. ispresent check seems to be ok in this case.

The blocks below could be split in sub methods.

@github-actions github-actions Bot added status: changes-required Pull requests that are not yet complete and removed status: awaiting-second-review For non-trivial changes status: no-bot-comments labels Jul 3, 2026
@github-actions github-actions Bot added status: no-bot-comments status: changes-required Pull requests that are not yet complete and removed status: changes-required Pull requests that are not yet complete status: no-bot-comments labels Jul 5, 2026
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Your pull request conflicts with the target branch.

Please merge with your code. For a step-by-step guide to resolve merge conflicts, see https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/resolving-a-merge-conflict-using-the-command-line.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status: changes-required Pull requests that are not yet complete

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants