Skip to content

[AI] OSAC-2126: Scale accepted but NodePool unchanged when ClusterOrder phase is Failed - #151

Merged
omer-vishlitzky merged 8 commits into
osac-project:mainfrom
osac-dev-bot:osac-jira-ai-issue-solver/OSAC-2126
Aug 10, 2026
Merged

[AI] OSAC-2126: Scale accepted but NodePool unchanged when ClusterOrder phase is Failed#151
omer-vishlitzky merged 8 commits into
osac-project:mainfrom
osac-dev-bot:osac-jira-ai-issue-solver/OSAC-2126

Conversation

@osac-jira-ai-issue-solver

@osac-jira-ai-issue-solver osac-jira-ai-issue-solver Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Resolves OSAC-2126

Summary

  • Reject cluster spec mutations (e.g., node set scaling) when cluster state is FAILED or DELETE_FAILED, returning InvalidArgument instead of silently accepting changes that the reconciler will never apply
  • Status-only updates (conditions, hub) remain allowed on failed clusters so controllers can still operate
  • Adds 5 unit tests covering rejection and allow cases for different cluster states

Fixes OSAC-2126

Test plan

  • Verify ginkgo run -r internal passes (servers suite requires PostgreSQL container)
  • Create a CaaS cluster where AAP jobs fail, confirm ClusterOrder phase is Failed
  • Attempt osac edit clusters <id> to increase node_sets size — should return InvalidArgument error
  • Verify status-only updates on failed clusters still succeed (controller reconciliation)
  • Verify spec updates on READY clusters still succeed (normal scaling)

Summary by CodeRabbit

  • Bug Fixes

    • Cluster updates now respect the current cluster state before applying spec changes.
    • Spec updates are rejected when a cluster is in a failed state, while status-only updates still work.
    • Updates continue to work normally for ready and in-progress clusters, and missing clusters are handled as before.
  • Tests

    • Added coverage for cluster update behavior across different cluster states.

…ase is Failed

Co-authored-by: osac-dev-bot <osac-automation@redhat.com>
@openshift-ci-robot

openshift-ci-robot commented Aug 5, 2026

Copy link
Copy Markdown

@osac-jira-ai-issue-solver[bot]: This pull request references OSAC-2126 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 bug to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Resolves OSAC-2126

Summary

  • Reject cluster spec mutations (e.g., node set scaling) when cluster state is FAILED or DELETE_FAILED, returning InvalidArgument instead of silently accepting changes that the reconciler will never apply
  • Status-only updates (conditions, hub) remain allowed on failed clusters so controllers can still operate
  • Adds 5 unit tests covering rejection and allow cases for different cluster states

Fixes OSAC-2126

Test plan

  • Verify ginkgo run -r internal passes (servers suite requires PostgreSQL container)
  • Create a CaaS cluster where AAP jobs fail, confirm ClusterOrder phase is Failed
  • Attempt osac edit clusters <id> to increase node_sets size — should return InvalidArgument error
  • Verify status-only updates on failed clusters still succeed (controller reconciliation)
  • Verify spec updates on READY clusters still succeed (normal scaling)

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.

@osac-jira-ai-issue-solver

osac-jira-ai-issue-solver Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor Author

AI Session Costs

Session Cost
New ticket $3.46
Feedback (1) (no changes) $0.81
Feedback (1) retry 1 $1.33
Feedback (2) $1.85
Feedback (3) $3.03
Feedback (4) $1.98
Feedback (5) $1.87
Total $14.33

@sk-ilya

sk-ilya commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
✅ Action performed

Full review finished.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 6bc99307-f97d-42f0-8f9c-eca04bfe62d4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

Cluster updates now validate the existing cluster state before applying spec changes. Spec updates fail with InvalidArgument in FAILED and DELETE_FAILED states. Status-only updates and updates in READY or PROGRESSING states remain allowed.

Changes

Cluster update validation

