Skip to content

chore: add endpoints to filter round data by requester#1152

Merged
ctrlc03 merged 4 commits into
mainfrom
chore/filter-by-requester-crisp
Jan 8, 2026
Merged

chore: add endpoints to filter round data by requester#1152
ctrlc03 merged 4 commits into
mainfrom
chore/filter-by-requester-crisp

Conversation

@ctrlc03

@ctrlc03 ctrlc03 commented Jan 7, 2026

Copy link
Copy Markdown
Collaborator

add requesters array filtering to frontend and server endpoints

Summary by CodeRabbit

  • New Features

    • Filter rounds and results by requester identity.
  • Configuration

    • New environment setting to list authorized requesters (comma-separated).
  • API Changes

    • Relevant endpoints switched from GET to POST to accept requester payloads for filtered responses.
  • Chores

    • Development script now creates a .env from .env.example if missing before starting the client.

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

@ctrlc03 ctrlc03 requested a review from hmzakhalid January 7, 2026 21:16
@vercel

vercel Bot commented Jan 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Review Updated (UTC)
crisp Skipped Skipped Jan 7, 2026 10:16pm
enclave-docs Skipped Skipped Jan 7, 2026 10:16pm

@coderabbitai

coderabbitai Bot commented Jan 7, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Adds requester-based filtering: new client env var and constant; client hooks now POST requester payloads. Server models, repository, and routes accept requester(s) and return requester-scoped round and result data. Endpoints /rounds/current and /state/all changed from GET to POST.

Changes

Cohort / File(s) Summary
Client Configuration
examples/CRISP/client/.env.example
Added VITE_E3_REQUESTERS env var (comma-separated Ethereum addresses).
Client Constants
examples/CRISP/client/src/utils/constants.ts
Added ROUND_REQUESTERS parsing VITE_E3_REQUESTERS into string[] (trimmed, defaults to []).
Client Hooks
examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts
getCurrentRound and getWebResult now POST { requesters: ROUND_REQUESTERS } and use updated generic payload typings; imports ROUND_REQUESTERS.
Server Models
examples/CRISP/server/src/server/models.rs
Added RoundRequestWithRequester { requesters: Vec<String> }; added requester: String to WebResultRequest and updated From<E3> mapping.
Server Repository
examples/CRISP/server/src/server/repo.rs
Added get_current_round_for_requester(&self, requester: String) -> Result<Option<CurrentRound>>; get_web_result_request now includes requester from e3_crisp.requester.
Server Routes
examples/CRISP/server/src/server/routes/rounds.rs, examples/CRISP/server/src/server/routes/state.rs
/rounds/current and /state/all changed from GET to POST; handlers accept RoundRequestWithRequester and branch: use requester-scoped repo calls when provided, otherwise return all/current.
Dev Scripts
examples/CRISP/scripts/dev_client.sh
Ensures .env exists by copying .env.example if missing before running pnpm dev-static.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Client
  participant EnclaveAPI as Enclave Server (HTTP)
  participant Repo as CurrentRoundRepository
  participant CrispRepo as CrispE3Repository

  Note over Client,EnclaveAPI: Client POSTs requesters payload
  Client->>EnclaveAPI: POST /rounds/current { requesters: [...] }
  alt requester provided
    EnclaveAPI->>Repo: get_current_round_for_requester(requester)
    Repo->>CrispRepo: iterate rounds -> fetch lite state per round
    CrispRepo-->>Repo: lite state / errors
    Repo-->>EnclaveAPI: Option<CurrentRound>
  else no requester
    EnclaveAPI->>Repo: get_current_round()
    Repo-->>EnclaveAPI: Option<CurrentRound>
  end
  EnclaveAPI-->>Client: 200 OK / 404 NotFound
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested reviewers

  • hmzakhalid
  • cedoor

Poem

🐰 I hopped through envs to fetch requesters bright,
I POSTed my list into the server's light,
Models learned a field, repo chased each round,
Now filtered rounds and results abound,
Carrots for code and queries done right! 🥕

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main change: adding endpoints to filter round data by requester, which is demonstrated across frontend and server route updates.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

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

✨ Finishing touches
  • 📝 Generate docstrings

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In @examples/CRISP/client/src/utils/constants.ts:
- Line 8: ROUND_REQUESTERS currently splits VITE_E3_REQUESTERS by commas but
doesn't trim entries, so addresses like "0x123, 0x456" will include whitespace;
update the initialization of ROUND_REQUESTERS to map over the split results and
call .trim() on each entry and filter out any empty strings (i.e., use
import.meta.env.VITE_E3_REQUESTERS.split(',').map(s =>
s.trim()).filter(Boolean)) so stored addresses have no leading/trailing
whitespace.

