Skip to content

fix(scheduler): fail after summarized action errors - #1271

Open
seonghobae wants to merge 6 commits into
mainfrom
codex/pr899-current-main-replacement-20260824
Open

fix(scheduler): fail after summarized action errors#1271
seonghobae wants to merge 6 commits into
mainfrom
codex/pr899-current-main-replacement-20260824

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Root cause

The scheduler isolated per-PR mutation and dispatch failures into action_error decisions, emitted its complete human and JSON summaries, and then unconditionally returned success. The organization sweep also classified any 403-shaped output as an unreadable repository, even when the versioned scheduler payload proved that repository inspection succeeded and the 403 came from an attempted action.

Change

  • return nonzero only after the complete scan and summary when any action_error exists
  • keep ordinary wait, block, skip, and deferred-capacity outcomes successful
  • treat a 403 as repository-unavailable only when no versioned scheduler payload exists
  • preserve targeted and organization-sweep propagation contracts
  • document the terminal policy and authoritative GitHub Actions references

Verification

  • TDD red: exact regression set failed on the unconditional zero return, missing versioned-payload classifier, and missing doctoring contract
  • uv run --with pip pytest: 1,395 passed, 1 skipped
  • uv run --with pip coverage run -m pytest -q && uv run --with pip coverage report --show-missing --fail-under=100: 8,348 statements and 3,214 branches at 100%
  • uv run --with pip interrogate --fail-under=100 scripts/ci: 100%
  • uv run --with pip python -m compileall -q scripts/ci tests
  • actionlint .github/workflows/pr-review-merge-scheduler.yml with ShellCheck 0.11.0
  • git diff --check
  • CodeGraph synchronized and healthy

The explicit --with pip isolates the current-main fresh-uv bootstrap gap tracked separately by #1265; this change does not duplicate that boundary.

Supersedes #899.
Closes #894.


Open in Devin Review

@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 47 seconds.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Team

Run ID: 314bac00-e169-4d7f-a5b5-5207cdf2019f

📥 Commits

Reviewing files that changed from the base of the PR and between 972b74b and 1fc6755.

📒 Files selected for processing (5)
  • CHANGELOG.md
  • docs/doctoring/pr-review-merge-scheduler.md
  • scripts/ci/pr_review_merge_scheduler_core.py
  • tests/test_pr_review_merge_scheduler.py
  • tests/test_required_workflow_queue_contract.py

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.

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Devin Review found 0 potential issues.

Open in Devin Review

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Devin Review found 0 new potential issues.

Open in Devin Review

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

OpenCode could not approve from deterministic current-head evidence because GitHub Checks have failed.

Findings

1. HIGH Current-head GitHub Checks - Fix failed required checks before approval

  • Problem: Failed same-head checks remain for 4cd10ce7e967bc1d2b1297716ee61e94584141c3.
  • Root cause: The model-unavailable evidence fallback is allowed only when peer GitHub Checks are complete and clean.
  • Fix: Read and fix the failed check logs below, then rerun the current-head checks.
  • Regression test: Keep the model-unavailable fallback gated on an empty failed-check rollup.

Failed checks:

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: pr-review-merge-scheduler.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: pr-review-merge-scheduler.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: pr-review-merge-scheduler.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: pr-review-merge-scheduler.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: pr_review_merge_scheduler.py"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: pr_review_merge_scheduler.py"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test (2 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test (2 files)"]
  R5 --> V5["targeted test run"]
Loading

@opencode-agent

opencode-agent Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

  • Head SHA: 8cb926fc31ca27e47192b37c968ea699fd9ecf2c
  • Workflow run: 32744821191
  • Workflow attempt: 1
  • Gate result: REQUEST_CHANGES (approval step)

Pull request overview

OpenCode could not approve from deterministic current-head evidence because GitHub Checks have failed.

Findings

1. HIGH Current-head GitHub Checks - Fix failed required checks before approval

  • Problem: Failed same-head checks remain for 8cb926fc31ca27e47192b37c968ea699fd9ecf2c.
  • Root cause: The model-unavailable evidence fallback is allowed only when peer GitHub Checks are complete and clean.
  • Fix: Read and fix the failed check logs below, then rerun the current-head checks.
  • Regression test: Keep the model-unavailable fallback gated on an empty failed-check rollup.

Failed checks:

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: pr-review-merge-scheduler.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: pr-review-merge-scheduler.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: pr-review-merge-scheduler.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: pr-review-merge-scheduler.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: pr_review_merge_scheduler.py"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: pr_review_merge_scheduler.py"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test (2 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test (2 files)"]
  R5 --> V5["targeted test run"]
Loading

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

OpenCode could not approve from deterministic current-head evidence because GitHub Checks have failed.

Findings

1. HIGH Current-head GitHub Checks - Fix failed required checks before approval

  • Problem: Failed same-head checks remain for 4cd10ce7e967bc1d2b1297716ee61e94584141c3.
  • Root cause: The model-unavailable evidence fallback is allowed only when peer GitHub Checks are complete and clean.
  • Fix: Read and fix the failed check logs below, then rerun the current-head checks.
  • Regression test: Keep the model-unavailable fallback gated on an empty failed-check rollup.

Failed checks:

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: pr-review-merge-scheduler.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: pr-review-merge-scheduler.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: pr-review-merge-scheduler.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: pr-review-merge-scheduler.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: pr_review_merge_scheduler.py"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: pr_review_merge_scheduler.py"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test (2 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test (2 files)"]
  R5 --> V5["targeted test run"]
Loading

@seonghobae

Copy link
Copy Markdown
Contributor Author

Exact-head check RCA: Strix run 32659790911 failed after repeated NVIDIA NIM HTTP 429 rate-limit responses, then the direct fallback returned LLM Provider NOT provided; no vulnerability report artifact was produced. This is provider/backend infrastructure, not a source finding in the scheduler change. Keep the fail-closed result and revalidate after provider remediation.

@seonghobae
seonghobae force-pushed the codex/pr899-current-main-replacement-20260824 branch from 4cd10ce to ff2549f Compare August 24, 2026 08:49

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Devin Review found 0 new potential issues.

Open in Devin Review

@seonghobae
seonghobae force-pushed the codex/pr899-current-main-replacement-20260824 branch from ff2549f to dbdec1f Compare August 24, 2026 09:31
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@seonghobae
seonghobae enabled auto-merge (squash) August 24, 2026 11:09
@seonghobae

Copy link
Copy Markdown
Contributor Author

Exact-head failure triage for 8cb926fc31ca27e47192b37c968ea699fd9ecf2c:

  • Strix completed with zero reported vulnerabilities but emitted provider infrastructure/failure-signal output and no authoritative report artifact.
  • NVIDIA NIM fallback exhausted, then openai-direct/gpt-5.6-luna failed with 404 page not found; the gate correctly failed closed.
  • The scan-pr-queue failure belongs to a cancelled pull_request_review scheduler predecessor with no job log, not to the PR source. It is not being treated as a source success or as a force-merge reason.
  • Current coverage-source-tree, pip-audit, and CodeQL checks remain pending; independent current-head approval is absent.

Decision: WAIT_AND_REMEDIATE. This PR remains blocked on provider/base control-plane repair and fresh exact-head evidence; no merge or bypass merge.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

OpenCode could not approve from deterministic current-head evidence because GitHub Checks have failed.

Findings

1. HIGH Current-head GitHub Checks - Fix failed required checks before approval

  • Problem: Failed same-head checks remain for 8cb926fc31ca27e47192b37c968ea699fd9ecf2c.
  • Root cause: The model-unavailable evidence fallback is allowed only when peer GitHub Checks are complete and clean.
  • Fix: Read and fix the failed check logs below, then rerun the current-head checks.
  • Regression test: Keep the model-unavailable fallback gated on an empty failed-check rollup.

Failed checks:

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Workflow: pr-review-merge-scheduler.yml"]
  S1 --> I1["GitHub Actions review job"]
  I1 --> R1["Review risk: Workflow: pr-review-merge-scheduler.yml"]
  R1 --> V1["actionlint plus required checks"]
  Evidence --> S2["Changed file: CHANGELOG.md"]
  S2 --> I2["repository behavior"]
  I2 --> R2["Review risk: Changed file: CHANGELOG.md"]
  R2 --> V2["required checks"]
  Evidence --> S3["Docs: pr-review-merge-scheduler.md"]
  S3 --> I3["operator or user guidance"]
  I3 --> R3["Review risk: Docs: pr-review-merge-scheduler.md"]
  R3 --> V3["docs review"]
  Evidence --> S4["CI script: pr_review_merge_scheduler.py"]
  S4 --> I4["review and security gate shell path"]
  I4 --> R4["Review risk: CI script: pr_review_merge_scheduler.py"]
  R4 --> V4["bash -n plus Strix self-test"]
  Evidence --> S5["Test (2 files)"]
  S5 --> I5["regression suite"]
  I5 --> R5["Review risk: Test (2 files)"]
  R5 --> V5["targeted test run"]
Loading

@opencode-agent
opencode-agent Bot disabled auto-merge August 24, 2026 17:58
…ain-replacement-20260824

# Conflicts:
#	CHANGELOG.md

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Devin Review found 2 new potential issues.

Devin Review

Comment thread .github/workflows/pr-review-merge-scheduler.yml Outdated
Comment thread scripts/ci/pr_review_merge_scheduler.py Outdated
seonghobae pushed a commit that referenced this pull request Aug 30, 2026
Records the Strix free-pool diversity-evidence reconciliation (#1433), the
gateway-preflight visibility fix, the direct-NIM cleanup, and the four
parallel PR-triage agents' real fixes (noema#500, .github#1238/#1271,
.github#1435, contextual-orchestrator#857's stale workflow removal) under
section 5.1's next-increment list -- a different location than #1432's
in-flight "2026-08-30 autonomous loop snapshot" append, to avoid colliding
with that PR's own diff.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KPmJErfkcHer4UVEgrQxUX

Copy link
Copy Markdown
Contributor Author

Merge-conflict triage: genuine architectural divergence (pr_review_merge_scheduler.py facade/core split), not a text conflict

Attempted the standard git fetch origin main && git merge --no-edit repair for this PR's dirty mergeable_state (base main@07d9ec23, head d9ec9208).

Four files conflict: .github/workflows/pr-review-merge-scheduler.yml, CHANGELOG.md, scripts/ci/pr_review_merge_scheduler.py, tests/test_required_workflow_queue_contract.py. The blocking one is scripts/ci/pr_review_merge_scheduler.py:

  • This PR's branch still edits the pre-split monolithic file directly — its own version of scripts/ci/pr_review_merge_scheduler.py is 4,074 lines.
  • origin/main has since landed the facade/core split (#1803): scripts/ci/pr_review_merge_scheduler.py is now a 241-line thin facade that re-exports from the new scripts/ci/pr_review_merge_scheduler_core.py, which holds the actual ~5,700-line implementation main has continued to evolve independently.

A text-level git merge cannot reconcile "edit function X in the 4,074-line monolith" against "that file is now a 241-line re-export shim and X's real body moved to a different file main also changed since." Resolving this correctly requires re-deriving this PR's action_error-after-summary / 403-classification logic changes against the current pr_review_merge_scheduler_core.py, which is an implementation decision, not a mechanical merge — so per this loop's "don't guess on real divergence" standard, the merge was aborted cleanly and no push was made.

This is the same class of hot-file collision already documented for noema_review_gate.py/strix.yml/security-scan.yml in #1819, now confirmed for the scheduler's own core file as well. Recommended path: re-derive this PR's fix directly against current main/pr_review_merge_scheduler_core.py rather than resolving the conflict in place — the underlying root-cause fix (only propagate failure after the full summary; don't misclassify a 403-with-valid-payload as repository-unavailable) may already be superseded by scheduler work landed since #1803; worth checking current main behavior before re-deriving.


Generated by Claude Code

seonghobae pushed a commit that referenced this pull request Sep 4, 2026
…test-bug fix

Follow-up to this same PR's original entry: this round's continued PR sweep
found #1065 and #1681 conflicting on strix.yml/noema_review_gate.py (same
pattern as the 7 PRs already documented), plus #1271 and #1231 conflicting on
scripts/ci/pr_review_merge_scheduler.py -- confirming the #1803 facade/core
split is now also an active collision surface (4,074-line monolith on each
PR's branch vs. a 241-line facade + separately-evolving core file on main).
Evidence-based comments were left on all 4; no guessed resolution was pushed.

Also records one genuine pre-existing (not merge-caused) test bug found and
fixed while merge-repairing #1655: a jq trailing-newline off-by-one in a new
E2E test, and a coverage gap in opencode_review_normalize_output.py's new
needs-info wrapper (branches only exercised via subprocess, invisible to
coverage.py). Both fixes are test-only, pushed as part of #1655 itself.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BV96rXhqoR3tYZ9AeAVur4
…-20260824)

Five blocks across four files. This PR's subject - a non-zero scheduler exit
after a caught action_error - is relocated into the core module main split the
monolith into; the rest of the conflicts are org-queue-sweep, which main
removed.

RELOCATED (the PR's subject):
  The branch adds scheduler_exit_code() next to print_summary and returns it
  from main() instead of 0. Both anchors exist in
  pr_review_merge_scheduler_core.py, so this is a move, not a rewrite: the
  function was inserted before core's print_summary and core's
  '_ACTIVE_ADMISSION_GATE = None; return 0' became
  'return scheduler_exit_code(decisions)'. decisions is already in scope there
  (core passes it to print_summary on the line above).
  The branch's matching contract change in tests/test_pr_review_merge_scheduler.py
  (two 'assert sched.main(...) == 0' -> '== 1') merged cleanly outside every
  conflict, so the port and its oracle agree.

TAKEN FROM MAIN:
- scripts/ci/pr_review_merge_scheduler.py: main's 241-line facade, both blocks.
- .github/workflows/pr-review-merge-scheduler.yml: main deleted org-queue-sweep
  (687 lines). The branch's own +8 lines on this file are entirely inside that
  job's sweep_output handling, so nothing separable is lost.
- tests/test_required_workflow_queue_contract.py: main's scan-pr-queue timeout
  assertions; the branch's org-sweep rotation helpers go with the job.
- CHANGELOG.md: kept both entries.

ADAPTED, NOT DROPPED:
  test_scheduler_action_errors_propagate_after_structured_summary split the
  workflow on '\n  org-queue-sweep:' and asserted on both halves. Kept the
  targeted half - which is this PR's contract - and removed the org-sweep half.
  Verified the surviving assertions still bind: main's workflow has one job,
  the Inspect step is its last step, and both '|| true' occurrences (lines 409
  and 467) are before it, so 'not in targeted' is still a real constraint.
  test_scheduler_exit_policy_is_documented is kept unchanged.

Evidence:
- uvx ruff check --select F821 scripts/ci tests: All checks passed
- full suite, branch head d9ec920 (unmerged): 1899 passed, 0 failed
- full suite, this merge:                      2905 passed, 0 failed
- negative control: reverting core's main() to 'return 0' fails
  test_main_keeps_scanning_after_action_error and
  test_main_keeps_scanning_after_update_branch_403_and_422 by name
- coverage: TOTAL 100%; interrogate: PASSED (minimum 100.0%)

Note for the author: docs/doctoring/pr-review-merge-scheduler.md, added by this
PR, still describes the organization sweep. That job no longer exists on main.
test_scheduler_exit_policy_is_documented only greps for the phrase, so it still
passes - the doc is stale, not broken.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@seonghobae

Copy link
Copy Markdown
Contributor Author

main 병합 완료 (1fc67552) — 이 PR의 본론을 core 로 재배치했습니다

충돌 4파일 5블록. main이 스케줄러 모놀리스를 facade+core로 쪼갠 뒤라 이 PR의 코드가 갈 자리가 바뀌었습니다.

재배치 — scheduler_exit_code

브랜치는 print_summary 옆에 scheduler_exit_code()를 추가하고 main()0 대신 그것을 반환하게 합니다. 앵커 두 개(print_summary, main)가 모두 pr_review_merge_scheduler_core.py에 살아 있어 재작성이 아니라 이동이었습니다. core의 print_summary 앞에 함수를 넣고, _ACTIVE_ADMISSION_GATE = None; return 0return scheduler_exit_code(decisions)로 바꿨습니다. decisions는 바로 윗줄 print_summary 호출에서 이미 스코프에 있습니다.

이 PR이 tests/test_pr_review_merge_scheduler.py에서 함께 바꾼 계약(assert sched.main(...) == 0== 1, 2곳)은 충돌 없이 그대로 병합됐습니다. 즉 이식과 그 오라클이 서로 맞물립니다.

main 채택

  • 스케줄러 파사드 2블록
  • 워크플로: main이 org-queue-sweep 687줄을 삭제했습니다. 이 브랜치가 이 워크플로에 한 +8줄은 전부 그 잡의 sweep_output 처리 안이라, 잡과 함께 빠지는 것 외에 따로 잃는 것이 없습니다.
  • 계약 테스트: main의 scan-pr-queue 타임아웃 단언. 브랜치의 org-sweep 로테이션 헬퍼는 잡과 함께 제거.
  • CHANGELOG: 양쪽 항목 보존.

버리지 않고 조정

test_scheduler_action_errors_propagate_after_structured_summary가 워크플로를 "\n org-queue-sweep:" 기준으로 쪼개 양쪽 절반을 단언하고 있었습니다. 이 PR의 계약인 targeted 절반은 남기고 org-sweep 절반만 제거했습니다. 남은 단언이 여전히 구속력이 있는지 확인했습니다 — main 워크플로는 잡이 하나뿐이고 Inspect 스텝이 마지막 스텝이며, || true 두 곳(409·467행)은 모두 그 앞이므로 not in targeted가 실제 제약으로 남습니다.

검증

  • uvx ruff check --select F821 — All checks passed
  • 전체 스위트, 병합 전 브랜치 헤드 d9ec9208: 1899 passed / 0 failed
  • 전체 스위트, 이 병합: 2905 passed / 0 failed
  • 네거티브 컨트롤: core의 main()return 0으로 되돌리면 test_main_keeps_scanning_after_action_errortest_main_keeps_scanning_after_update_branch_403_and_422가 이름을 찍고 실패
  • coverage TOTAL 100%, interrogate PASSED

확인 요청

이 PR이 추가한 docs/doctoring/pr-review-merge-scheduler.md가 아직 organization sweep을 설명합니다. main에는 그 잡이 없습니다. test_scheduler_exit_policy_is_documented는 문구 존재만 보므로 통과는 하지만, 문서가 낡은 상태입니다 — 해당 문장 정리를 권합니다.

🤖 Generated with Claude Code

@seonghobae seonghobae added bug Something isn't working priority: medium Normal-priority or P2 work status: needs-review Open pull request requiring current-head review or checks type: bug Defect or incorrect behavior labels Sep 7, 2026 — with ChatGPT Codex Connector
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: medium Normal-priority or P2 work status: needs-review Open pull request requiring current-head review or checks type: bug Defect or incorrect behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Reliability] Propagate scheduler mutation failures to a non-passing workflow result

2 participants