Layer / File(s) Summary
Validate state before spec updates
fulfillment-service/internal/servers/private_clusters_server.go
Update validates the existing cluster when the request covers spec. Spec changes are rejected for FAILED and DELETE_FAILED states.
Cover state-dependent update behavior
fulfillment-service/internal/servers/private_clusters_server_test.go
Tests verify rejection errors for terminal failure states and allow status-only or non-terminal-state spec updates.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

  • osac-project/osac#84: Both PRs modify cluster update handling in private_clusters_server.go, but add different validations.

Suggested labels: approved, lgtm

Suggested reviewers: danmanor, sk-ilya, akshaynadkarni

🚥 Pre-merge checks | ✅ 10 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Ai-Attribution ⚠️ Warning HEAD is authored by osac-jira-ai-issue-solver[bot] and has only a Co-authored-by trailer; no Assisted-by or Generated-by trailer is present. Add an Assisted-by or Generated-by trailer naming the AI tool, and do not use Co-Authored-By for AI attribution.
✅ Passed checks (10 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the OSAC-2126 failure scenario addressed by rejecting specification updates when the cluster order is failed.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
No-Hardcoded-Secrets ✅ Passed The PR additions contain no API keys, tokens, passwords, private keys, credential URLs, or secret-shaped literals; test values are ordinary identifiers and fixture strings.
No-Weak-Crypto ✅ Passed The PR changes only cluster-state validation and tests; added lines introduce no MD5, SHA1, DES, RC4, 3DES, Blowfish, ECB, custom crypto, or secret comparisons.
No-Injection-Vectors ✅ Passed The added code uses DAO SetId(id) and enum comparisons only; it adds no SQL concatenation, shell execution, eval/exec, unsafe YAML/pickle loading, or HTML injection.
Container-Privileges ✅ Passed The PR changes only Go server and test files; the diff adds no container/Kubernetes manifests or privilege settings such as privileged, hostPID, hostNetwork, SYS_ADMIN, or allowPrivilegeEscalation.
No-Sensitive-Data-In-Logs ✅ Passed The PR adds no logging calls or logged values. New validation returns only a cluster state in an API error; the existing catalog-item log is unchanged.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@fulfillment-service/internal/servers/private_clusters_server.go`:
- Around line 235-238: Move the FAILED/DELETE_FAILED terminal-state guard from
the pre-write validateClusterStateForSpecUpdate check into the atomic
spec-update condition used by GenericServer.Update or its DAO layer. Ensure the
masked spec fields are written only when the existing cluster state is
non-terminal, preventing concurrent status transitions from allowing a spec
write; do not rely on the client-supplied lock.
🪄 Autofix

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: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 76dd576f-ace2-4aa2-91b8-cfe455b23774

📥 Commits

Reviewing files that changed from the base of the PR and between 843f2f6 and fce77cd.

📒 Files selected for processing (2)
  • fulfillment-service/internal/servers/private_clusters_server.go
  • fulfillment-service/internal/servers/private_clusters_server_test.go

Comment on lines +235 to +238
err = s.validateClusterStateForSpecUpdate(ctx, request)
if err != nil {
return
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect GenericServer update behavior and DAO write conditions.
rg -n -C 12 --type go 'func \(.*\*GenericServer.*\) Update\(' .
rg -n -C 8 --type go 'SetLock\(|SetVersion\(|Transaction|transaction|Compare|Condition|WHERE' .

# Confirm whether a cluster update can enforce:
# status.state NOT IN (FAILED, DELETE_FAILED) in the same operation as the spec write.

Repository: osac-project/osac

Length of output: 50374


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Narrow inspection to the relevant private_clusters_server.go file and nearby functions.
wc -l fulfillment-service/internal/servers/private_clusters_server.go
sed -n '200,260p' fulfillment-service/internal/servers/private_clusters_server.go
sed -n '430,490p' fulfillment-service/internal/servers/private_clusters_server.go

# Locate the referenced helper and GenericServer Update implementation files by name/path.
rg -n --type go 'func \(.*\*PrivateClusters.*\) .*Update|func \(.*\*GenericServer.*\) Update\(|validateClusterStateForSpecUpdate|DELETE_FAILED|ClusterState' internal/servers fulfillment-service/internal -g '*.go' | head -n 200

Repository: osac-project/osac

Length of output: 30677


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the generic DAO and Update call path.
sed -n '600,660p' fulfillment-service/internal/servers/generic_server.go
rg -n --type go 'func \(.*Generic.*\) Update|SetId\(id\)\.Do|SetLock|SetVersion|Condition|Update\(|Tx|Transaction|Version' fulfillment-service/internal/servers/generic_*\*.go -g '*.go' -C 5

# Inspect all ClusterState terminal-state guards around spec updates in the repository.
rg -n --type go 'ClusterState_CLUSTER_STATE_FAILED|ClusterState_CLUSTER_STATE_DELETE_FAILED|validateClusterStateForSpecUpdate' fulfillment-service/internal -g '*.go' -C 4

# Inspect cluster reconciler terminal-state behavior.
sed -n '160,225p' fulfillment-service/internal/controllers/cluster/cluster_reconciler_function.go

Repository: osac-project/osac

Length of output: 1965


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Continue inspecting the generic update call path after locked GET.
sed -n '660,740p' fulfillment-service/internal/servers/generic_server.go

# Find the exact generic server files and inspect DAO call sites.
git ls-files 'fulfillment-service/internal/servers/*generic*.go' 'fulfillment-service/internal/*dao*.go' 'fulfillment-service/internal/**/dao*.go'
rg -n --type go 'SetLock\(true\)|SetVersion|Condition|tx\.Update|Update\(.*Version|SetId\(.*\)\.Do' fulfillment-service/internal/servers fulfillment-service/internal -g '*.go' -C 3 --max-count 200

# Inspect the full spec-state guard with tests.
sed -n '1020,1180p' fulfillment-service/internal/servers/private_clusters_server_test.go

Repository: osac-project/osac

Length of output: 50374


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Get exact generic server files and read the relevant Update method lines.
git ls-files 'fulfillment-service/internal/servers/*generic*server.go' 'fulfillment-service/internal/servers/generic*.go'

FILE=$(git ls-files 'fulfillment-service/internal/servers/generic_server.go' | head -n 1)
sed -n '607,730p' "$FILE"

# Search only server and core files for the same methods using path prefixes.
rg -n --type go 'func \(.*GenericServer|SetLock\(true\)|SetVersion|Condition|Get\(\)\.SetId|Update\(\)\.SetObject|Update\(\)\.Condition' fulfillment-service/internal/servers fulfillment-service/internal/internal fulfillment-service/internal/databases fulfillment-service/internal/common --glob '*.go' -C 4 --max-count 300

# Read cluster state terminal-state tests around the new guard.
sed -n '1020,1140p' fulfillment-service/internal/servers/private_clusters_server_test.go

Repository: osac-project/osac

Length of output: 50373


Make the terminal-state predicate cover the spec write.

validateClusterStateForSpecUpdate checks the cluster state in a pre-write lookup before GenericServer.Update. GenericServer.Update then rereads the object and applies the masked spec fields, so a concurrent status-only update that transitions the cluster to FAILED or DELETE_FAILED after the pre-write check can still persist spec changes. Move this predicate into the same condition used for the spec update, for example through a conditional DAO update on the existing state, instead of relying on a client-supplied lock.

🤖 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 `@fulfillment-service/internal/servers/private_clusters_server.go` around lines
235 - 238, Move the FAILED/DELETE_FAILED terminal-state guard from the pre-write
validateClusterStateForSpecUpdate check into the atomic spec-update condition
used by GenericServer.Update or its DAO layer. Ensure the masked spec fields are
written only when the existing cluster state is non-terminal, preventing
concurrent status transitions from allowing a spec write; do not rely on the
client-supplied lock.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Valid concern. Changed validateClusterStateForSpecUpdate to acquire a FOR UPDATE row lock (SetLock(true)) when reading the cluster state. Since the gRPC interceptor chain wraps the entire handler in a single database transaction, this lock is held when GenericServer.Update later performs its own locked read and write — preventing a concurrent status transition from bypassing the terminal-state check. The DAO's UpdateRequest does not support conditional WHERE clauses, so a conditional DAO update was not feasible; the row-level lock within the same transaction achieves the same atomicity guarantee.

Addressed in 1d776d2.

@eranco74

eranco74 commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Consider switching from a blocklist (FAILED, DELETE_FAILED) to an allowlist that mirrors the reconciler guard exactly.

The reconciler at cluster_reconciler_function.go:168-169 only processes clusters in PROGRESSING or READY — it returns nil (silent no-op) for every other state, including DELETING and UNSPECIFIED. The current check blocks FAILED and DELETE_FAILED but would still silently accept spec mutations on those other non-reconcilable states.

An allowlist approach keeps the API and reconciler in sync and is future-proof if new states are added:

state := existingCluster.GetStatus().GetState()
if state != privatev1.ClusterState_CLUSTER_STATE_PROGRESSING &&
    state != privatev1.ClusterState_CLUSTER_STATE_READY {
    return grpcstatus.Errorf(
        grpccodes.InvalidArgument,
        "cannot update cluster spec when cluster state is %s",
        state,
    )
}

Co-authored-by: osac-dev-bot <osac-automation@redhat.com>
@osac-jira-ai-issue-solver

Copy link
Copy Markdown
Contributor Author

In comment, @sk-ilya said:

@coderabbitai full review

Meta-comment (CodeRabbit review trigger) — no action needed.

Addressed in 1d776d2.

@osac-jira-ai-issue-solver

Copy link
Copy Markdown
Contributor Author

In comment, @coderabbitai[bot] said:

✅ Action performed

Full review finished.

CodeRabbit bot auto-response — no action needed.

Addressed in 1d776d2.

@osac-jira-ai-issue-solver

Copy link
Copy Markdown
Contributor Author

In comment, @coderabbitai[bot] said:

Review Change Stack

Walkthrough

Cluster updates now validate the existing cluster state before applying spec changes. Spec updates fail with InvalidArgument in FAILED and DELETE_FAILED states. Status-only updates and updates in READY or PROGRESSING states remain allowed.

Changes

Cluster update validation

Layer / File(s) Summary
Validate state before spec updates
fulfillment-service/internal/servers/private_clusters_server.go
Update validates the existing cluster when the request covers spec. Spec changes are rejected for FAILED and DELETE_FAILED states.
Cover state-dependent update behavior
fulfillment-service/internal/servers/private_clusters_server_test.go
Tests verify rejection errors for terminal failure states and allow status-only or non-terminal-state spec updates.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

  • osac-project/osac#84: Both PRs modify cluster update handling in private_clusters_server.go, but add different validations.

Suggested labels: approved, lgtm

Suggested reviewers: danmanor, sk-ilya, akshaynadkarni

🚥 Pre-merge checks | ✅ 10 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Ai-Attribution ⚠️ Warning HEAD is authored by osac-jira-ai-issue-solver[bot] and has only a Co-authored-by trailer; no Assisted-by or Generated-by trailer is present. Add an Assisted-by or Generated-by trailer naming the AI tool, and do not use Co-Authored-By for AI attribution.
✅ Passed checks (10 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the OSAC-2126 failure scenario addressed by rejecting specification updates when the cluster order is failed.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
No-Hardcoded-Secrets ✅ Passed The PR additions contain no API keys, tokens, passwords, private keys, credential URLs, or secret-shaped literals; test values are ordinary identifiers and fixture strings.
No-Weak-Crypto ✅ Passed The PR changes only cluster-state validation and tests; added lines introduce no MD5, SHA1, DES, RC4, 3DES, Blowfish, ECB, custom crypto, or secret comparisons.
No-Injection-Vectors ✅ Passed The added code uses DAO SetId(id) and enum comparisons only; it adds no SQL concatenation, shell execution, eval/exec, unsafe YAML/pickle loading, or HTML injection.
Container-Privileges ✅ Passed The PR changes only Go server and test files; the diff adds no container/Kubernetes manifests or privilege settings such as privileged, hostPID, hostNetwork, SYS_ADMIN, or allowPrivilegeEscalation.
No-Sensitive-Data-In-Logs ✅ Passed The PR adds no logging calls or logged values. New validation returns only a cluster state in an API error; the existing catalog-item log is unchanged.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

❤️ Share

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

CodeRabbit bot walkthrough/summary — no action needed.

Addressed in 1d776d2.

@osac-jira-ai-issue-solver

Copy link
Copy Markdown
Contributor Author

In comment, @coderabbitai[bot] said:

Actionable comments posted: 1

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

Inline comments:
In `@fulfillment-service/internal/servers/private_clusters_server.go`:
- Around line 235-238: Move the FAILED/DELETE_FAILED terminal-state guard from
the pre-write validateClusterStateForSpecUpdate check into the atomic
spec-update condition used by GenericServer.Update or its DAO layer. Ensure the
masked spec fields are written only when the existing cluster state is
non-terminal, preventing concurrent status transitions from allowing a spec
write; do not rely on the client-supplied lock.
🪄 Autofix

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: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 76dd576f-ace2-4aa2-91b8-cfe455b23774

📥 Commits

Reviewing files that changed from the base of the PR and between 843f2f6 and fce77cd.

📒 Files selected for processing (2)
  • fulfillment-service/internal/servers/private_clusters_server.go
  • fulfillment-service/internal/servers/private_clusters_server_test.go

CodeRabbit bot review summary — no action needed.

Addressed in 1d776d2.

Co-authored-by: osac-dev-bot <osac-automation@redhat.com>
@osac-jira-ai-issue-solver

Copy link
Copy Markdown
Contributor Author

In comment, @eranco74 said:

Consider switching from a blocklist (FAILED, DELETE_FAILED) to an allowlist that mirrors the reconciler guard exactly.

The reconciler at cluster_reconciler_function.go:168-169 only processes clusters in PROGRESSING or READY — it returns nil (silent no-op) for every other state, including DELETING and UNSPECIFIED. The current check blocks FAILED and DELETE_FAILED but would still silently accept spec mutations on those other non-reconcilable states.

An allowlist approach keeps the API and reconciler in sync and is future-proof if new states are added:

state := existingCluster.GetStatus().GetState()
if state != privatev1.ClusterState_CLUSTER_STATE_PROGRESSING &&
    state != privatev1.ClusterState_CLUSTER_STATE_READY {
    return grpcstatus.Errorf(
        grpccodes.InvalidArgument,
        "cannot update cluster spec when cluster state is %s",
        state,
    )
}

Switched from blocklist (FAILED, DELETE_FAILED) to allowlist (PROGRESSING, READY) matching the reconciler guard at cluster_reconciler_function.go:175-178. Added test cases for DELETING and UNSPECIFIED states being rejected. The previous concern about UNSPECIFIED breaking creation flow was unfounded — validateClusterStateForSpecUpdate is only called in Update(), not Create().

Addressed in bd70dab.

Co-authored-by: osac-dev-bot <osac-automation@redhat.com>
@omer-vishlitzky

Copy link
Copy Markdown
Contributor

/lgtm

@openshift-ci openshift-ci Bot added the lgtm label Aug 9, 2026
@eranco74
eranco74 added this pull request to the merge queue Aug 9, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to Branch Protection failures Aug 9, 2026
You're not authorized to push to this branch. Visit "About protected branches" for more information.
@omer-vishlitzky

Copy link
Copy Markdown
Contributor

/retest

@github-actions

Copy link
Copy Markdown

Re-triggered failed runs:

  • label-gate (#31315275719)
  • label-gate (#31315271916)
  • Unit Tests (#31315270902)

Co-authored-by: osac-dev-bot <osac-automation@redhat.com>
@osac-jira-ai-issue-solver

Copy link
Copy Markdown
Contributor Author

CI failures addressed in cf0fba6.

@eranco74

Copy link
Copy Markdown
Contributor

/lgtm

@openshift-ci openshift-ci Bot added the lgtm label Aug 10, 2026
@eranco74
eranco74 added this pull request to the merge queue Aug 10, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to Branch Protection failures Aug 10, 2026
You're not authorized to push to this branch. Visit "About protected branches" for more information.
@eranco74
eranco74 added this pull request to the merge queue Aug 10, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to Branch Protection failures Aug 10, 2026
You're not authorized to push to this branch. Visit "About protected branches" for more information.
@omer-vishlitzky
omer-vishlitzky merged commit cf571f6 into osac-project:main Aug 10, 2026
36 of 43 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants