Skip to content

fix(ci): stop a diagnostic artifact upload from failing the gate - #104

Merged
David-Martel merged 2 commits into
mainfrom
fix/ci-lcov-upload-nonfatal-20260908
Sep 9, 2026
Merged

David-Martel merged 2 commits into
mainfrom
fix/ci-lcov-upload-nonfatal-20260908

Conversation

@David-Martel

Copy link
Copy Markdown
Owner

Two runs on main went red today with nothing actually wrong.

Runs 34249684140 (#87 merge) and 34250282010 (#85 merge) passed unit tests, the coverage report, and the --fail-under-lines 70 gate — then failed here:

##[error]Failed to FinalizeArtifact: Received non-retryable error:
Failed request: (403) Forbidden: Error from intermediary

The same step succeeded minutes later on run 34250438288 with the same workflow, so this was a transient artifact-service fault. Ruled out the repo-side explanations: 178 artifacts totalling well under any quota, and names are ${{ github.sha }}-suffixed so they cannot collide.

The real cost was the cascade

Job needs:
build-llamacpp rust-test
integration-tests build-llamacpp

Both were skipped. One flaky diagnostic upload suppressed the two most expensive real checks in the workflow, and then the gate failed on their absence. The step-level view of the failed job makes it stark:

success  Run Unit Tests
success  Coverage Report          <- includes the --fail-under-lines 70 gate
success  Upload Coverage
failure  Upload LCOV Artifact     <- only this

Scope

continue-on-error: true on the LCOV upload only. Nothing downstream consumes it — it exists for humans reading coverage after the fact. Coverage enforcement is untouched: the threshold is a separate step that still blocks.

Deliberately not applied to the DLL upload in the build job. That one is load-bearing — Integration Tests downloads it — and it already carries if-no-files-found: error for exactly that reason. The distinction is whether a later job depends on the artifact, not whether uploads can be flaky.

The two red runs on main have been re-run separately; this prevents the recurrence.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Mu7jB5ysKe4DN5ovjVtX1t

Two runs on main went red on 2026-09-08 with nothing wrong. Runs 34249684140
and 34250282010 passed unit tests, the coverage report, AND the
--fail-under-lines 70 gate, then failed on the Upload LCOV Artifact step:

    ##[error]Failed to FinalizeArtifact: Received non-retryable error:
    Failed request: (403) Forbidden: Error from intermediary

The same step succeeded minutes later on run 34250438288 with the same
workflow, so this was a transient artifact-service fault, not a repo problem --
the repo holds 178 artifacts totalling well under any quota, and the names are
SHA-suffixed so they cannot collide.

The cost was not just a red badge. build-llamacpp declares `needs: rust-test`
and integration-tests declares `needs: build-llamacpp`, so both were skipped:
one flaky diagnostic upload suppressed the two most expensive real checks in
the workflow and then failed the gate on their absence.

Marked `continue-on-error: true`. Nothing downstream consumes this artifact --
it exists for humans reading coverage after the fact. Coverage enforcement is
untouched: the threshold is a separate step that still blocks.

Deliberately NOT applied to the DLL upload in the build job. That one is
load-bearing -- Integration Tests downloads it -- and it correctly carries
`if-no-files-found: error` for the same reason. The distinction is whether a
later job depends on the artifact, not whether uploads can be flaky.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mu7jB5ysKe4DN5ovjVtX1t
Copilot AI lite review requested due to automatic review settings September 8, 2026 16:29
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-08T16:31:26.394734Z 5804fc0 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

Copilot AI 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.

🟢 Approval recommended

The functional change is narrowly scoped to a diagnostic-only artifact upload and preserves the existing coverage enforcement gate.

Pull request overview

This PR hardens the CI workflow against transient GitHub Actions artifact service failures by making the LCOV diagnostic artifact upload non-blocking, preventing unrelated upload flakiness from skipping downstream build/integration checks and failing the overall gate.

Changes:

  • Mark the “Upload LCOV Artifact” step as continue-on-error: true while keeping it if: always().
  • Add detailed inline rationale documenting the observed 403 artifact-finalization flake and why only this upload is non-blocking.
File summaries
File Description
.github/workflows/ci.yml Makes the LCOV artifact upload step non-blocking to avoid transient artifact upload failures breaking the CI gate and skipping downstream jobs.
Review details
  • Files reviewed: 1/1 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread .github/workflows/ci.yml Outdated
Review caught that the comment said `build/integration-test declare
needs: rust-test`. Only build-llamacpp does. integration-tests declares
`needs: [build-llamacpp, powershell-test]`, so it was skipped through
build-llamacpp rather than directly.

The conclusion is unchanged -- both jobs were skipped by the rust-test failure
-- but the comment exists so someone can audit the job graph later, and a
comment that misdescribes that graph fails at the one job it has.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mu7jB5ysKe4DN5ovjVtX1t
@David-Martel
David-Martel merged commit 88abe95 into main Sep 9, 2026
18 of 20 checks passed
@David-Martel
David-Martel deleted the fix/ci-lcov-upload-nonfatal-20260908 branch September 9, 2026 16:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants