Skip to content

[FEAT] Introduced RequireAllPeople flag to filter assets for people in an AND fashion#626

Open
FlorianObermayer wants to merge 23 commits into
immichFrame:mainfrom
FlorianObermayer:Feat/Add-RequireAllPeople-setting-for-AND-based-person-filtering
Open

[FEAT] Introduced RequireAllPeople flag to filter assets for people in an AND fashion#626
FlorianObermayer wants to merge 23 commits into
immichFrame:mainfrom
FlorianObermayer:Feat/Add-RequireAllPeople-setting-for-AND-based-person-filtering

Conversation

@FlorianObermayer

@FlorianObermayer FlorianObermayer commented Apr 11, 2026

Copy link
Copy Markdown

This pull request introduces a new RequireAllPeople setting that changes how ImmichFrame filters assets by person.

Before: Assets are returned if they feature any of the configured people (OR logic).
After: When RequireAllPeople: true is set, only assets featuring all configured people are returned (AND logic).

This is useful for finding shared moments — for example, only showing photos where both Person A and Person B appear together.

Usage:

People:
  - <person-id-1>
  - <person-id-2>
RequireAllPeople: true

Summary by CodeRabbit

  • New Features
    • Added a RequireAllPeople account setting. When enabled, images must match all listed people; when disabled (default), images match any listed person.
  • Documentation
    • Updated configuration docs and example files to include RequireAllPeople.
  • Bug Fixes
    • Improved asset-loading error handling (images/videos) and surfaced errors via a new optional callback.
    • Memory timing and progress-completion behavior were adjusted for more reliable UI updates.
  • Tests
    • Added coverage for the new people-filtering behavior, including pagination and zero-result handling.

@coderabbitai

coderabbitai Bot commented Apr 11, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds RequireAllPeople boolean setting to IAccountSettings for AND-style people filtering, updates PeopleAssetsPool to group queries accordingly, and adds comprehensive backend wiring with tests and config examples. Enhances web UI with asset error callbacks, refactors progress bar to use direct Tween animation, and strengthens home-page asset handling with video stall detection, consecutive error skipping, and transition-watchdog timeout. Also updates MemoryAssetsPool to use current time instead of UTC midnight for memory search.

Changes

RequireAllPeople Filter Mode

