From 390d43ba43262b8a88163b1acf4d500a982793f6 Mon Sep 17 00:00:00 2001 From: Tim Stranske Date: Mon, 24 Aug 2026 07:22:41 -0500 Subject: [PATCH] fix(ci): the Gate's coverage artifact had the name its only consumer wanted, plus .json Maint Coverage Guard failed the moment it was unheld, on both runs (#3 scheduled, #4 manual), with: error: Coverage verification could not find required coverage artifacts on a successful Gate run. warn: Unable to locate a recent successful Gate workflow run with required coverage artifacts: gate-coverage-trend, gate-coverage-trend-history, gate-coverage. maint-coverage-guard.yml downloads exactly three artifact NAMES. The Gate produced the first two under those names and the third as "gate-coverage.json", so the guard probed ten successful runs, found two of three every time, and reported no usable run at all. Measured rather than inferred: Gate run #241 (main, success) uploaded gate-coverage-summary.md, gate-coverage.json, gate-summary.md, gate-coverage-3.13-1, gate-coverage-trend-history, gate-coverage-trend, gate-coverage-summary, gate-coverage-3.12-1 -- trend and trend-history present, "gate-coverage" absent. An artifact NAME and the FILE inside it are different things, and this step conflated them. Renaming the artifact is safe and was checked, not assumed: "gate-coverage.json" as an artifact name appears nowhere else in this repo, and the only download-artifact steps in any workflow here are the guard's three. The file inside is still gate-coverage.json, so anything reading contents is unaffected. A paired literal in two files that disagreed -- this repo's signature defect -- and it stayed invisible for as long as the guard was held. That is the second thing the holds were concealing, after PR #90's six F821s. pr-00-gate.yml is create_only in the Workflows sync manifest with Orchestrator absent from overwrite_repos, so this local fix persists. The same mismatch likely affects every consumer whose Gate emits coverage, which is worth raising upstream separately. 448 collected, ruff and black clean, test_ci_gate_config 12 passed. Co-Authored-By: Claude Opus 5 --- .github/workflows/pr-00-gate.yml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr-00-gate.yml b/.github/workflows/pr-00-gate.yml index 1c395a1..90b4e45 100644 --- a/.github/workflows/pr-00-gate.yml +++ b/.github/workflows/pr-00-gate.yml @@ -1053,7 +1053,27 @@ jobs: if: ${{ always() && steps.coverage_stats.outputs.stats_json != '' }} uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: gate-coverage.json + # ARTIFACT NAME `gate-coverage`, FILE NAME `gate-coverage.json`. They are different + # things and this step used to conflate them, which is why Maint Coverage Guard failed + # the moment it was unheld: + # + # error: Coverage verification could not find required coverage artifacts on a + # successful Gate run. + # warn: Unable to locate a recent successful Gate workflow run with required coverage + # artifacts: gate-coverage-trend, gate-coverage-trend-history, gate-coverage. + # + # maint-coverage-guard.yml downloads exactly three artifact NAMES (L251/261/271): + # `gate-coverage-trend`, `gate-coverage-trend-history`, `gate-coverage`. The Gate + # produced the first two under those names and the third as `gate-coverage.json`, so the + # guard probed ten successful runs, found two of three every time, and reported no usable + # run at all. A paired literal in two files that disagreed -- this repo's signature + # defect, and it stayed invisible for as long as the guard was held. + # + # Renaming the ARTIFACT is safe and was checked, not assumed: `gate-coverage.json` as an + # artifact name appears nowhere else in this repo, and the only download-artifact steps + # in any workflow here are the guard's three. The FILE inside is still + # gate-coverage.json, so anything reading the contents is unaffected. + name: gate-coverage path: gate-coverage.json if-no-files-found: warn retention-days: 7