Skip to content

Conversation

@stbenjam
Copy link
Member

@stbenjam stbenjam commented Jan 13, 2026

Summary by CodeRabbit

Release Notes

  • New Features
    • Added lifecycle-based filtering to component readiness queries and reports
    • Introduced new API endpoint to retrieve available test lifecycles
    • Added lifecycle filter control to the sidebar for enhanced query customization

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

Add Lifecycles filter in sidebar to filter sample results by test
lifecycle (blocking/informing). NULL or empty values are treated as
blocking. Filter applies to sample only, not basis.

Co-Authored-By: Claude Opus 4.5 <[email protected]>
@openshift-ci-robot
Copy link

Pipeline controller notification
This repo is configured to use the pipeline controller. Second-stage tests will be triggered either automatically or after lgtm label is added, depending on the repository configuration. The pipeline controller will automatically detect which contexts are required and will utilize /test Prow commands to trigger the second stage.

For optional jobs, comment /test ? to see a list of all defined jobs. To trigger manually all jobs from second stage use /pipeline required command.

This repository is configured in: automatic mode

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 13, 2026

Walkthrough

The changes add lifecycle-based filtering capabilities to the component readiness feature across both backend and frontend layers. Backend additions include a new database query function fetching available lifecycles, a new API endpoint serving this data, parameter parsing for lifecycle filters, and query generation logic applying lifecycle filters. Frontend additions include state management for lifecycle selection, context providers for data sharing, and UI components for filtering.

Changes

Cohort / File(s) Summary
Backend API & Database Layer
pkg/api/tests.go, pkg/sippyserver/server.go
New GetTestLifecyclesFromDB function queries BigQuery for distinct test lifecycles from the last 7 days; new /api/tests/lifecycles endpoint registered with caching and capability requirements.
Backend Query & Parameter Processing
pkg/api/componentreadiness/query/querygenerators.go, pkg/api/componentreadiness/utils/queryparamparser.go
Query generator adds lifecycle filtering logic when isSample is true and Lifecycles list is non-empty; parameter parser reads testLifecycles query parameter and validates it as incompatible with view-based requests.
Backend Type Definitions
pkg/apis/api/componentreport/reqopts/types.go
Added Lifecycles []string field to TestFilters struct with JSON and YAML serialization tags.
Frontend State Management
sippy-ng/src/component_readiness/CompReadyVars.js
New testLifecycles query parameter (ArrayParam), state variable with setter, initialization from URL params, and context provider exposure for lifecycle filtering state.
Frontend Data & Context Layer
sippy-ng/src/component_readiness/ComponentReadiness.js
New TestLifecyclesContext exported; added fetchLifecycles function to retrieve lifecycles from API; integrated lifecycle loading into main effect alongside capabilities.
Frontend UI & Utilities
sippy-ng/src/component_readiness/SidebarTestFilters.js, sippy-ng/src/component_readiness/CompReadyUtils.js, sippy-ng/src/component_readiness/CompReadyEnvCapabilities.js
SidebarTestFilters adds Lifecycles Autocomplete component with handlers and chip rendering; CompReadyUtils appends testLifecycles to query string; CompReadyEnvCapabilities enables filterByLifecycles option.

Sequence Diagram

sequenceDiagram
    participant Client as Client
    participant FrontEnd as Frontend React
    participant API as Backend API
    participant DB as BigQuery

    Client->>FrontEnd: Load Component Readiness
    FrontEnd->>API: GET /api/tests/lifecycles
    API->>DB: SELECT DISTINCT lifecycle FROM junit<br/>(last 7 days)
    DB-->>API: Return lifecycles list
    API-->>FrontEnd: JSON response with lifecycles
    FrontEnd->>FrontEnd: Populate TestLifecyclesContext

    Client->>FrontEnd: Select lifecycles in filter
    FrontEnd->>FrontEnd: Update testLifecycles state
    FrontEnd->>FrontEnd: Build query with testLifecycles param

    Client->>FrontEnd: Generate/Submit report
    FrontEnd->>API: GET /api/... ?testLifecycles=x&testLifecycles=y
    API->>DB: SELECT ... WHERE lifecycle IN (x, y)
    DB-->>API: Filtered component readiness data
    API-->>FrontEnd: JSON response
    FrontEnd->>FrontEnd: Render filtered results
    FrontEnd-->>Client: Display updated report
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5 | ❌ 2
❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 63.64% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Go Error Handling ⚠️ Warning Error at line 565 in GetTestLifecyclesFromDB is returned unwrapped without context, while line 574 wraps errors properly, violating consistent error handling requirements. Wrap the error at line 565 with context: change return []string{}, err to return []string{}, errors.Wrap(err, "error querying test lifecycles from bigquery")
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Sql Injection Prevention ✅ Passed The lifecycle filter query uses named placeholder @lifecycles with bigquery.QueryParameter, avoiding SQL injection. Dataset name from config is the only fmt.Sprintf injection.
Excessive Css In React Should Use Styles ✅ Passed PR introduces lifecycle filtering without excessive inline CSS; changes are primarily functional with context management and event handlers.
Single Responsibility And Clear Naming ✅ Passed PR adheres to single responsibility and clear naming principles with specific, action-oriented function names and focused component responsibilities that follow existing architectural patterns.
Title check ✅ Passed The pull request title clearly and accurately describes the main change: adding lifecycle-based filtering to the component readiness feature.

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

✨ Finishing touches
  • 📝 Generate docstrings

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

@openshift-ci openshift-ci bot requested review from deads2k and xueqzhan January 13, 2026 19:45
@openshift-ci openshift-ci bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Jan 13, 2026
@stbenjam stbenjam changed the title feat(component readiness): allow filtering by test lifecycle TRT-2501: feat(component readiness): allow filtering by test lifecycle Jan 13, 2026
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Jan 13, 2026
@openshift-ci-robot
Copy link

openshift-ci-robot commented Jan 13, 2026

@stbenjam: This pull request references TRT-2501 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.22.0" version, but no target version was set.

Details

In response to this:

Summary by CodeRabbit

Release Notes

  • New Features
  • Added lifecycle-based filtering to component readiness queries and reports
  • Introduced new API endpoint to retrieve available test lifecycles
  • Added lifecycle filter control to the sidebar for enhanced query customization

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

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

Copy link
Contributor

@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: 1

🤖 Fix all issues with AI agents
In @sippy-ng/src/component_readiness/SidebarTestFilters.js:
- Around line 24-33: The early return in SidebarTestFilters.js currently happens
before the hooks, making the useContext calls for varsContext, testCapabilities
and testLifecycles conditional and violating the Rules of Hooks; move the
useContext calls (for CompReadyVarsContext, TestCapabilitiesContext,
TestLifecyclesContext) to execute unconditionally at the top of the component,
then perform the conditional check on props.controlsOpts?.filterByCapabilities
and props.controlsOpts?.filterByLifecycles and return <Fragment /> afterwards so
hooks are always called in the same order.
🧹 Nitpick comments (3)
pkg/api/tests.go (2)

571-575: Consider handling iterator.Done for empty result sets.

The current error handling wraps all errors from it.Next(), but if the query returns no rows (empty table or all NULL/empty lifecycles), iterator.Done would be returned and wrapped as an error. The existing GetTestCapabilitiesFromDB has the same pattern, so this is consistent, but worth noting that an empty result might surface as an error rather than an empty slice.

Optional: Handle iterator.Done explicitly
 	err = it.Next(&row)
-	if err != nil {
+	if err == iterator.Done {
+		return []string{}, nil
+	} else if err != nil {
 		log.WithError(err).Error("error retrieving test lifecycles from bigquery")
 		return []string{}, errors.Wrap(err, "error retrieving test lifecycles from bigquery")
 	}

554-558: Minor: Consider using backticks for table reference consistency.

The GetTestCapabilitiesFromDB function uses backticks around the table reference (`%s.component_mapping_latest`), while this query omits them for %s.junit. Both work, but backticks are the standard BigQuery convention for fully-qualified table names.

Optional: Add backticks for consistency
 	qFmt := `SELECT ARRAY_AGG(DISTINCT lifecycle ORDER BY lifecycle) AS lifecycles
-		FROM %s.junit
+		FROM `+"`%s.junit`"+`
 		WHERE modified_time >= DATETIME_SUB(CURRENT_DATETIME(), INTERVAL 7 DAY)
 		AND lifecycle IS NOT NULL AND lifecycle != ''`
sippy-ng/src/component_readiness/SidebarTestFilters.js (1)

34-49: makeStyles called inside component body on every render.

While not introduced by this PR, makeStyles should be called outside the component to avoid recreating styles on each render.

♻️ Optional: Move useStyles outside component
+const useStyles = makeStyles((theme) => ({
+  formControl: {
+    margin: theme.spacing(1),
+  },
+  autocomplete: {
+    width: '100%',
+    '& .MuiAutocomplete-inputRoot': {
+      paddingRight: '9px !important',
+    },
+  },
+  chip: {
+    maxWidth: 'none',
+    flex: '1 1 auto',
+  },
+}))
+
 export default function SidebarTestFilters(props) {
   // ... hooks ...
-  const useStyles = makeStyles((theme) => ({
-    formControl: {
-      margin: theme.spacing(1),
-    },
-    // ...
-  }))
-
   const classes = useStyles()
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to data retention organization setting

📥 Commits

Reviewing files that changed from the base of the PR and between 276c75c and 3a3ddc3.

📒 Files selected for processing (10)
  • pkg/api/componentreadiness/query/querygenerators.go
  • pkg/api/componentreadiness/utils/queryparamparser.go
  • pkg/api/tests.go
  • pkg/apis/api/componentreport/reqopts/types.go
  • pkg/sippyserver/server.go
  • sippy-ng/src/component_readiness/CompReadyEnvCapabilities.js
  • sippy-ng/src/component_readiness/CompReadyUtils.js
  • sippy-ng/src/component_readiness/CompReadyVars.js
  • sippy-ng/src/component_readiness/ComponentReadiness.js
  • sippy-ng/src/component_readiness/SidebarTestFilters.js
🧰 Additional context used
🧬 Code graph analysis (7)
sippy-ng/src/component_readiness/CompReadyEnvCapabilities.js (1)
sippy-ng/src/component_readiness/Sidebar.js (2)
  • Sidebar (14-61)
  • theme (16-16)
pkg/api/componentreadiness/utils/queryparamparser.go (1)
pkg/apis/api/componentreport/reqopts/types.go (1)
  • TestFilters (60-63)
pkg/sippyserver/server.go (2)
pkg/api/tests.go (1)
  • GetTestLifecyclesFromDB (548-578)
pkg/sippyserver/capabilities.go (1)
  • ComponentReadinessCapability (15-15)
sippy-ng/src/component_readiness/SidebarTestFilters.js (2)
sippy-ng/src/component_readiness/ComponentReadiness.js (4)
  • testCapabilities (421-421)
  • TestCapabilitiesContext (185-185)
  • TestCapabilitiesContext (185-185)
  • testLifecycles (438-438)
sippy-ng/src/component_readiness/CompReadyVars.js (2)
  • testCapabilities (227-227)
  • testLifecycles (228-228)
sippy-ng/src/component_readiness/ComponentReadiness.js (1)
sippy-ng/src/component_readiness/SidebarTestFilters.js (1)
  • testLifecycles (33-33)
pkg/api/componentreadiness/query/querygenerators.go (1)
vendor/github.com/yosida95/uritemplate/v3/value.go (1)
  • Value (50-53)
sippy-ng/src/component_readiness/CompReadyVars.js (4)
sippy-ng/src/component_readiness/ComponentReadiness.js (1)
  • testLifecycles (438-438)
sippy-ng/src/component_readiness/SidebarTestFilters.js (1)
  • testLifecycles (33-33)
sippy-ng/src/component_readiness/CompReadyUtils.js (1)
  • params (468-468)
sippy-ng/src/component_readiness/TestDetailsReport.js (1)
  • params (323-323)
🪛 Biome (2.1.2)
sippy-ng/src/component_readiness/SidebarTestFilters.js

[error] 31-31: This hook is being called conditionally, but all hooks must be called in the exact same order in every component render.

Hooks should not be called after an early return.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 32-32: This hook is being called conditionally, but all hooks must be called in the exact same order in every component render.

Hooks should not be called after an early return.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 33-33: This hook is being called conditionally, but all hooks must be called in the exact same order in every component render.

Hooks should not be called after an early return.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

sippy-ng/src/component_readiness/ComponentReadiness.js

[error] 438-438: This hook is being called conditionally, but all hooks must be called in the exact same order in every component render.

Hooks should not be called after an early return.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 458-458: This hook is being called conditionally, but all hooks must be called in the exact same order in every component render.

Hooks should not be called after an early return.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🔇 Additional comments (18)
sippy-ng/src/component_readiness/CompReadyUtils.js (1)

444-446: LGTM!

The implementation correctly mirrors the existing testCapabilities pattern at lines 441-443, maintaining consistency in how array parameters are appended to the query string.

sippy-ng/src/component_readiness/CompReadyEnvCapabilities.js (1)

206-209: LGTM!

The addition of filterByLifecycles: true to controlsOpts correctly enables the lifecycle filter in the sidebar for the environment capabilities view, following the existing pattern for filterByCapabilities.

pkg/sippyserver/server.go (2)

898-907: LGTM!

The handler implementation correctly mirrors the existing jsonTestCapabilitiesFromDB pattern with proper error handling and logging.


2164-2170: LGTM!

The endpoint registration is consistent with the /api/tests/capabilities endpoint - using the same capability requirement (ComponentReadinessCapability) and cache duration (1 hour).

pkg/apis/api/componentreport/reqopts/types.go (1)

62-62: LGTM!

The Lifecycles field addition follows the same pattern as the existing Capabilities field, with appropriate omitempty tags ensuring backward compatibility.

pkg/api/componentreadiness/query/querygenerators.go (1)

377-385: LGTM! Lifecycle filter implementation follows established patterns.

The implementation correctly:

  • Applies the filter only to sample queries (isSample && len(reqOptions.Lifecycles) > 0)
  • Uses parameterized queries to prevent SQL injection
  • Handles NULL/empty lifecycle values as "blocking" via COALESCE(NULLIF(lifecycle, ''), 'blocking')

This mirrors the existing Capabilities filter pattern on lines 366-376.

pkg/api/componentreadiness/utils/queryparamparser.go (2)

75-76: LGTM! Query parameter parsing mirrors existing capabilities pattern.

The testLifecycles parameter parsing follows the same pattern as testCapabilities on line 75, maintaining consistency.


163-163: Correctly marks testLifecycles as incompatible with views.

This ensures users cannot combine lifecycle filters with predefined views, consistent with the treatment of testCapabilities.

sippy-ng/src/component_readiness/ComponentReadiness.js (4)

186-186: LGTM! Context creation follows existing pattern.

The TestLifecyclesContext is created identically to TestCapabilitiesContext on line 185, maintaining consistency.


438-456: Good error handling in fetchLifecycles.

The implementation correctly:

  • Doesn't fail the entire page on lifecycle fetch errors (logs and sets empty array)
  • Ensures state is always an array via Array.isArray() check
  • Follows the same pattern as fetchCapabilities

Note: The static analysis warning about conditional hooks is a pre-existing issue in this component (early returns at lines 290 and 318 occur before hooks). This PR doesn't introduce that pattern.


490-761: Provider properly wraps component tree.

The TestLifecyclesContext.Provider correctly wraps the Routes subtree, making lifecycle data available to all component readiness pages.


600-603: Correctly enables lifecycle filtering on main route.

The filterByLifecycles: true option enables the new Lifecycles filter in the Sidebar component for the main component readiness view.

sippy-ng/src/component_readiness/SidebarTestFilters.js (1)

125-171: LGTM! Lifecycles Autocomplete mirrors Capabilities implementation.

The new Lifecycles filter correctly:

  • Uses defensive Array.isArray() checks for both options and value
  • Follows the same UI pattern as the Capabilities filter
  • Adds appropriate margin-top spacing to separate from Capabilities
sippy-ng/src/component_readiness/CompReadyVars.js (5)

110-110: LGTM! Query parameter definition follows existing pattern.

testLifecycles is defined as ArrayParam, consistent with testCapabilities on line 109.


227-228: LGTM! State management mirrors testCapabilities.

The testLifecycles state variable and setter follow the same pattern as testCapabilities on line 227.


326-327: LGTM! State initialization from URL params is consistent.

Initialization follows the same pattern as testCapabilities on line 326, defaulting to an empty array.


367-368: LGTM! URL propagation in report generation is correct.

The testLifecycles value is included in setParams alongside testCapabilities, ensuring it persists in the URL when generating reports.


618-619: LGTM! Context exposure is complete.

Both testLifecycles and setTestLifecycles are exposed in the provider, enabling consumers like SidebarTestFilters to read and update the lifecycle filter state.

Comment on lines +24 to +33
if (
!props.controlsOpts?.filterByCapabilities &&
!props.controlsOpts?.filterByLifecycles
) {
// if we have no filters to show, omit the whole component
return <Fragment />
}
const varsContext = useContext(CompReadyVarsContext)
const testCapabilities = useContext(TestCapabilitiesContext)
const testLifecycles = useContext(TestLifecyclesContext)
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Hooks called after early return violates Rules of Hooks.

The early return on lines 24-30 causes useContext calls on lines 31-33 to be conditional. React requires hooks to be called in the same order on every render.

🐛 Proposed fix: Move early return after hooks
 export default function SidebarTestFilters(props) {
+  const varsContext = useContext(CompReadyVarsContext)
+  const testCapabilities = useContext(TestCapabilitiesContext)
+  const testLifecycles = useContext(TestLifecyclesContext)
+
   if (
     !props.controlsOpts?.filterByCapabilities &&
     !props.controlsOpts?.filterByLifecycles
   ) {
     // if we have no filters to show, omit the whole component
     return <Fragment />
   }
-  const varsContext = useContext(CompReadyVarsContext)
-  const testCapabilities = useContext(TestCapabilitiesContext)
-  const testLifecycles = useContext(TestLifecyclesContext)
   const useStyles = makeStyles((theme) => ({
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if (
!props.controlsOpts?.filterByCapabilities &&
!props.controlsOpts?.filterByLifecycles
) {
// if we have no filters to show, omit the whole component
return <Fragment />
}
const varsContext = useContext(CompReadyVarsContext)
const testCapabilities = useContext(TestCapabilitiesContext)
const testLifecycles = useContext(TestLifecyclesContext)
const varsContext = useContext(CompReadyVarsContext)
const testCapabilities = useContext(TestCapabilitiesContext)
const testLifecycles = useContext(TestLifecyclesContext)
if (
!props.controlsOpts?.filterByCapabilities &&
!props.controlsOpts?.filterByLifecycles
) {
// if we have no filters to show, omit the whole component
return <Fragment />
}
🧰 Tools
🪛 Biome (2.1.2)

[error] 31-31: This hook is being called conditionally, but all hooks must be called in the exact same order in every component render.

Hooks should not be called after an early return.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 32-32: This hook is being called conditionally, but all hooks must be called in the exact same order in every component render.

Hooks should not be called after an early return.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 33-33: This hook is being called conditionally, but all hooks must be called in the exact same order in every component render.

Hooks should not be called after an early return.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In @sippy-ng/src/component_readiness/SidebarTestFilters.js around lines 24 - 33,
The early return in SidebarTestFilters.js currently happens before the hooks,
making the useContext calls for varsContext, testCapabilities and testLifecycles
conditional and violating the Rules of Hooks; move the useContext calls (for
CompReadyVarsContext, TestCapabilitiesContext, TestLifecyclesContext) to execute
unconditionally at the top of the component, then perform the conditional check
on props.controlsOpts?.filterByCapabilities and
props.controlsOpts?.filterByLifecycles and return <Fragment /> afterwards so
hooks are always called in the same order.

@openshift-ci-robot
Copy link

Scheduling required tests:
/test e2e

@dgoodwin
Copy link
Contributor

Suggest making this live in 4.22 main view

Copy link
Member

@smg247 smg247 left a comment

Choose a reason for hiding this comment

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

/lgtm

@openshift-ci openshift-ci bot added the lgtm Indicates that a PR is ready to be merged. label Jan 14, 2026
@openshift-ci
Copy link
Contributor

openshift-ci bot commented Jan 14, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: smg247, stbenjam

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Jan 14, 2026

@stbenjam: all tests passed!

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@openshift-merge-bot openshift-merge-bot bot merged commit 5b0cd8c into openshift:main Jan 14, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants