Commit fee07db
ci(scorecard-enforcer): split score-threshold from publish job (OSSF run-step ban — 49 repos affected) (#304)
## Summary
Estate CI/CD audit 2026-05-30 caught **49 repos** failing on `OpenSSF
Scorecard Enforcer` with:
```
webapp: scorecard job must only have steps with uses
```
## Root cause
OSSF's publish endpoint enforces a hard contract: the job that runs
`ossf/scorecard-action` with `publish_results: true` must contain ONLY
`uses:` steps. Any `run:` step in the same job — typically a "Check
minimum score" threshold gate — fails the publish step and the whole
workflow run.
## Fix
- `scorecard` job: `uses:`-only (checkout → run-scorecard → upload-sarif
→ upload-artifact). Satisfies OSSF contract.
- New `check-score` job, `needs: scorecard`, downloads the SARIF
artifact and runs the threshold check. `run:` lives here.
Real SHA pins verified via API:
- `actions/upload-artifact@330a01c4` (v5.0.0)
- `actions/download-artifact@018cc2cf` (v5.0.0)
## Fan-out
49 estate repos carry per-repo clones of this file. Single template fix
here; mechanical sweep follows in a separate API content-replace pass.
## Hypatia rule
Companion PR adds WF014 (`scorecard_publish_with_run_step`) so this
pattern is detected automatically going forward. Sensitivity +
specificity smoke-tested:
- Fires on pre-fix shape: ✓
- Does NOT fire on reusable-only (no publish): ✓
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent d966c9d commit fee07db
1 file changed
Lines changed: 28 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
24 | 34 | | |
25 | 35 | | |
26 | 36 | | |
| |||
43 | 53 | | |
44 | 54 | | |
45 | 55 | | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
46 | 74 | | |
47 | 75 | | |
48 | | - | |
49 | 76 | | |
50 | 77 | | |
51 | 78 | | |
| |||
0 commit comments