In @examples/CRISP/server/src/server/routes/rounds.rs:
- Around line 77-91: The handler get_current_round accepts
RoundRequestWithRequester with a Vec<String> but only uses the first element;
either change the API/model to accept a single optional requester (e.g.,
RoundRequestWithRequester.requester: Option<String>) and update the handler to
use that value, or implement true multi-requester support by iterating over
incoming.requesters and applying OR/combined logic before calling the store;
also remove the unnecessary clone by changing get_current_round_for_requester to
accept &str or &String (or pass a string slice) so you can borrow instead of
cloning.

In @examples/CRISP/server/src/server/routes/state.rs:
- Line 15: Remove the unused import of the Encodable trait from rlp: in the use
statement that currently imports alloy::{primitives::{Address, Bytes, U256},
rlp::Encodable}, delete the rlp::Encodable part so only Address, Bytes, and U256
are imported; ensure no other code in this module references Encodable before
removing.
🧹 Nitpick comments (3)
examples/CRISP/client/.env.example (1)

6-7: Consider reordering environment variables alphabetically.

Static analysis suggests ordering VITE_E3_REQUESTERS before VITE_ENCLAVE_API for consistency. While this doesn't affect functionality, alphabetical ordering can improve maintainability in environment files.

examples/CRISP/server/src/server/repo.rs (1)

54-76: Consider indexing by requester for improved performance.

The linear scan through all rounds works correctly but could become slow as the number of rounds grows. The reverse iteration optimizes for the common case (finding recent rounds), which is good.

For future optimization, consider maintaining an index mapping requesters to their round IDs to avoid the O(n) scan.

examples/CRISP/server/src/server/routes/state.rs (1)

222-257: LGTM with optional optimization.

The filtering logic correctly implements requester-based filtering. The approach of returning all results when requesters is empty is intuitive.

For scenarios with many requesters, consider converting requesters to a HashSet before the loop to improve lookup performance from O(n) to O(1) per check.

♻️ Optional optimization using HashSet
 async fn get_all_round_results(data: web::Json::<RoundRequestWithRequester>, store: web::Data<AppData>) -> impl Responder {
     let incoming = data.into_inner();
 
     let round_count = match store.current_round().get_current_round_id().await {
         Ok(count) => count,
         Err(e) => {
             info!("Error retrieving round count: {:?}", e);
             return HttpResponse::InternalServerError().body("Failed to retrieve round count");
         }
     };
 
     let mut states = Vec::new();
     let requesters = incoming.requesters;
+    let requester_set: std::collections::HashSet<_> = requesters.iter().collect();
 
     // FIXME: This assumes ids are ordered
     for i in 0..round_count + 1 {
         match store.e3(i).get_web_result_request().await {
             Ok(w) => {
                 if !requesters.is_empty() {
                     // if we have any requesters to filter by, do it
-                    if requesters.contains(&w.requester) {
+                    if requester_set.contains(&w.requester) {
                         states.push(w);
                     }
                 } else {
                     states.push(w);
                 }
             }
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2c68e60 and 36172af.

📒 Files selected for processing (7)
  • examples/CRISP/client/.env.example
  • examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts
  • examples/CRISP/client/src/utils/constants.ts
  • examples/CRISP/server/src/server/models.rs
  • examples/CRISP/server/src/server/repo.rs
  • examples/CRISP/server/src/server/routes/rounds.rs
  • examples/CRISP/server/src/server/routes/state.rs
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2024-11-05T06:48:58.177Z
Learnt from: ryardley
Repo: gnosisguild/enclave PR: 173
File: packages/ciphernode/config/src/app_config.rs:13-21
Timestamp: 2024-11-05T06:48:58.177Z
Learning: In the `packages/ciphernode/config/src/app_config.rs` file, for the `Contract` enum, the team prefers to use `String` type for `address` fields, relying on parsing to handle validation, instead of using the `Address` type.

Applied to files:

  • examples/CRISP/server/src/server/routes/state.rs
📚 Learning: 2024-10-08T19:45:18.209Z
Learnt from: ryardley
Repo: gnosisguild/enclave PR: 107
File: packages/ciphernode/sortition/src/distance.rs:1-1
Timestamp: 2024-10-08T19:45:18.209Z
Learning: In `packages/ciphernode/core/src/events.rs`, the import statements use the correct and updated `alloy::primitives` module.

Applied to files:

  • examples/CRISP/server/src/server/routes/state.rs
📚 Learning: 2024-11-05T06:51:46.701Z
Learnt from: ryardley
Repo: gnosisguild/enclave PR: 173
File: packages/ciphernode/evm/src/event_reader.rs:270-286
Timestamp: 2024-11-05T06:51:46.701Z
Learning: In `packages/ciphernode/evm/src/event_reader.rs`, the `state.ids` HashSet is intended to grow indefinitely to store all processed event IDs for deduplication purposes until an alternative like a bloom filter is implemented.

Applied to files:

  • examples/CRISP/server/src/server/routes/state.rs
🧬 Code graph analysis (5)
examples/CRISP/server/src/server/models.rs (1)
examples/CRISP/server/src/server/indexer.rs (1)
  • e3 (340-340)
examples/CRISP/server/src/server/routes/rounds.rs (1)
examples/CRISP/server/src/server/repo.rs (3)
  • get_current_round (36-45)
  • store (38-40)
  • store (113-115)
examples/CRISP/server/src/server/repo.rs (1)
examples/CRISP/client/src/model/vote.model.ts (1)
  • CurrentRound (12-14)
examples/CRISP/server/src/server/routes/state.rs (1)
examples/CRISP/server/src/server/repo.rs (2)
  • store (38-40)
  • store (113-115)
examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts (3)
examples/CRISP/client/src/model/vote.model.ts (2)
  • CurrentRound (12-14)
  • VoteStateLite (42-57)
examples/CRISP/client/src/utils/constants.ts (1)
  • ROUND_REQUESTERS (8-8)
examples/CRISP/client/src/model/poll.model.ts (1)
  • PollRequestResult (22-30)
🪛 dotenv-linter (4.0.0)
examples/CRISP/client/.env.example

[warning] 7-7: [UnorderedKey] The VITE_E3_REQUESTERS key should go before the VITE_ENCLAVE_API key

(UnorderedKey)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
  • GitHub Check: build_enclave_cli
  • GitHub Check: build_e3_support_dev
  • GitHub Check: test_net
  • GitHub Check: build_sdk
  • GitHub Check: build_crisp_sdk
  • GitHub Check: rust_unit
  • GitHub Check: integration_prebuild
  • GitHub Check: rust_integration
  • GitHub Check: Build & Push Image
🔇 Additional comments (5)
examples/CRISP/server/src/server/routes/rounds.rs (1)

25-25: Breaking change: GET to POST is correctly coordinated with client updates.

The route change from GET to POST is a breaking change for API consumers. The client-side hooks in examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts have been updated accordingly, ensuring coordination across the stack.

examples/CRISP/server/src/server/models.rs (2)

108-111: Model structure is consistent with usage patterns.

The RoundRequestWithRequester struct with Vec<String> aligns with the route handlers in examples/CRISP/server/src/server/routes/rounds.rs. However, note the comment on rounds.rs regarding whether a Vec<String> is the most appropriate type when only the first element is used.


164-164: Properly extends WebResultRequest with requester field.

The addition of the requester field and its corresponding mapping in the From<E3> implementation correctly propagates requester information through the request flow.

Also applies to: 254-254

examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts (1)

19-19: Client hooks correctly updated to POST requesters payload.

The changes properly align with the server-side API modifications:

  • Import of ROUND_REQUESTERS provides the requester addresses from environment configuration
  • Both getCurrentRound and getWebResult correctly POST the requesters array
  • Type signatures accurately reflect the new payload structure

The implementation is sound, though it inherits the potential whitespace issue from ROUND_REQUESTERS in constants.ts (addressed in that file's review).

Also applies to: 39-39, 42-43

examples/CRISP/server/src/server/repo.rs (1)

243-256: LGTM!

The addition of the requester field to WebResultRequest is straightforward and correctly sources the data from e3_crisp.requester.

Comment thread examples/CRISP/client/src/utils/constants.ts Outdated
Comment thread examples/CRISP/server/src/server/routes/rounds.rs
Comment thread examples/CRISP/server/src/server/routes/state.rs Outdated
@vercel vercel Bot temporarily deployed to Preview – crisp January 7, 2026 21:25 Inactive
@vercel vercel Bot temporarily deployed to Preview – enclave-docs January 7, 2026 21:25 Inactive
@ctrlc03 ctrlc03 enabled auto-merge (squash) January 7, 2026 21:26

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (3)
examples/CRISP/client/src/utils/constants.ts (1)

8-10: Add filtering to remove empty strings.

While .trim() correctly handles whitespace (addressing the previous review comment), the implementation should also filter out empty strings that can result from trailing commas ("0x123,"), consecutive commas ("0x123,,0x456"), or leading commas. Empty strings in the array could cause validation failures or unexpected filtering behavior.

♻️ Proposed fix
 export const ROUND_REQUESTERS = import.meta.env.VITE_E3_REQUESTERS
-  ? import.meta.env.VITE_E3_REQUESTERS.split(',').map((s: string) => s.trim())
+  ? import.meta.env.VITE_E3_REQUESTERS.split(',').map((s: string) => s.trim()).filter(Boolean)
   : []
examples/CRISP/server/src/server/routes/state.rs (2)

217-221: Update function documentation.

The documentation doesn't mention the new requester-based filtering capability. Update it to describe the RoundRequestWithRequester parameter and the filtering behavior.

📝 Suggested documentation update
 /// Get all the results for all rounds
 ///
+/// # Arguments
+///
+/// * `RoundRequestWithRequester` - Optional list of requester addresses to filter results
+///
 /// # Returns
 ///
 /// * A JSON response containing the results for all rounds
+///   If requesters are provided, only returns results matching those requesters
+///   If no requesters are provided, returns all results

222-256: Consider address normalization for requester matching.

The filtering logic is correct, but the string comparison at line 242 is case-sensitive. For Ethereum addresses, this could cause mismatches if the addresses in the payload use different casing than those stored in the results. Consider normalizing addresses to lowercase (or using checksummed addresses consistently throughout) to ensure reliable matching.

♻️ Example normalization approach
 async fn get_all_round_results(data: web::Json::<RoundRequestWithRequester>, store: web::Data<AppData>) -> impl Responder {
     let incoming = data.into_inner();
 
     let round_count = match store.current_round().get_current_round_id().await {
         Ok(count) => count,
         Err(e) => {
             info!("Error retrieving round count: {:?}", e);
             return HttpResponse::InternalServerError().body("Failed to retrieve round count");
         }
     };
 
     let mut states = Vec::new();
-    let requesters = incoming.requesters;
+    // Normalize addresses to lowercase for case-insensitive comparison
+    let requesters: Vec<String> = incoming.requesters.iter().map(|r| r.to_lowercase()).collect();
 
     // FIXME: This assumes ids are ordered
     for i in 0..round_count + 1 {
         match store.e3(i).get_web_result_request().await {
             Ok(w) => {
                 if !requesters.is_empty() {
                     // if we have any requesters to filter by, do it
-                    if requesters.contains(&w.requester) {
+                    if requesters.contains(&w.requester.to_lowercase()) {
                         states.push(w);
                     }
                 } else {
                     states.push(w);
                 }
             }
             Err(e) => {
                 info!("Error retrieving state for round {}: {:?}", i, e);
                 continue;
             }
         }
     }
 
     HttpResponse::Ok().json(states)
 }
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 36172af and fb4bf0f.

📒 Files selected for processing (2)
  • examples/CRISP/client/src/utils/constants.ts
  • examples/CRISP/server/src/server/routes/state.rs
🧰 Additional context used
🧠 Learnings (5)
📚 Learning: 2024-10-08T19:45:18.209Z
Learnt from: ryardley
Repo: gnosisguild/enclave PR: 107
File: packages/ciphernode/sortition/src/distance.rs:1-1
Timestamp: 2024-10-08T19:45:18.209Z
Learning: In `packages/ciphernode/core/src/events.rs`, the import statements use the correct and updated `alloy::primitives` module.

Applied to files:

  • examples/CRISP/server/src/server/routes/state.rs
📚 Learning: 2024-11-05T06:48:58.177Z
Learnt from: ryardley
Repo: gnosisguild/enclave PR: 173
File: packages/ciphernode/config/src/app_config.rs:13-21
Timestamp: 2024-11-05T06:48:58.177Z
Learning: In the `packages/ciphernode/config/src/app_config.rs` file, for the `Contract` enum, the team prefers to use `String` type for `address` fields, relying on parsing to handle validation, instead of using the `Address` type.

Applied to files:

  • examples/CRISP/server/src/server/routes/state.rs
📚 Learning: 2024-11-05T06:49:46.285Z
Learnt from: ryardley
Repo: gnosisguild/enclave PR: 173
File: packages/ciphernode/enclave_node/src/datastore.rs:14-16
Timestamp: 2024-11-05T06:49:46.285Z
Learning: In `packages/ciphernode/enclave_node/src/datastore.rs`, for internal functions like `get_in_mem_store`, adding extensive documentation and error handling may not be necessary if they are not client-facing.

Applied to files:

  • examples/CRISP/server/src/server/routes/state.rs
📚 Learning: 2024-10-16T09:51:10.038Z
Learnt from: ryardley
Repo: gnosisguild/enclave PR: 145
File: packages/ciphernode/router/src/committee_meta.rs:43-43
Timestamp: 2024-10-16T09:51:10.038Z
Learning: In `packages/ciphernode/router/src/committee_meta.rs`, avoid suggesting making the `on_event` method in `CommitteMetaFeature` asynchronous or adding error handling for the `write` operation to the data store.

Applied to files:

  • examples/CRISP/server/src/server/routes/state.rs
📚 Learning: 2024-11-05T06:51:46.701Z
Learnt from: ryardley
Repo: gnosisguild/enclave PR: 173
File: packages/ciphernode/evm/src/event_reader.rs:270-286
Timestamp: 2024-11-05T06:51:46.701Z
Learning: In `packages/ciphernode/evm/src/event_reader.rs`, the `state.ids` HashSet is intended to grow indefinitely to store all processed event IDs for deduplication purposes until an alternative like a bloom filter is implemented.

Applied to files:

  • examples/CRISP/server/src/server/routes/state.rs
🧬 Code graph analysis (1)
examples/CRISP/server/src/server/routes/state.rs (1)
examples/CRISP/server/src/server/repo.rs (2)
  • store (38-40)
  • store (113-115)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
  • GitHub Check: build_e3_support_dev
  • GitHub Check: build_crisp_sdk
  • GitHub Check: integration_prebuild
  • GitHub Check: build_enclave_cli
  • GitHub Check: build_sdk
  • GitHub Check: test_net
  • GitHub Check: rust_integration
  • GitHub Check: rust_unit
  • GitHub Check: Build & Push Image
🔇 Additional comments (2)
examples/CRISP/server/src/server/routes/state.rs (2)

10-12: LGTM!

The import changes correctly add RoundRequestWithRequester to support the new filtering functionality.


26-26: Client is already updated to use POST with the requester payload.

The /state/all endpoint uses POST and the client at examples/CRISP/client/src/hooks/enclave/useEnclaveServer.ts (line 43) is already calling it with the correct 'post' method and { requesters: ROUND_REQUESTERS } payload. The server and client changes are coordinated.

@vercel vercel Bot temporarily deployed to Preview – crisp January 7, 2026 22:16 Inactive
@vercel vercel Bot temporarily deployed to Preview – enclave-docs January 7, 2026 22:16 Inactive

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
examples/CRISP/scripts/dev_client.sh (1)

7-7: LGTM! The .env file check is a helpful addition.

The logic correctly ensures .env exists before starting the dev server, which is essential now that the client relies on VITE_E3_REQUESTERS for requester filtering. The implementation won't overwrite existing developer customizations.

Optional: Consider adding user feedback for better developer experience.

While not essential, adding a brief message when the file is copied would help developers understand what's happening, and explicitly checking for .env.example would provide a clearer error if it's missing.

💡 Optional enhancement for better DX
-(cd ./client && if [[ ! -f .env ]]; then cp .env.example .env; fi && pnpm dev-static)
+(cd ./client && \
+  if [[ ! -f .env ]]; then \
+    if [[ ! -f .env.example ]]; then \
+      echo "Error: .env.example not found in client directory" >&2; \
+      exit 1; \
+    fi; \
+    echo "Creating .env from .env.example..."; \
+    cp .env.example .env; \
+  fi && \
+  pnpm dev-static)
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fb4bf0f and 8ed5fab.

📒 Files selected for processing (1)
  • examples/CRISP/scripts/dev_client.sh
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: build_sdk
  • GitHub Check: build_crisp_sdk
  • GitHub Check: rust_integration
  • GitHub Check: test_net
  • GitHub Check: rust_unit
  • GitHub Check: build_e3_support_dev
  • GitHub Check: integration_prebuild
  • GitHub Check: build_enclave_cli

@hmzakhalid hmzakhalid 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!

@ctrlc03 ctrlc03 merged commit fdd4c9e into main Jan 8, 2026
27 checks passed
@github-actions github-actions Bot deleted the chore/filter-by-requester-crisp branch January 16, 2026 02:54
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.

2 participants