Layer / File(s) Summary
IAccountSettings contract and PeopleAssetsPool query grouping
ImmichFrame.Core/Interfaces/IServerSettings.cs, ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs
IAccountSettings gains bool RequireAllPeople { get; }. LoadAssets builds personIdGroups as either a single all-IDs list or per-person lists based on the flag, then iterates groups and sets MetadataSearchDto.PersonIds from each group.
Settings models and adapter wiring
ImmichFrame.WebApi/Models/ServerSettings.cs, ImmichFrame.WebApi/Helpers/Config/ServerSettingsV1.cs
ServerAccountSettings and ServerSettingsV1 each add RequireAllPeople defaulting to false. AccountSettingsV1Adapter implements the property via delegation to satisfy IAccountSettings.
PersonAssetsPool unit tests for RequireAllPeople
ImmichFrame.Core.Tests/Logic/Pool/PersonAssetsPoolTests.cs
Three new NUnit tests verify: single shared query with both PersonIds (count==2), pagination across two pages aggregating results, and empty-result short-circuit with exactly one search call.
Test fixtures, config examples, and documentation
ImmichFrame.WebApi.Tests/Resources/*, docker/Settings.example.*, docker/example.env, docs/docs/getting-started/configuration.md
Test JSON/YAML fixtures add RequireAllPeople: true. Docker example files and env template add RequireAllPeople: false. Docs describe the new AND-filter boolean field.

Web UI Asset Error Handling and Animation Improvements

Layer / File(s) Summary
Asset component error callback propagation
immichFrame.Web/src/lib/components/elements/asset-component.svelte, immichFrame.Web/src/lib/components/elements/asset.svelte
Both components add optional onAssetError callback prop. Video and image elements gain onerror handlers that log failures and invoke the callback, replacing prior video-only error logging with no image handler. Animation duration is now computed via $derived.by using untrack to stabilize across zoom/pan reactivity.
Progress bar Tween-based animation
immichFrame.Web/src/lib/components/elements/progress-bar.svelte
Switches from Svelte tweened store ($progress) to direct Tween instance (progress.current) with custom duration. Completion detection uses $effect tracking a completed flag and handles async onDone callbacks with error logging. Pause freezes motion by setting tween to current value. Template width derives from progress.current.
Home-page asset state, video stall detection, and error recovery
immichFrame.Web/src/lib/components/home-page/home-page.svelte
Adds timing constants and refactors asset buffering to reactive $state arrays. Introduces error counter and timer state for consecutive failures, replaces simple transition guard with epoch-based lock and watchdog timeout that force-resets on hangs. Promise cleanup switches to non-blocking forEach/then/catch. Video handling expands with onVideoWaiting stall timeout scheduling, onVideoPlaying timeout clearing and progress resume, and onAssetError throttled skipping. Removes reactive-store clones and clears all timers on teardown.

MemoryAssetsPool Date Reference

Layer / File(s) Summary
MemoryAssetsPool searchDate initialization
ImmichFrame.Core/Logic/Pool/MemoryAssetsPool.cs
Switches searchDate from constructing a UTC-midnight DateTimeOffset from DateTime.Today to using DateTimeOffset.Now directly, changing the temporal reference for memory search and yearsAgo calculation.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

  • immichFrame/ImmichFrame#632: Modifies MemoryAssetsPool.LoadAssets to use DateTimeOffset.Now instead of UTC-midnight timestamp, the same behavior change as this PR.
  • immichFrame/ImmichFrame#637: Adds onAssetError callback wiring in asset-component.svelte and related asset error handling, directly overlapping the web UI error callback changes.
  • immichFrame/ImmichFrame#535: Modifies PeopleAssetsPool.LoadAssets for null/empty people handling, directly touching the same core pool method and test file.

Suggested reviewers

  • JW-CH

Poem

🐇 Hop through the photo stream with care,
AND filters find each matching pair.
Videos stall? The watchdog springs!
Progress bar glides on Tween's swift wings.
Error handlers catch each frame—
Robustness is the UI's game! 🎬✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main feature: introducing a RequireAllPeople flag that enables AND-style filtering for assets matching multiple people, which is the primary change across all modified files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@FlorianObermayer FlorianObermayer marked this pull request as ready for review April 11, 2026 09:28

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs (1)

12-23: ⚠️ Potential issue | 🟠 Major

Guard against empty People in AND mode to avoid unintended search calls.

At Line 21, RequireAllPeople=true with an empty people list creates a single empty group and still executes SearchAssetsAsync. Add an early Count == 0 return to keep filtering behavior safe and predictable.

💡 Proposed fix
         var people = accountSettings.People;
-        if (people == null)
+        if (people == null || people.Count == 0)
         {
             return personAssets;
         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs` around lines 12 - 23, The
code builds personIdGroups from accountSettings.People and in AND mode
(accountSettings.RequireAllPeople) it can create a single empty group causing
SearchAssetsAsync to run; add an early guard after the null check that if
accountSettings.RequireAllPeople is true and accountSettings.People.Count == 0
then return personAssets immediately to avoid performing searches for an empty
people list; update the logic around personIdGroups, RequireAllPeople, and the
call sites that use personIdGroups/SearchAssetsAsync so the empty-case is
short-circuited.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs`:
- Around line 12-23: The code builds personIdGroups from accountSettings.People
and in AND mode (accountSettings.RequireAllPeople) it can create a single empty
group causing SearchAssetsAsync to run; add an early guard after the null check
that if accountSettings.RequireAllPeople is true and
accountSettings.People.Count == 0 then return personAssets immediately to avoid
performing searches for an empty people list; update the logic around
personIdGroups, RequireAllPeople, and the call sites that use
personIdGroups/SearchAssetsAsync so the empty-case is short-circuited.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e668ca15-c79d-4a15-8e79-6f1c171e5712

📥 Commits

Reviewing files that changed from the base of the PR and between 265a890 and 2ba1121.

📒 Files selected for processing (10)
  • ImmichFrame.Core.Tests/Logic/Pool/PersonAssetsPoolTests.cs
  • ImmichFrame.Core/Interfaces/IServerSettings.cs
  • ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs
  • ImmichFrame.WebApi.Tests/Resources/TestV1.json
  • ImmichFrame.WebApi.Tests/Resources/TestV2.json
  • ImmichFrame.WebApi.Tests/Resources/TestV2.yml
  • ImmichFrame.WebApi.Tests/Resources/TestV2_NoGeneral.json
  • ImmichFrame.WebApi/Helpers/Config/ServerSettingsV1.cs
  • ImmichFrame.WebApi/Models/ServerSettings.cs
  • docs/docs/getting-started/configuration.md

@3rob3 3rob3 added the enhancement New feature or request label Apr 11, 2026
@3rob3

3rob3 commented Apr 11, 2026

Copy link
Copy Markdown
Collaborator

Nice! This LGTM. Can you also add the new setting to the examples please (they are in the docker folder).
example.env
settings.example.json
settings.example.yml

@FlorianObermayer FlorianObermayer force-pushed the Feat/Add-RequireAllPeople-setting-for-AND-based-person-filtering branch from 2ba1121 to 7c6dfa2 Compare April 11, 2026 23:12

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs (1)

48-52: ⚠️ Potential issue | 🟠 Major

Pagination condition uses the wrong signal and can drop pages.

Line 52 compares total to batchSize; this usually reflects global match count, not items returned in the current page. For totals > 1000, pagination can stop early after page 1.

Proposed fix
-            int total;
+            int itemsInPage;
             do
             {
                 var metadataBody = new MetadataSearchDto
                 {
                     Page = page,
                     Size = batchSize,
                     PersonIds = personIds,
                     WithExif = true,
                     WithPeople = true
                 };

                 if (!accountSettings.ShowVideos)
                 {
                     metadataBody.Type = AssetTypeEnum.IMAGE;
                 }

                 var personInfo = await immichApi.SearchAssetsAsync(metadataBody, ct);

-                total = personInfo.Assets.Total;
+                itemsInPage = personInfo.Assets.Items.Count;

                 personAssets.AddRange(personInfo.Assets.Items);
                 page++;
-            } while (total == batchSize);
+            } while (itemsInPage == batchSize);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs` around lines 48 - 52, The
pagination loop in PeopleAssetsPool (in PeopleAssetsPool.cs) uses the wrong
condition—comparing total to batchSize—so pagination can stop early; change the
loop to continue while the current page returned a full batch (e.g., while
(personInfo.Assets.Items.Count == batchSize) or equivalent) and rely on the
returned item count (personInfo.Assets.Items) instead of total; ensure
personAssets.AddRange(personInfo.Assets.Items) and page++ remain unchanged and
that total is used only for metadata, not the loop condition.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docker/Settings.example.yml`:
- Line 1: The file containing the "General:" YAML header has CRLF endings;
convert that file to LF line endings (e.g., run dos2unix on the file or set your
editor to save with LF, or run git add --renormalize <file>) and recommit so the
"General:" line (and whole file) uses '\n' endings to satisfy YAMLlint/CI
checks. Ensure your local git core.autocrlf or editor settings are updated to
prevent reintroducing CRLF.

In `@ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs`:
- Around line 21-23: If accountSettings.RequireAllPeople is true but the people
collection is empty, the current logic builds a single empty group in
personIdGroups and still performs the search; guard this by checking
people.Any() (or people.Count > 0) before creating personIdGroups and before
executing the search in the PeopleAssetsPool logic: when RequireAllPeople is
true and people is empty, short-circuit to return an empty result (or skip the
search) instead of constructing an empty group; update the code paths that
reference personIdGroups and the search invocation so they only run when people
has elements.

---

Outside diff comments:
In `@ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs`:
- Around line 48-52: The pagination loop in PeopleAssetsPool (in
PeopleAssetsPool.cs) uses the wrong condition—comparing total to batchSize—so
pagination can stop early; change the loop to continue while the current page
returned a full batch (e.g., while (personInfo.Assets.Items.Count == batchSize)
or equivalent) and rely on the returned item count (personInfo.Assets.Items)
instead of total; ensure personAssets.AddRange(personInfo.Assets.Items) and
page++ remain unchanged and that total is used only for metadata, not the loop
condition.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 43019efb-3523-44c6-ad49-f8c07e10d8e1

📥 Commits

Reviewing files that changed from the base of the PR and between 2ba1121 and 7c6dfa2.

📒 Files selected for processing (13)
  • ImmichFrame.Core.Tests/Logic/Pool/PersonAssetsPoolTests.cs
  • ImmichFrame.Core/Interfaces/IServerSettings.cs
  • ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs
  • ImmichFrame.WebApi.Tests/Resources/TestV1.json
  • ImmichFrame.WebApi.Tests/Resources/TestV2.json
  • ImmichFrame.WebApi.Tests/Resources/TestV2.yml
  • ImmichFrame.WebApi.Tests/Resources/TestV2_NoGeneral.json
  • ImmichFrame.WebApi/Helpers/Config/ServerSettingsV1.cs
  • ImmichFrame.WebApi/Models/ServerSettings.cs
  • docker/Settings.example.json
  • docker/Settings.example.yml
  • docker/example.env
  • docs/docs/getting-started/configuration.md
✅ Files skipped from review due to trivial changes (3)
  • ImmichFrame.WebApi.Tests/Resources/TestV2.yml
  • ImmichFrame.WebApi.Tests/Resources/TestV1.json
  • ImmichFrame.Core.Tests/Logic/Pool/PersonAssetsPoolTests.cs
🚧 Files skipped from review as they are similar to previous changes (6)
  • docs/docs/getting-started/configuration.md
  • ImmichFrame.Core/Interfaces/IServerSettings.cs
  • ImmichFrame.WebApi.Tests/Resources/TestV2_NoGeneral.json
  • ImmichFrame.WebApi/Models/ServerSettings.cs
  • ImmichFrame.WebApi/Helpers/Config/ServerSettingsV1.cs
  • ImmichFrame.WebApi.Tests/Resources/TestV2.json

Comment thread docker/Settings.example.yml Outdated
Comment thread ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs
@FlorianObermayer FlorianObermayer marked this pull request as draft April 11, 2026 23:18
@FlorianObermayer

Copy link
Copy Markdown
Author

Nice! This LGTM. Can you also add the new setting to the examples please (they are in the docker folder). example.env settings.example.json settings.example.yml

Just amended the change but apparently I have broken line ending settings. Moved the PR into draft state until those are resolved.

@FlorianObermayer FlorianObermayer force-pushed the Feat/Add-RequireAllPeople-setting-for-AND-based-person-filtering branch from 7c6dfa2 to d5821fd Compare April 11, 2026 23:26
@FlorianObermayer FlorianObermayer marked this pull request as ready for review April 11, 2026 23:26
@FlorianObermayer

Copy link
Copy Markdown
Author

Nice! This LGTM. Can you also add the new setting to the examples please (they are in the docker folder). example.env settings.example.json settings.example.yml

Just amended the change but apparently I have broken line ending settings. Moved the PR into draft state until those are resolved.

Done! I think there are some line ending differences in this project, though (most cs files are CLRF, while the example files are LF. Maybe worth to pull straight at some point.

@FlorianObermayer FlorianObermayer force-pushed the Feat/Add-RequireAllPeople-setting-for-AND-based-person-filtering branch from 6fababe to 9f7722d Compare June 14, 2026 19:13
@FlorianObermayer FlorianObermayer force-pushed the Feat/Add-RequireAllPeople-setting-for-AND-based-person-filtering branch from 9f7722d to e72e812 Compare June 14, 2026 19:18

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@immichFrame.Web/src/lib/components/home-page/home-page.svelte`:
- Around line 202-205: The consecutive error counter is being reset too early in
the handleDone() method at line 204, before the replacement asset has proven to
work. Remove the consecutiveErrorSkips reset from the finally block in
handleDone(). Instead, keep the existing reset in the onVideoPlaying handler for
video slides since that confirms successful playback, and add a separate reset
for image-only slides immediately after they are confirmed as successfully
fetched. This ensures the counter can properly accumulate across a streak of
failures before triggering the tripwire at the greater-than-10 threshold.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 170d815f-4b2b-475a-b7b1-edc79357cde9

📥 Commits

Reviewing files that changed from the base of the PR and between 9f7722d and e72e812.

📒 Files selected for processing (18)
  • ImmichFrame.Core.Tests/Logic/Pool/PersonAssetsPoolTests.cs
  • ImmichFrame.Core/Interfaces/IServerSettings.cs
  • ImmichFrame.Core/Logic/Pool/MemoryAssetsPool.cs
  • ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs
  • ImmichFrame.WebApi.Tests/Resources/TestV1.json
  • ImmichFrame.WebApi.Tests/Resources/TestV2.json
  • ImmichFrame.WebApi.Tests/Resources/TestV2.yml
  • ImmichFrame.WebApi.Tests/Resources/TestV2_NoGeneral.json
  • ImmichFrame.WebApi/Helpers/Config/ServerSettingsV1.cs
  • ImmichFrame.WebApi/Models/ServerSettings.cs
  • docker/Settings.example.json
  • docker/Settings.example.yml
  • docker/example.env
  • docs/docs/getting-started/configuration.md
  • immichFrame.Web/src/lib/components/elements/asset-component.svelte
  • immichFrame.Web/src/lib/components/elements/asset.svelte
  • immichFrame.Web/src/lib/components/elements/progress-bar.svelte
  • immichFrame.Web/src/lib/components/home-page/home-page.svelte
✅ Files skipped from review due to trivial changes (5)
  • docker/example.env
  • ImmichFrame.WebApi.Tests/Resources/TestV2.json
  • ImmichFrame.WebApi.Tests/Resources/TestV2.yml
  • ImmichFrame.WebApi.Tests/Resources/TestV1.json
  • docker/Settings.example.yml
🚧 Files skipped from review as they are similar to previous changes (7)
  • docs/docs/getting-started/configuration.md
  • ImmichFrame.WebApi/Models/ServerSettings.cs
  • ImmichFrame.Core/Interfaces/IServerSettings.cs
  • ImmichFrame.WebApi.Tests/Resources/TestV2_NoGeneral.json
  • ImmichFrame.Core/Logic/Pool/PeopleAssetsPool.cs
  • docker/Settings.example.json
  • ImmichFrame.Core.Tests/Logic/Pool/PersonAssetsPoolTests.cs

Comment on lines 202 to 205
await assetComponent?.play?.();
progressBar.play();
consecutiveErrorSkips = 0;
} finally {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Don't clear the consecutive-failure counter before the replacement asset proves healthy.

Line 204 resets consecutiveErrorSkips at the end of every handleDone(), but onAssetError reaches handleDone() for each skip. In a streak of bad videos, the counter becomes 1, the transition runs, then Line 204 immediately zeroes it again before onVideoPlaying ever fires, so the > 10 tripwire never triggers.

💡 Minimal fix
 			await assetComponent?.play?.();
 			progressBar.play();
-			consecutiveErrorSkips = 0;
+			if (displayingAssets.every((asset) => !isVideoAsset(asset))) {
+				consecutiveErrorSkips = 0;
+			}

Reset on a confirmed success path instead: keep the existing reset in onVideoPlaying for video slides, and only reset immediately for image-only slides that were already fetched successfully.

Also applies to: 547-560

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@immichFrame.Web/src/lib/components/home-page/home-page.svelte` around lines
202 - 205, The consecutive error counter is being reset too early in the
handleDone() method at line 204, before the replacement asset has proven to
work. Remove the consecutiveErrorSkips reset from the finally block in
handleDone(). Instead, keep the existing reset in the onVideoPlaying handler for
video slides since that confirms successful playback, and add a separate reset
for image-only slides immediately after they are confirmed as successfully
fetched. This ensures the counter can properly accumulate across a streak of
failures before triggering the tripwire at the greater-than-10 threshold.

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

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants