Skip to content

minor bug fixes#22

Merged
AlanRockefeller merged 2 commits intomainfrom
test
Dec 8, 2025
Merged

minor bug fixes#22
AlanRockefeller merged 2 commits intomainfrom
test

Conversation

@AlanRockefeller
Copy link
Copy Markdown
Owner

@AlanRockefeller AlanRockefeller commented Dec 8, 2025

Summary by CodeRabbit

  • Bug Fixes

    • Fixed undo for auto-levels so restored images and UI state are correctly recovered
    • Corrected clockwise/counter‑clockwise rotation behavior
  • Improvements

    • Improved image downsampling quality for clearer thumbnails/previews
    • Dialog lifecycle guarded to avoid null dereferences, improving UI stability
    • Aspect ratio and rotate labels adapt to dark/light themes
    • EXIF extraction made more robust and safer with improved file handling

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Dec 8, 2025

Walkthrough

Adds undo handling for "auto_levels", swaps clockwise/counter-clockwise rotation direction, improves JPEG downsampling quality, tightens resource handling and typing, small UI/theme null-safety tweaks, updates SidecarManager constructor usage, and adjusts tests and cleanup logic.

Changes

Cohort / File(s) Summary
Undo/Delete: auto_levels
faststack/faststack/app.py
Adds handling for action_type "auto_levels" in AppController.undo_delete: restores backup image when available, refreshes image list and current index, bumps display generation, clears/repopulates caches, cancels and re-triggers prefetching, syncs UI state, conditionally updates histogram, updates status, and re-adds undo entry or logs warning if backup missing.
Rotation behavior
faststack/faststack/imaging/editor.py
Swaps rotation semantics: rotate_image_cw now applies -90° and rotate_image_ccw now applies +90° (docstrings updated and redundant check removed).
JPEG resampling
faststack/faststack/imaging/jpeg.py
Changes Pillow downsampling filter in decode_jpeg_resized from BILINEAR to LANCZOS for the slower downscale path.
Cache typing & logging
faststack/faststack/imaging/cache.py
Makes on_evict parameter Optional[Callable[[], None]]; logs a warning when get_decoded_image_size encounters an unexpected item type and returns conservative size.
EXIF resource handling
faststack/faststack/imaging/metadata.py
Uses context-managed with Image.open(path) as img for EXIF extraction and documents a defensive broad-except for EXIF parsing.
Prefetch comments
faststack/faststack/imaging/prefetch.py
Removes two redundant comment lines in Prefetcher.submit_task (no behavioral change).
QML theme and dialog null checks
faststack/faststack/qml/Components.qml, faststack/faststack/qml/ExifDialog.qml
Switches two Text color properties to aspectRatioWindow.isDark ? "white" : "black"; guards controller.dialog_opened() and controller.dialog_closed() with if (controller) checks.
Sidecar constructor & UI validation
faststack/faststack/io/sidecar.py, faststack/faststack/ui/provider.py
SidecarManager constructor updated to accept an optional second parameter (tests adjusted); UIState.currentCropBox setter now validates length==4 and numeric element types, warns and rejects otherwise.
Tests and cleanup
faststack/faststack/tests/test_new_features.py, faststack/faststack/tests/test_sidecar.py, faststack/faststack/verify_wb.py
Adjusts test image ranges and assertions to use approximate checks and magnitude comparisons; updates SidecarManager test initialization to pass None as second arg; consolidates cleanup loop with OSError handling.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant UI as UI (QML)
    participant App as AppController
    participant FS as Filesystem / Image Storage
    participant Cache as ByteLRUCache
    participant Prefetch as Prefetcher

    UI->>App: user triggers Undo (auto_levels)
    App->>FS: check for backup image path
    alt backup exists
        FS-->>App: backup bytes
        App->>App: restore image bytes into workspace
        App->>Cache: clear display caches
        App->>Cache: repopulate caches with restored image
        App->>App: update current_index, display_generation
        App->>Prefetch: cancel outstanding prefetch tasks
        App->>Prefetch: enqueue prefetch for restored image
        App->>UI: sync_ui_state(), update histogram (if needed)
        App->>UI: set status "restore complete"
    else backup missing
        App->>App: log warning
        App->>UI: set status "restore failed"
        App->>App: re-add undo record for potential retry
    end
    Prefetch-->>Cache: deliver prefetched decoded images (async)
    Cache-->>UI: responses for display requests
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Heterogeneous changes across imaging, UI, app control flow, and tests require context switching.
  • Pay attention to:
    • AppController.undo_delete — verify state synchronization, error paths, and that cache/prefetch interactions don't race.
    • Rotation semantics in editor.py — ensure UI/tests expecting previous behavior are updated.
    • SidecarManager constructor change — trace call sites beyond tests.
    • JPEG resampling change — validate quality/performance trade-offs where decode path is used.

Possibly related PRs

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 68.42% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive The title 'minor bug fixes' is vague and generic, failing to describe the specific changes made in the changeset. Use a more descriptive title that identifies the primary focus of changes, such as 'Fix auto_levels undo handling and rotate image direction' or specify the main bug being addressed.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch test

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Nitpick comments (2)
faststack/faststack/ui/provider.py (1)

680-711: Crop box normalization + length guard look solid; optional extra validation

The normalization plus the “4‑element tuple only” guard is a good defensive boundary between QML and Python and should prevent most bad inputs from propagating.

If you ever see weird crop values coming from QML or plugins, you might optionally harden this further by validating element types (and possibly ranges) before accepting:

-        # only accept 4-element tuples
-        if not isinstance(new_value, tuple) or len(new_value) != 4:
-            log.warning("UIState.currentCropBox: ignoring invalid crop box %r", new_value)
-            return 
+        # only accept 4-element tuples of numeric values
+        if (
+            not isinstance(new_value, tuple)
+            or len(new_value) != 4
+            or not all(isinstance(v, (int, float)) for v in new_value)
+        ):
+            log.warning("UIState.currentCropBox: ignoring invalid crop box %r", new_value)
+            return

Purely optional; current behavior is already correct and safe.

faststack/faststack/tests/test_new_features.py (1)

39-46: Auto-levels assertions are effectively tautological now

b_scaled and w_scaled are defined as blacks * strength / whites * strength, and the assertions then compare them against the exact same expressions. Aside from catching NaN/inf, these checks don’t validate any real behavior of auto_levels or the strength scaling.

Given the comments about “meaningful values” and expected behavior, it would be more useful for this test to assert properties of blacks/whites or their scaled values (e.g., ranges, ordering, or non-triviality) rather than re-checking an identity.

Consider tightening these assertions so they fail if auto_levels regresses but still allow some numerical slack.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8782406 and fef9f4b.

📒 Files selected for processing (12)
  • faststack/faststack/app.py (1 hunks)
  • faststack/faststack/imaging/cache.py (3 hunks)
  • faststack/faststack/imaging/editor.py (1 hunks)
  • faststack/faststack/imaging/jpeg.py (1 hunks)
  • faststack/faststack/imaging/metadata.py (1 hunks)
  • faststack/faststack/imaging/prefetch.py (0 hunks)
  • faststack/faststack/qml/Components.qml (2 hunks)
  • faststack/faststack/qml/ExifDialog.qml (1 hunks)
  • faststack/faststack/tests/test_new_features.py (1 hunks)
  • faststack/faststack/tests/test_sidecar.py (3 hunks)
  • faststack/faststack/ui/provider.py (1 hunks)
  • faststack/faststack/verify_wb.py (1 hunks)
💤 Files with no reviewable changes (1)
  • faststack/faststack/imaging/prefetch.py
🧰 Additional context used
📓 Path-based instructions (5)
faststack/faststack/**/*.py

📄 CodeRabbit inference engine (faststack/faststack/AGENTS.md)

faststack/faststack/**/*.py: Use four-space indentation in Python files
Use trailing commas for multi-line structures in Python
Use descriptive snake_case identifiers for variables and functions in Python
Use CamelCase exclusively for class names and Qt signal names in Python
Include type hints in all Python code as seen in models.py and AppController
Every new Python module should expose a top-level log = logging.getLogger(__name__) logger
Format Python code with Black before opening a pull request
Lint Python code with Ruff before opening a pull request
Prefer relative paths in configuration and file handling

Files:

  • faststack/faststack/tests/test_sidecar.py
  • faststack/faststack/tests/test_new_features.py
  • faststack/faststack/imaging/cache.py
  • faststack/faststack/ui/provider.py
  • faststack/faststack/verify_wb.py
  • faststack/faststack/imaging/editor.py
  • faststack/faststack/app.py
  • faststack/faststack/imaging/jpeg.py
  • faststack/faststack/imaging/metadata.py
faststack/faststack/**/test_*.py

📄 CodeRabbit inference engine (faststack/faststack/AGENTS.md)

faststack/faststack/**/test_*.py: Place new test cases in test_*.py files located beside the modules being tested
Mock filesystem and Qt dependencies in tests to keep them deterministic
Mark tests that perform long disk scans with pytest.mark.slow

Files:

  • faststack/faststack/tests/test_sidecar.py
  • faststack/faststack/tests/test_new_features.py
faststack/faststack/imaging/**/*.py

📄 CodeRabbit inference engine (faststack/faststack/AGENTS.md)

Cover every new branch in imaging/ or io/ modules with focused pytest test cases

Files:

  • faststack/faststack/imaging/cache.py
  • faststack/faststack/imaging/editor.py
  • faststack/faststack/imaging/jpeg.py
  • faststack/faststack/imaging/metadata.py
faststack/faststack/ui/**/*.py

📄 CodeRabbit inference engine (faststack/faststack/AGENTS.md)

Treat drag-and-drop helpers like make_hdrop as security-sensitive and validate all user-supplied paths before invoking external tools

Files:

  • faststack/faststack/ui/provider.py
faststack/faststack/**/app.py

📄 CodeRabbit inference engine (faststack/faststack/AGENTS.md)

app.py is the PySide6 entrypoint that coordinates image indexing, caching, and QML screens

Files:

  • faststack/faststack/app.py
🧠 Learnings (9)
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/**/benchmark_*.py : When adding performance heuristics, pair the change with an updated benchmark script or validation notes

Applied to files:

  • faststack/faststack/tests/test_new_features.py
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/**/test_*.py : Mock filesystem and Qt dependencies in tests to keep them deterministic

Applied to files:

  • faststack/faststack/verify_wb.py
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/**/*.py : Prefer relative paths in configuration and file handling

Applied to files:

  • faststack/faststack/verify_wb.py
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/**/*.py : Use descriptive snake_case identifiers for variables and functions in Python

Applied to files:

  • faststack/faststack/verify_wb.py
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/**/*.py : Format Python code with Black before opening a pull request

Applied to files:

  • faststack/faststack/verify_wb.py
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/**/test_*.py : Place new test cases in `test_*.py` files located beside the modules being tested

Applied to files:

  • faststack/faststack/verify_wb.py
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/io/**/*.py : Cover every new branch in `imaging/` or `io/` modules with focused `pytest` test cases

Applied to files:

  • faststack/faststack/verify_wb.py
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/io/**/*.py : Validate all user-supplied paths before invoking external tools such as Helicon Focus

Applied to files:

  • faststack/faststack/verify_wb.py
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/**/app.py : `app.py` is the PySide6 entrypoint that coordinates image indexing, caching, and QML screens

Applied to files:

  • faststack/faststack/app.py
🧬 Code graph analysis (2)
faststack/faststack/tests/test_new_features.py (1)
faststack/faststack/ui/provider.py (4)
  • blacks (795-796)
  • blacks (799-802)
  • whites (805-806)
  • whites (809-812)
faststack/faststack/imaging/editor.py (2)
faststack/faststack/config.py (1)
  • get (84-85)
faststack/faststack/app.py (1)
  • rotate_image_ccw (2281-2287)
🔇 Additional comments (11)
faststack/faststack/imaging/jpeg.py (1)

167-173: LANCZOS fallback change looks correct; confirm performance on real workloads

The switch to Image.Resampling.LANCZOS for scale_factor_ratio <= 4 aligns with the comment and should improve quality for moderate downscales/upsamples, while still using faster BILINEAR for very large downscales. Please sanity‑check that this doesn’t introduce unacceptable latency in your typical Pillow‑fallback paths (e.g., large images resized only modestly).

faststack/faststack/qml/ExifDialog.qml (1)

28-41: Defensive controller guards on open/close are appropriate

Wrapping controller.dialog_opened() / controller.dialog_closed() in if (controller) { ... } is a good defensive fix and avoids runtime errors when the dialog is used in contexts where controller isn’t bound, without changing normal behavior when it is present.

faststack/faststack/qml/Components.qml (1)

814-819: Theme-aware text colors in aspect ratio panel look good

Switching these Text colors to aspectRatioWindow.isDark ? "white" : "black" makes the aspect ratio header, entries, and “Rotate” label readable in both dark and light themes and is consistent with the panel’s background/border theming. No functional regressions visible.

Also applies to: 830-837, 860-867

faststack/faststack/imaging/metadata.py (2)

56-58: LGTM: Appropriate use of broad exception handling.

The broad exception catch with the noqa: BLE001 comment is reasonable here. EXIF parsing can fail in unpredictable ways (corrupted data, unsupported formats, malformed tags), and the function has a safe fallback behavior (returning empty dictionaries and logging a warning). This is good defensive programming.


52-53: The review comment is factually incorrect. _getexif() was not removed in Pillow 10.0.0. The method remains functional and continues to work as expected with Pillow 10.x. While getexif() was introduced as a public API in Pillow 6.0/8.2.0 as an alternative, _getexif() was never deprecated or removed. The code is currently working in production with Pillow 10.x, and the diff suggestion is unnecessary.

Likely an incorrect or invalid review comment.

faststack/faststack/imaging/cache.py (2)

5-5: LGTM: Type hint improvements enhance code clarity.

The addition of Optional to the typing imports and the explicit typing of the on_evict parameter improve type safety and align with the coding guidelines' requirement for comprehensive type hints.

Also applies to: 19-19


7-7: > Likely an incorrect or invalid review comment.

faststack/faststack/verify_wb.py (1)

59-63: Consolidated cleanup loop looks good

The shared for path in [black_path, grey_path] cleanup with OSError handling keeps behavior the same while reducing duplication and avoiding failures if files are already gone or locked. Suits this helper script well.

faststack/faststack/tests/test_sidecar.py (1)

23-24: SidecarManager constructor updates correctly track the new signature

Adapting all test call sites to SidecarManager(d, None) matches the updated __init__(directory, extra=None) API without changing test semantics. This keeps the tests aligned with the production code while preserving existing expectations.

Also applies to: 39-40, 50-51, 70-71

faststack/faststack/app.py (1)

1767-1806: auto_levels undo branch is consistent with existing undo flows

The new "auto_levels" branch correctly mirrors the backup-restore pattern used for auto white balance and crop:

  • Restores the backup (unlink + rename) only if it exists, with robust OSError handling.
  • Refreshes the image list, repositions current_index, bumps display_generation, clears cache, and restarts prefetching before syncing UI.
  • Additionally refreshes the histogram when visible, which matches how auto-level operations affect the displayed image.

This neatly closes the loop for quick_auto_levels actions recorded in undo_history.

faststack/faststack/imaging/editor.py (1)

467-470: The rotation direction change is correct and consistent with the existing app.py implementation.

The new code in rotate_image_cw() (adding 90) and rotate_image_ccw() (subtracting 90) matches the existing, documented behavior in app.py (lines 2274-2287). This PR brings editor.py into alignment with the controller logic. There is no rotation direction bug here—this is a consistency fix as indicated by the "minor bug fixes" commit message.

Comment thread faststack/faststack/imaging/cache.py
Comment thread faststack/faststack/imaging/editor.py Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
faststack/faststack/ui/provider.py (1)

705-710: Good defensive validation on currentCropBox; optional bounds clamp

The new checks correctly reject non-tuples, wrong lengths, or non‑numeric elements and keep the last valid crop box, which is safe for execute_crop and other consumers.

If you want to harden further, you could also clamp each value into the expected 0–1000 range here so downstream code never sees out‑of‑range coordinates, but that’s optional.

faststack/faststack/app.py (1)

1767-1806: undo_auto_levels correctly mirrors other undo flows and refreshes UI/cache

The new "auto_levels" undo branch is wired cleanly into undo_delete and follows the same pattern as the AWB and crop undo branches:

  • Restores the backup atomically with unlink() + rename().
  • Rescans images, relocates current_index to the restored file, bumps display_generation, clears cache, cancels/restarts prefetch, and calls sync_ui_state().
  • On success, also refreshes the histogram when visible and updates the status message.
  • On missing backup or OSError, logs, shows status, and re‑adds the undo record so the operation remains retryable.

This fits the existing undo model and looks sound. One optional improvement would be to apply the same histogram refresh in the "auto_white_balance" branch for symmetry.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fef9f4b and 49d3e04.

📒 Files selected for processing (4)
  • faststack/faststack/app.py (2 hunks)
  • faststack/faststack/imaging/editor.py (1 hunks)
  • faststack/faststack/tests/test_new_features.py (1 hunks)
  • faststack/faststack/ui/provider.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • faststack/faststack/tests/test_new_features.py
🧰 Additional context used
📓 Path-based instructions (4)
faststack/faststack/**/*.py

📄 CodeRabbit inference engine (faststack/faststack/AGENTS.md)

faststack/faststack/**/*.py: Use four-space indentation in Python files
Use trailing commas for multi-line structures in Python
Use descriptive snake_case identifiers for variables and functions in Python
Use CamelCase exclusively for class names and Qt signal names in Python
Include type hints in all Python code as seen in models.py and AppController
Every new Python module should expose a top-level log = logging.getLogger(__name__) logger
Format Python code with Black before opening a pull request
Lint Python code with Ruff before opening a pull request
Prefer relative paths in configuration and file handling

Files:

  • faststack/faststack/app.py
  • faststack/faststack/imaging/editor.py
  • faststack/faststack/ui/provider.py
faststack/faststack/**/app.py

📄 CodeRabbit inference engine (faststack/faststack/AGENTS.md)

app.py is the PySide6 entrypoint that coordinates image indexing, caching, and QML screens

Files:

  • faststack/faststack/app.py
faststack/faststack/imaging/**/*.py

📄 CodeRabbit inference engine (faststack/faststack/AGENTS.md)

Cover every new branch in imaging/ or io/ modules with focused pytest test cases

Files:

  • faststack/faststack/imaging/editor.py
faststack/faststack/ui/**/*.py

📄 CodeRabbit inference engine (faststack/faststack/AGENTS.md)

Treat drag-and-drop helpers like make_hdrop as security-sensitive and validate all user-supplied paths before invoking external tools

Files:

  • faststack/faststack/ui/provider.py
🧠 Learnings (2)
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/**/app.py : `app.py` is the PySide6 entrypoint that coordinates image indexing, caching, and QML screens

Applied to files:

  • faststack/faststack/app.py
📚 Learning: 2025-12-08T04:46:41.603Z
Learnt from: CR
Repo: AlanRockefeller/faststack PR: 0
File: faststack/faststack/AGENTS.md:0-0
Timestamp: 2025-12-08T04:46:41.603Z
Learning: Applies to faststack/faststack/ui/**/*.py : Treat drag-and-drop helpers like `make_hdrop` as security-sensitive and validate all user-supplied paths before invoking external tools

Applied to files:

  • faststack/faststack/ui/provider.py
🔇 Additional comments (2)
faststack/faststack/imaging/editor.py (1)

467-475: Rotation helpers and docstrings are now internally consistent

The docstrings for rotate_image_cw and rotate_image_ccw correctly describe the existing (current -/+ 90) % 360 behavior and are consistent with the controller’s rotation methods and _apply_edits logic. No further changes needed.

faststack/faststack/app.py (1)

2273-2285: Rotation direction in controller now matches editor semantics

rotate_image_cw now decrements rotation by 90° and rotate_image_ccw increments by 90°, modulo 360, matching ImageEditor.rotate_image_cw/ccw and the way _apply_edits interprets the rotation field. This resolves the previous clockwise/counter‑clockwise inversion between controller and editor without changing the public API.

@AlanRockefeller AlanRockefeller merged commit 3ccbece into main Dec 8, 2025
1 check passed
This was referenced Jan 24, 2026
@coderabbitai coderabbitai Bot mentioned this pull request Apr 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant