NO-JIRA: Resolving govulncheck failures - #629
Conversation
|
@thiagoalessio: No Jira issue with key GO-2026 exists in the tracker at https://redhat.atlassian.net. DetailsIn response to this:
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. |
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThe change removes Jira issue filing and Slack workflow-step handling. It migrates file uploads to ChangesSlack behavior updates
Estimated code review effort: 3 (Moderate) | ~25 minutes Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
|
@thiagoalessio: No Jira issue with key GO-2026 exists in the tracker at https://redhat.atlassian.net. DetailsIn response to this:
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. |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (4)
pkg/slack/events/workflowSubmissionEvents/workflow_handler.go (1)
111-115: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueSimplify the return statement.
The error check and explicit returns can be collapsed into a single return statement.
♻️ Proposed refactor
- err = client.WorkflowStepCompleted(event.WorkflowStep.WorkflowStepExecuteID, outgoingOutputs) - if err != nil { - return err - } - return nil + return client.WorkflowStepCompleted(event.WorkflowStep.WorkflowStepExecuteID, outgoingOutputs)🤖 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 `@pkg/slack/events/workflowSubmissionEvents/workflow_handler.go` around lines 111 - 115, In the workflow submission handler, simplify the final client.WorkflowStepCompleted call by returning its result directly instead of assigning to err, checking it, and explicitly returning nil.pkg/slack/events/workflowSubmissionEvents/types.go (1)
139-139: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueCheck HTTP status code before decoding JSON.
If the Slack API returns a non-2xx status (e.g.,
502 Bad Gateway) with an HTML body, the JSON decoder will fail with a cryptic syntax error. Checking the status code first provides a clearer error message for debugging.🛠️ Proposed fix
+ if resp.StatusCode >= 300 { + return fmt.Errorf("slack API %s returned HTTP %d", method, resp.StatusCode) + } + var sr slackResponse🤖 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 `@pkg/slack/events/workflowSubmissionEvents/types.go` at line 139, In the response-handling flow around the slackResponse variable, validate the HTTP response status before attempting JSON decoding. For non-2xx responses, return a clear error containing the status information and skip decoding the body; retain the existing JSON decoding path for successful responses.cmd/ci-chat-bot/slack.go (1)
64-66: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick winAdd
ReadTimeoutto the HTTP server.While
ReadHeaderTimeoutmitigates basic Slowloris attacks targeting headers, a malicious client could still slowly trickle the request body and exhaust connections. Adding aReadTimeoutbounds the total time allowed to read the full request (including the body).🛡️ Proposed configuration
mux.Handle("/slack/interactive-endpoint", handler(handleInteraction(bot.BotSigningSecret, interactionrouter.ForModals(slackclient, jobManager, httpclient, bot.BotToken)))) - server := &http.Server{Addr: ":" + strconv.Itoa(bot.Port), Handler: mux, ReadHeaderTimeout: 10 * time.Second} + server := &http.Server{ + Addr: ":" + strconv.Itoa(bot.Port), + Handler: mux, + ReadHeaderTimeout: 10 * time.Second, + ReadTimeout: 30 * time.Second, + }🤖 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 `@cmd/ci-chat-bot/slack.go` around lines 64 - 66, Update the http.Server configuration in the server initialization to include a ReadTimeout that bounds the total request-read duration, including the body, while preserving the existing ReadHeaderTimeout setting.Source: Linters/SAST tools
pkg/slack/modals/common/version_views.go (1)
107-112: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winPrefer the SDK constructor over manual struct initialization.
While using
new(bool)functionally provides the pointer required by the upgradedslack-go/slackSDK, manually instantiatingTextBlockObjectliterals leaves your code vulnerable to future upstream struct alterations. It is highly recommended to use the SDK's native constructor (slackClient.NewTextBlockObject), which safely handles pointer extraction for you and shrinks visual boilerplate (a pattern that is already appropriately used inpkg/slack/modals/common/simple_modals.go).
pkg/slack/modals/common/version_views.go#L107-L112: Replace the struct literal withText: slackClient.NewTextBlockObject(slackClient.PlainTextType, "Version Specifications", false, false),pkg/slack/modals/common/version_views.go#L163-L168: Replace the struct literal withslackClient.NewTextBlockObject(slackClient.PlainTextType, config.ContextMetadata, false, false),pkg/slack/modals/common/version_views.go#L241-L246: Replace the struct literal withText: slackClient.NewTextBlockObject(slackClient.PlainTextType, "Select a Version", false, false),pkg/slack/modals/common/version_views.go#L270-L275: Replace the struct literal withslackClient.NewTextBlockObject(slackClient.PlainTextType, config.ContextMetadata, false, false),pkg/slack/modals/common/version_views.go#L344-L349: Replace the struct literal withText: slackClient.NewTextBlockObject(slackClient.PlainTextType, "There are too many results from the selected Stream. Select a Major.Minor as well", false, false),pkg/slack/modals/common/version_views.go#L373-L378: Replace the struct literal withslackClient.NewTextBlockObject(slackClient.PlainTextType, config.ContextMetadata, false, false),pkg/slack/modals/common/version_views.go#L404-L409: Replace the struct literal withText: slackClient.NewTextBlockObject(slackClient.PlainTextType, "Enter A PR", false, false),pkg/slack/modals/common/version_views.go#L428-L433: Replace the struct literal withslackClient.NewTextBlockObject(slackClient.PlainTextType, config.ContextMetadata, false, false),pkg/slack/modals/common/version_views.go#L496-L501: Replace the struct literal withText: slackClient.NewTextBlockObject(slackClient.PlainTextType, "Do you want to launch from a PR?", false, false),pkg/slack/modals/common/version_views.go#L522-L527: Replace the struct literal withslackClient.NewTextBlockObject(slackClient.PlainTextType, config.ContextMetadata, false, false),pkg/slack/modals/launch/views.go#L46-L51: Replace the struct literal withText: slackClient.NewTextBlockObject(slackClient.PlainTextType, "Select the Launch Platform and Architecture", false, false),pkg/slack/modals/launch/views.go#L139-L144: Replace the struct literal withslackClient.NewTextBlockObject(slackClient.PlainTextType, context, false, false),pkg/slack/modals/list/views.go#L20-L25: Replace the struct literal withText: slackClient.NewTextBlockObject(slackClient.PlainTextType, "See who is hogging all the clusters", false, false),pkg/slack/modals/mce/create/views.go#L51-L56: Replace the struct literal withText: slackClient.NewTextBlockObject(slackClient.PlainTextType, "Select the Launch Platform and Duration", false, false),pkg/slack/modals/mce/create/views.go#L117-L122: Replace the struct literal withslackClient.NewTextBlockObject(slackClient.PlainTextType, context, false, false),🤖 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 `@pkg/slack/modals/common/version_views.go` around lines 107 - 112, Replace each manual slackClient.TextBlockObject literal with slackClient.NewTextBlockObject, preserving the existing PlainTextType, text value, and false/false arguments. Apply this in pkg/slack/modals/common/version_views.go at lines 107-112, 163-168, 241-246, 270-275, 344-349, 373-378, 404-409, 428-433, 496-501, and 522-527; pkg/slack/modals/launch/views.go at lines 46-51 and 139-144; pkg/slack/modals/list/views.go at lines 20-25; and pkg/slack/modals/mce/create/views.go at lines 51-56 and 117-122.
🤖 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 `@pkg/slack/events/workflowSubmissionEvents/types.go`:
- Around line 36-43: Remove redundant pointers from WorkflowStepInputs and
WorkflowStepOutput throughout eventWorkflowStep, workflowUpdateStepRequest, and
SaveWorkflowStepConfiguration, using non-pointer map and slice types so nil
values remain safely rangeable. In
pkg/slack/events/workflowSubmissionEvents/workflow_handler.go, remove
dereferences of Inputs and Outputs. In pkg/slack/interactions/router/router.go,
pass input and output values directly and update the slackClient interface
signature to match; apply these changes at types.go lines 36-43, 73-77, and
112-120, workflow_handler.go lines 58-74, 76-116, and 118-144, and router.go
lines 96-101 and 124-127.
- Line 137: Update the defer around resp.Body.Close() to explicitly discard or
handle its returned error, preserving the existing response-body cleanup while
satisfying golangci-lint.
- Line 126: Update the request construction in the client method containing
http.NewRequestWithContext to derive the context with context.WithTimeout
instead of context.Background(), using the appropriate existing or defined
duration and ensuring the cancel function is released. Pass the timed context to
the POST request so unresponsive Slack API calls terminate within the bound.
---
Nitpick comments:
In `@cmd/ci-chat-bot/slack.go`:
- Around line 64-66: Update the http.Server configuration in the server
initialization to include a ReadTimeout that bounds the total request-read
duration, including the body, while preserving the existing ReadHeaderTimeout
setting.
In `@pkg/slack/events/workflowSubmissionEvents/types.go`:
- Line 139: In the response-handling flow around the slackResponse variable,
validate the HTTP response status before attempting JSON decoding. For non-2xx
responses, return a clear error containing the status information and skip
decoding the body; retain the existing JSON decoding path for successful
responses.
In `@pkg/slack/events/workflowSubmissionEvents/workflow_handler.go`:
- Around line 111-115: In the workflow submission handler, simplify the final
client.WorkflowStepCompleted call by returning its result directly instead of
assigning to err, checking it, and explicitly returning nil.
In `@pkg/slack/modals/common/version_views.go`:
- Around line 107-112: Replace each manual slackClient.TextBlockObject literal
with slackClient.NewTextBlockObject, preserving the existing PlainTextType, text
value, and false/false arguments. Apply this in
pkg/slack/modals/common/version_views.go at lines 107-112, 163-168, 241-246,
270-275, 344-349, 373-378, 404-409, 428-433, 496-501, and 522-527;
pkg/slack/modals/launch/views.go at lines 46-51 and 139-144;
pkg/slack/modals/list/views.go at lines 20-25; and
pkg/slack/modals/mce/create/views.go at lines 51-56 and 117-122.
🪄 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: Enterprise
Run ID: 476b0573-8459-468f-9de0-37e8ba69449c
⛔ Files ignored due to path filters (89)
go.sumis excluded by!**/*.sumvendor/github.com/slack-go/slack/.gitignoreis excluded by!vendor/**vendor/github.com/slack-go/slack/.golangci.ymlis excluded by!vendor/**vendor/github.com/slack-go/slack/CHANGELOG.mdis excluded by!vendor/**vendor/github.com/slack-go/slack/CONTRIBUTING.mdis excluded by!vendor/**vendor/github.com/slack-go/slack/Makefileis excluded by!vendor/**vendor/github.com/slack-go/slack/README.mdis excluded by!vendor/**vendor/github.com/slack-go/slack/TODO.txtis excluded by!vendor/**vendor/github.com/slack-go/slack/admin.gois excluded by!vendor/**vendor/github.com/slack-go/slack/admin_conversations.gois excluded by!vendor/**vendor/github.com/slack-go/slack/admin_conversations_ekm.gois excluded by!vendor/**vendor/github.com/slack-go/slack/admin_conversations_restrictAccess.gois excluded by!vendor/**vendor/github.com/slack-go/slack/admin_roles.gois excluded by!vendor/**vendor/github.com/slack-go/slack/admin_teams.gois excluded by!vendor/**vendor/github.com/slack-go/slack/apps.gois excluded by!vendor/**vendor/github.com/slack-go/slack/assistant.gois excluded by!vendor/**vendor/github.com/slack-go/slack/attachments.gois excluded by!vendor/**vendor/github.com/slack-go/slack/audit.gois excluded by!vendor/**vendor/github.com/slack-go/slack/auth.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_action.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_alert.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_call.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_card.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_carousel.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_context.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_context_actions.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_conv.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_divider.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_element.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_file.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_header.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_image.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_input.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_json.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_markdown.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_object.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_plan.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_rich_text.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_section.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_table.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_task_card.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_unknown.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_video.gois excluded by!vendor/**vendor/github.com/slack-go/slack/channels.gois excluded by!vendor/**vendor/github.com/slack-go/slack/chat.gois excluded by!vendor/**vendor/github.com/slack-go/slack/chat_stream_chunks.gois excluded by!vendor/**vendor/github.com/slack-go/slack/conversation.gois excluded by!vendor/**vendor/github.com/slack-go/slack/dialog.gois excluded by!vendor/**vendor/github.com/slack-go/slack/dnd.gois excluded by!vendor/**vendor/github.com/slack-go/slack/entity.gois excluded by!vendor/**vendor/github.com/slack-go/slack/files.gois excluded by!vendor/**vendor/github.com/slack-go/slack/function_execute.gois excluded by!vendor/**vendor/github.com/slack-go/slack/huddle.gois excluded by!vendor/**vendor/github.com/slack-go/slack/im.gois excluded by!vendor/**vendor/github.com/slack-go/slack/info.gois excluded by!vendor/**vendor/github.com/slack-go/slack/interactions.gois excluded by!vendor/**vendor/github.com/slack-go/slack/manifests.gois excluded by!vendor/**vendor/github.com/slack-go/slack/messages.gois excluded by!vendor/**vendor/github.com/slack-go/slack/metadata.gois excluded by!vendor/**vendor/github.com/slack-go/slack/migration.gois excluded by!vendor/**vendor/github.com/slack-go/slack/misc.gois excluded by!vendor/**vendor/github.com/slack-go/slack/mise.tomlis excluded by!vendor/**vendor/github.com/slack-go/slack/oauth.gois excluded by!vendor/**vendor/github.com/slack-go/slack/reactions.gois excluded by!vendor/**vendor/github.com/slack-go/slack/remotefiles.gois excluded by!vendor/**vendor/github.com/slack-go/slack/retry.gois excluded by!vendor/**vendor/github.com/slack-go/slack/rtm.gois excluded by!vendor/**vendor/github.com/slack-go/slack/search.gois excluded by!vendor/**vendor/github.com/slack-go/slack/security.gois excluded by!vendor/**vendor/github.com/slack-go/slack/slack.gois excluded by!vendor/**vendor/github.com/slack-go/slack/slackevents/action_events.gois excluded by!vendor/**vendor/github.com/slack-go/slack/slackevents/inner_events.gois excluded by!vendor/**vendor/github.com/slack-go/slack/slackevents/parsers.gois excluded by!vendor/**vendor/github.com/slack-go/slack/socket_mode.gois excluded by!vendor/**vendor/github.com/slack-go/slack/stars.gois excluded by!vendor/**vendor/github.com/slack-go/slack/team.gois excluded by!vendor/**vendor/github.com/slack-go/slack/usergroups.gois excluded by!vendor/**vendor/github.com/slack-go/slack/users.gois excluded by!vendor/**vendor/github.com/slack-go/slack/views.gois excluded by!vendor/**vendor/github.com/slack-go/slack/webhooks.gois excluded by!vendor/**vendor/github.com/slack-go/slack/websocket_groups.gois excluded by!vendor/**vendor/github.com/slack-go/slack/websocket_managed_conn.gois excluded by!vendor/**vendor/github.com/slack-go/slack/websocket_misc.gois excluded by!vendor/**vendor/github.com/slack-go/slack/workflow_step.gois excluded by!vendor/**vendor/github.com/slack-go/slack/workflow_step_execute.gois excluded by!vendor/**vendor/github.com/slack-go/slack/workflows_featured.gois excluded by!vendor/**vendor/github.com/slack-go/slack/workflows_triggers.gois excluded by!vendor/**vendor/modules.txtis excluded by!vendor/**
📒 Files selected for processing (16)
cmd/ci-chat-bot/slack.gogo.modpkg/slack/actions_request_test.gopkg/slack/events/router/router.gopkg/slack/events/workflowSubmissionEvents/types.gopkg/slack/events/workflowSubmissionEvents/workflow_handler.gopkg/slack/interactions/router/router.gopkg/slack/modals/common/simple_modals.gopkg/slack/modals/common/version_views.gopkg/slack/modals/launch/views.gopkg/slack/modals/list/views.gopkg/slack/modals/mce/create/views.gopkg/slack/modals/stepsFromApp/jira_step.gopkg/slack/modals/stepsFromApp/workflow_submit.gopkg/slack/parser/types.gopkg/slack/slack.go
Resolves vulnerability GO-2026-5410 by upgrading github.com/slack-go/slack to v0.23.1. Adapts to breaking API changes: - UploadFileV2Parameters renamed to UploadFileParameters - RichTextPreformatted struct flattened (no longer embeds RichTextSection) - TextBlockObject.Emoji changed from bool to *bool - WorkflowStep types removed (deprecated Steps from Apps feature): defines local types and HTTP client for workflows.updateStep, workflows.stepCompleted, and workflows.stepFailed API calls - InteractionCallback.WorkflowStep field removed: extracts workflow_step_edit_id from raw JSON in handleInteraction Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
@thiagoalessio: This pull request explicitly references no jira issue. DetailsIn response to this:
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. |
50ae70a to
2ad8f85
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (2)
pkg/slack/actions_request_test.go (1)
306-318: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAssert the complete upload payload.
The callback currently checks only
Filename; it would still pass ifContent,FileSize,Channel, orInitialCommentwere dropped or changed during the migration.🤖 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 `@pkg/slack/actions_request_test.go` around lines 306 - 318, Strengthen the upload callback assertion in the test setup around uploadFileFunc to validate the complete slack.UploadFileParameters payload, including Content, FileSize, Channel, and InitialComment, in addition to the existing conditional Filename check. Derive expected values from the current test case and report mismatches through the test assertion mechanism.go.mod (1)
54-58: 🎯 Functional Correctness | 🔵 TrivialConfirm the Go toolchain and run the required verification.
The Slack SDK v0.23.1 declares
go 1.25andtoolchain go1.25.9; confirm the repository directive and CI images meet that minimum before merging. (raw.githubusercontent.com)Run
make verify lint test all; this must include thegcsbuild tag and race-enabled tests. As per coding guidelines: “Always runmake verify lint test allbefore committing code changes,” use-tags gcs, and run tests with-race.🤖 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 `@go.mod` around lines 54 - 58, Confirm the repository’s Go directive and CI toolchain images meet Slack SDK v0.23.1’s minimum Go 1.25/toolchain go1.25.9 requirement, updating them if necessary. Then run the complete verification command `make verify lint test all`, ensuring verification includes the gcs build tag and race-enabled tests.Sources: Coding guidelines, MCP tools
🤖 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.
Nitpick comments:
In `@go.mod`:
- Around line 54-58: Confirm the repository’s Go directive and CI toolchain
images meet Slack SDK v0.23.1’s minimum Go 1.25/toolchain go1.25.9 requirement,
updating them if necessary. Then run the complete verification command `make
verify lint test all`, ensuring verification includes the gcs build tag and
race-enabled tests.
In `@pkg/slack/actions_request_test.go`:
- Around line 306-318: Strengthen the upload callback assertion in the test
setup around uploadFileFunc to validate the complete slack.UploadFileParameters
payload, including Content, FileSize, Channel, and InitialComment, in addition
to the existing conditional Filename check. Derive expected values from the
current test case and report mismatches through the test assertion mechanism.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: c247404c-8a6b-41bc-9ed7-ac5cdc4e8ae3
⛔ Files ignored due to path filters (162)
go.sumis excluded by!**/*.sumvendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/gcp_authn/v3/gcp_authn.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/gcp_authn/v3/gcp_authn.pb.validate.gois excluded by!vendor/**vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/gcp_authn/v3/gcp_authn_vtproto.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/github.com/slack-go/slack/.gitignoreis excluded by!vendor/**vendor/github.com/slack-go/slack/.golangci.ymlis excluded by!vendor/**vendor/github.com/slack-go/slack/CHANGELOG.mdis excluded by!vendor/**vendor/github.com/slack-go/slack/CONTRIBUTING.mdis excluded by!vendor/**vendor/github.com/slack-go/slack/Makefileis excluded by!vendor/**vendor/github.com/slack-go/slack/README.mdis excluded by!vendor/**vendor/github.com/slack-go/slack/TODO.txtis excluded by!vendor/**vendor/github.com/slack-go/slack/admin.gois excluded by!vendor/**vendor/github.com/slack-go/slack/admin_conversations.gois excluded by!vendor/**vendor/github.com/slack-go/slack/admin_conversations_ekm.gois excluded by!vendor/**vendor/github.com/slack-go/slack/admin_conversations_restrictAccess.gois excluded by!vendor/**vendor/github.com/slack-go/slack/admin_roles.gois excluded by!vendor/**vendor/github.com/slack-go/slack/admin_teams.gois excluded by!vendor/**vendor/github.com/slack-go/slack/apps.gois excluded by!vendor/**vendor/github.com/slack-go/slack/assistant.gois excluded by!vendor/**vendor/github.com/slack-go/slack/attachments.gois excluded by!vendor/**vendor/github.com/slack-go/slack/audit.gois excluded by!vendor/**vendor/github.com/slack-go/slack/auth.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_action.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_alert.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_call.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_card.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_carousel.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_context.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_context_actions.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_conv.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_divider.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_element.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_file.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_header.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_image.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_input.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_json.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_markdown.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_object.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_plan.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_rich_text.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_section.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_table.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_task_card.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_unknown.gois excluded by!vendor/**vendor/github.com/slack-go/slack/block_video.gois excluded by!vendor/**vendor/github.com/slack-go/slack/channels.gois excluded by!vendor/**vendor/github.com/slack-go/slack/chat.gois excluded by!vendor/**vendor/github.com/slack-go/slack/chat_stream_chunks.gois excluded by!vendor/**vendor/github.com/slack-go/slack/conversation.gois excluded by!vendor/**vendor/github.com/slack-go/slack/dialog.gois excluded by!vendor/**vendor/github.com/slack-go/slack/dnd.gois excluded by!vendor/**vendor/github.com/slack-go/slack/entity.gois excluded by!vendor/**vendor/github.com/slack-go/slack/files.gois excluded by!vendor/**vendor/github.com/slack-go/slack/function_execute.gois excluded by!vendor/**vendor/github.com/slack-go/slack/huddle.gois excluded by!vendor/**vendor/github.com/slack-go/slack/im.gois excluded by!vendor/**vendor/github.com/slack-go/slack/info.gois excluded by!vendor/**vendor/github.com/slack-go/slack/interactions.gois excluded by!vendor/**vendor/github.com/slack-go/slack/manifests.gois excluded by!vendor/**vendor/github.com/slack-go/slack/messages.gois excluded by!vendor/**vendor/github.com/slack-go/slack/metadata.gois excluded by!vendor/**vendor/github.com/slack-go/slack/migration.gois excluded by!vendor/**vendor/github.com/slack-go/slack/misc.gois excluded by!vendor/**vendor/github.com/slack-go/slack/mise.tomlis excluded by!vendor/**vendor/github.com/slack-go/slack/oauth.gois excluded by!vendor/**vendor/github.com/slack-go/slack/reactions.gois excluded by!vendor/**vendor/github.com/slack-go/slack/remotefiles.gois excluded by!vendor/**vendor/github.com/slack-go/slack/retry.gois excluded by!vendor/**vendor/github.com/slack-go/slack/rtm.gois excluded by!vendor/**vendor/github.com/slack-go/slack/search.gois excluded by!vendor/**vendor/github.com/slack-go/slack/security.gois excluded by!vendor/**vendor/github.com/slack-go/slack/slack.gois excluded by!vendor/**vendor/github.com/slack-go/slack/slackevents/action_events.gois excluded by!vendor/**vendor/github.com/slack-go/slack/slackevents/inner_events.gois excluded by!vendor/**vendor/github.com/slack-go/slack/slackevents/parsers.gois excluded by!vendor/**vendor/github.com/slack-go/slack/socket_mode.gois excluded by!vendor/**vendor/github.com/slack-go/slack/stars.gois excluded by!vendor/**vendor/github.com/slack-go/slack/team.gois excluded by!vendor/**vendor/github.com/slack-go/slack/usergroups.gois excluded by!vendor/**vendor/github.com/slack-go/slack/users.gois excluded by!vendor/**vendor/github.com/slack-go/slack/views.gois excluded by!vendor/**vendor/github.com/slack-go/slack/webhooks.gois excluded by!vendor/**vendor/github.com/slack-go/slack/websocket_groups.gois excluded by!vendor/**vendor/github.com/slack-go/slack/websocket_managed_conn.gois excluded by!vendor/**vendor/github.com/slack-go/slack/websocket_misc.gois excluded by!vendor/**vendor/github.com/slack-go/slack/workflow_step.gois excluded by!vendor/**vendor/github.com/slack-go/slack/workflow_step_execute.gois excluded by!vendor/**vendor/github.com/slack-go/slack/workflows_featured.gois excluded by!vendor/**vendor/github.com/slack-go/slack/workflows_triggers.gois excluded by!vendor/**vendor/golang.org/x/text/cases/context.gois excluded by!vendor/**vendor/golang.org/x/text/cases/map.gois excluded by!vendor/**vendor/golang.org/x/text/unicode/norm/forminfo.gois excluded by!vendor/**vendor/golang.org/x/text/unicode/norm/iter.gois excluded by!vendor/**vendor/golang.org/x/text/unicode/norm/normalize.gois excluded by!vendor/**vendor/golang.org/x/tools/go/packages/packages.gois excluded by!vendor/**vendor/golang.org/x/tools/internal/gcimporter/iexport.gois excluded by!vendor/**vendor/golang.org/x/tools/internal/gcimporter/iimport.gois excluded by!vendor/**vendor/golang.org/x/tools/internal/imports/fix.gois excluded by!vendor/**vendor/golang.org/x/tools/internal/imports/imports.gois excluded by!vendor/**vendor/golang.org/x/tools/internal/stdlib/deps.gois excluded by!vendor/**vendor/golang.org/x/tools/internal/stdlib/manifest.gois excluded by!vendor/**vendor/golang.org/x/tools/internal/typesinternal/element.gois excluded by!vendor/**vendor/golang.org/x/tools/internal/typesinternal/types.gois excluded by!vendor/**vendor/golang.org/x/tools/internal/typesinternal/zerovalue.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/balancer.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/grpclb/grpc_lb_v1/load_balancer_grpc.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/ringhash/ringhash.gois excluded by!vendor/**vendor/google.golang.org/grpc/balancer/rls/control_channel.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/alts/alts.gois excluded by!vendor/**vendor/google.golang.org/grpc/credentials/alts/internal/proto/grpc_gcp/handshaker_grpc.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/google.golang.org/grpc/dialoptions.gois excluded by!vendor/**vendor/google.golang.org/grpc/encoding/encoding.gois excluded by!vendor/**vendor/google.golang.org/grpc/encoding/gzip/gzip.gois excluded by!vendor/**vendor/google.golang.org/grpc/experimental/balancer/hostname/hostname.gois excluded by!vendor/**vendor/google.golang.org/grpc/experimental/balancer/weight/weight.gois excluded by!vendor/**vendor/google.golang.org/grpc/health/grpc_health_v1/health_grpc.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/google.golang.org/grpc/internal/envconfig/envconfig.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/envconfig/xds.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/grpcutil/encode_duration.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/proto/grpc_lookup_v1/rls_grpc.pb.gois excluded by!**/*.pb.go,!vendor/**vendor/google.golang.org/grpc/internal/resolver/config_selector.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/stats/labels.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/client_stream.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/controlbuf.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/flowcontrol.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/handler_server.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http2_client.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/http2_server.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/internal/internal.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/transport/transport.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/balancer/cdsbalancer/configbuilder.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/balancer/clusterimpl/clusterimpl.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/balancer/clusterimpl/picker.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/httpfilter/extconfig.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/httpfilter/httpfilter.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/matcher/matcher_header.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/matcher/string_matcher.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/rbac/matchers.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/resolver/serviceconfig.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/resolver/xds_resolver.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/server/filter_chain_manager.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/server/listener_wrapper.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/xdsclient/xdsresource/grpc_service.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/xdsclient/xdsresource/matcher_path.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/xdsclient/xdsresource/metadata.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/xdsclient/xdsresource/type_cds.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/xdsclient/xdsresource/type_lds.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/xdsclient/xdsresource/unmarshal_cds.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/xdsclient/xdsresource/unmarshal_eds.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/xdsclient/xdsresource/unmarshal_lds.gois excluded by!vendor/**vendor/google.golang.org/grpc/internal/xds/xdsclient/xdsresource/unmarshal_rds.gois excluded by!vendor/**vendor/google.golang.org/grpc/rpc_util.gois excluded by!vendor/**vendor/google.golang.org/grpc/server.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/opentelemetry/client_metrics.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/opentelemetry/client_tracing.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/opentelemetry/opentelemetry.gois excluded by!vendor/**vendor/google.golang.org/grpc/stats/opentelemetry/trace.gois excluded by!vendor/**vendor/google.golang.org/grpc/version.gois excluded by!vendor/**vendor/modules.txtis excluded by!vendor/**
📒 Files selected for processing (16)
cmd/ci-chat-bot/slack.gogo.modpkg/slack/actions_request_test.gopkg/slack/events/router/router.gopkg/slack/events/workflowSubmissionEvents/types.gopkg/slack/events/workflowSubmissionEvents/workflow_handler.gopkg/slack/interactions/router/router.gopkg/slack/modals/common/simple_modals.gopkg/slack/modals/common/version_views.gopkg/slack/modals/launch/views.gopkg/slack/modals/list/views.gopkg/slack/modals/mce/create/views.gopkg/slack/modals/stepsFromApp/jira_step.gopkg/slack/modals/stepsFromApp/workflow_submit.gopkg/slack/parser/types.gopkg/slack/slack.go
🚧 Files skipped from review as they are similar to previous changes (2)
- pkg/slack/modals/stepsFromApp/jira_step.go
- pkg/slack/modals/list/views.go
|
/approve |
|
/unhold |
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
pkg/slack/events/workflowSubmissionEvents/types.go (2)
140-147: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick winReject non-2xx responses before JSON decoding.
postJSONdecodesresp.Bodybefore checkingresp.StatusCode. A non-2xx gateway error can become a JSON decoding error, and a non-success response with{"ok":true}can be treated as successful. Return an error for success codes outside the 2xx range, then keep the existingsr.OK == falsehandling.🤖 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 `@pkg/slack/events/workflowSubmissionEvents/types.go` around lines 140 - 147, Update postJSON to validate resp.StatusCode before decoding resp.Body, returning an error for any status outside the 2xx range. Preserve the existing JSON decoding and sr.OK == false handling for successful HTTP responses.
4-14: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy liftKeep workflow values JSON-compatible.
Slack workflow step inputs and outputs can contain arrays or other non-string JSON values. The current
stringboundary atWorkflowStepInputElement.Value,WorkflowStepCompleted, andworkflowStepInputsFromAppcan drop valid payloads or fail to represent them. Model the Slack boundary withany/json.RawMessage, then convert only the supported Jira fields to strings.🤖 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 `@pkg/slack/events/workflowSubmissionEvents/types.go` around lines 4 - 14, Update the workflow value boundary across WorkflowStepInputElement.Value, workflowSubmit.WorkflowStepCompleted, and workflowStepInputsFromApp to preserve arrays and other JSON values using any or json.RawMessage instead of string. Ensure JSON decoding and output propagation retain non-string payloads, while converting only the supported Jira fields to strings at the Jira integration boundary.
🤖 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.
Outside diff comments:
In `@pkg/slack/events/workflowSubmissionEvents/types.go`:
- Around line 140-147: Update postJSON to validate resp.StatusCode before
decoding resp.Body, returning an error for any status outside the 2xx range.
Preserve the existing JSON decoding and sr.OK == false handling for successful
HTTP responses.
- Around line 4-14: Update the workflow value boundary across
WorkflowStepInputElement.Value, workflowSubmit.WorkflowStepCompleted, and
workflowStepInputsFromApp to preserve arrays and other JSON values using any or
json.RawMessage instead of string. Ensure JSON decoding and output propagation
retain non-string payloads, while converting only the supported Jira fields to
strings at the Jira integration boundary.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: a8f3cb2f-0796-4d60-b650-3fd71732d6a0
📒 Files selected for processing (3)
pkg/slack/events/workflowSubmissionEvents/types.gopkg/slack/events/workflowSubmissionEvents/workflow_handler.gopkg/slack/interactions/router/router.go
🚧 Files skipped from review as they are similar to previous changes (2)
- pkg/slack/interactions/router/router.go
- pkg/slack/events/workflowSubmissionEvents/workflow_handler.go
|
/hold found an issue on the launch modal. |
Re-register workflow_step_execute in EventsAPIInnerEventMapping since the slack-go library removed it, and add a nil guard for the Jira filer to prevent panics when Jira is not configured. Add tests covering the workflow handler, event parsing, and slack-go serialization changes (RichTextPreformatted flattening, *bool Emoji field). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
🧹 Nitpick comments (1)
pkg/slack/events/workflowSubmissionEvents/workflow_handler_test.go (1)
191-293: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy liftExercise the positive handler path.
Line 192 creates
handler, but lines 224-293 never callhandler.Handle. The test only verifies Slack event parsing and local JSON decoding. It cannot detect a regression whereHandlerdoes not callhandleJiraStepforjira_ticket.Pass the parsed callback event to
handler.Handlewith controllable Jira filing and workflow API dependencies. Assert the Jira action and the completion or failure request.🤖 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 `@pkg/slack/events/workflowSubmissionEvents/workflow_handler_test.go` around lines 191 - 293, Update TestHandlerEndToEndJiraTicket to invoke handler.Handle with the parsed callback event instead of stopping after local decoding. Provide controllable Jira filing and workflow API dependencies, then assert that the jira_ticket path triggers the expected Jira action and sends the appropriate workflow completion or failure request.
🤖 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.
Nitpick comments:
In `@pkg/slack/events/workflowSubmissionEvents/workflow_handler_test.go`:
- Around line 191-293: Update TestHandlerEndToEndJiraTicket to invoke
handler.Handle with the parsed callback event instead of stopping after local
decoding. Provide controllable Jira filing and workflow API dependencies, then
assert that the jira_ticket path triggers the expected Jira action and sends the
appropriate workflow completion or failure request.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 09bfd33b-a4d7-491a-b7f1-032209b10bcc
📒 Files selected for processing (5)
pkg/slack/events/workflowSubmissionEvents/types.gopkg/slack/events/workflowSubmissionEvents/workflow_handler.gopkg/slack/events/workflowSubmissionEvents/workflow_handler_test.gopkg/slack/interactions/router/router.gopkg/slack/modals/common/simple_modals_test.go
🚧 Files skipped from review as they are similar to previous changes (3)
- pkg/slack/events/workflowSubmissionEvents/types.go
- pkg/slack/interactions/router/router.go
- pkg/slack/events/workflowSubmissionEvents/workflow_handler.go
Replace interface{} with any in test files to satisfy go fix, and
improve TestHandlerEndToEndJiraTicket to exercise handler.Handle()
with mock dependencies.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
/unhold the only thing I didn't manage to test manually was the workflow steps ... but I asked claude to add a bunch of unit tests for that. the rest seems to be working just fine. |
| // workflowStepExecuteEvent mirrors the deprecated slackevents.WorkflowStepExecuteEvent | ||
| // which was removed from slack-go/slack v0.23.0+. |
There was a problem hiding this comment.
What is the "new" way to handle these kinds of things then? Trying to figure out if this is something we need to fully address (i.e. convert to the "new" path) sooner than later?
|
/hold |
Slack deprecated Steps from Apps and removed the UI to create new workflow steps. The entire Jira integration existed solely to support this feature and has no remaining callers. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
||
| jiraOptions flagutil.JiraOptions |
There was a problem hiding this comment.
Just so you are aware, this is a breaking change.
What happen if/when there is deployment logic that currently references these parameters?
That is absolutely the case for the ClusterBot's deployment:
https://github.com/openshift/release/blob/3abed544b8d6d696ffa2bd56ad2cb4d0baf92d3c/clusters/app.ci/ci-chat-bot/ci-chat-bot.yaml#L434-L436
An alternate implementation would be: remove all the logic, leaving the options as is, and if specified printing a "deprecation" warning type message. This would ensure that the PR is non-breaking.
As currently written this PR cannot merge until the aforementioned parameters are removed or an alternate approach is taken. I'll let you decide how to proceed, because technically we're responsible for both pieces regardless, but this situation is an important nuance in our world!
| opt.GitHubOptions.AddFlags(emptyFlags) | ||
| opt.KubernetesOptions.AddFlags(emptyFlags) | ||
| opt.InstrumentationOptions.AddFlags(emptyFlags) | ||
| opt.jiraOptions.AddFlags(emptyFlags) |
There was a problem hiding this comment.
Same as above! This is what actually adds the options if they are to stay
The deployment config in openshift/release still passes --jira-endpoint, --jira-username, and --jira-password-file. Retain the flags as no-ops with a deprecation warning so this PR can merge without a coordinated deployment change. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: thiagoalessio The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
@thiagoalessio: all tests passed! Full PR test history. Your PR dashboard. DetailsInstructions 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. |
UPDATE: Also removed all JIRA-related functionality after our conversation on the scrum call;
Slack dependency bump has breaking changes, need to run my local copy continuousreleaseteam Slack and test it before unholding this PR.
well, it seems fine to me. @bradmwilliams and/or @hoxhaeris , would you guys like to test something specific before we merge this?
Summary by CodeRabbit
Removed Features
Bug Fixes
Chores