Commit bce5f30
feat(security): OpenSSF Best Practices + Scorecard scaffolding (RAN-55, RAN-60) (#1)
* checkpoint: pre-yolo 2026-04-20T09:09:19
* feat(security): land OpenSSF Best Practices + Scorecard scaffolding (RAN-55)
Adapt the codeiq RAN-46/RAN-52 recipe to vigil's PowerShell + WPF tree:
- Add CLAUDE.md (architecture, conventions, OpenSSF observability target)
- Add SECURITY.md (private disclosure, scope, hardening references)
- Add AGENTS.md (agent collaborator entry-point)
- Add .bestpractices.json (project_id 12648, level: passing, evidence map)
- Add .github/workflows/scorecard.yml (push to main + Mondays 06:00 UTC,
SHA-pinned actions, SARIF + artifact)
- Add .github/workflows/security.yml — (B) OSS-CLI stack:
Semgrep / OSV-Scanner / Trivy / Gitleaks / jscpd / Syft SBOM,
language-adapted (PowerShell tokenization for jscpd, no Maven/npm bits)
- Add .github/dependabot.yml (github-actions only — vigil has no
language lockfile)
- README.md: add OpenSSF Best Practices + Scorecard badges
- LICENSE: align copyright with project precedent (Amit Kumar)
Per board ruling: Scorecard is observational only (stretch >= 8.0/10);
the OpenSSF Best Practices `passing` badge is the only hard gate. Final
flip from `in_progress` to `passing` on bestpractices.dev is admin-UI
work and stays board-owned.
Board action items (cannot land via workflow file):
- Enable signed-commit branch protection on main
- Enable secret scanning + push protection
- Enable Dependabot security updates
- Flip bestpractices.dev project 12648 from in_progress to passing
Closes RAN-55 (after the board-side toggles + bestpractices.dev flip).
Co-Authored-By: Paperclip <noreply@paperclip.ing>
* fix(ci): replace broken google/osv-scanner-action with binary install
The pinned `google/osv-scanner-action@c5185470…` (v2.3.5) ships an
`action.yml` that is composite-only and missing the top-level `runs:`
section, so GitHub rejects it as a job step with:
Top level 'runs:' section is required for
google/osv-scanner-action/.../action.yml
Codeiq hit the same trap on its RAN-52 follow-up and switched to
installing the official `osv-scanner` binary via `gh release download`.
Mirroring that pattern here, adapted for vigil:
- env: OSV_SCANNER_VERSION=2.3.5, GH_TOKEN=github.token
- gh release download `osv-scanner_linux_amd64` from
`google/osv-scanner` v2.3.5 (pattern match → mv to stable name)
- Smoke `./osv-scanner --version` so future regressions surface
clearly instead of exit 127
- Recursive source scan (`--recursive --skip-git ./`); vigil has no
language lockfile today, so the run exits with no findings.
Coverage activates automatically once a `*.lock` lands in-tree.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
* chore(bestpractices): rewrite to canonical autofill schema (RAN-60)
Replace custom group structure (status / evidence / audit blocks) with
bestpractices.dev's canonical flat per-criterion schema so the autofill
robot pre-fills the criteria page on board flip. All 67 passing-level
criteria (43 MUST, 10 SHOULD, 14 SUGGESTED) carry _status,
_justification, and (where required by upstream criteria.yml) _url.
Status distribution: 62 Met, 4 N/A (release_notes / release_notes_vulns
/ version_semver / version_tags — vigil ships no formal release line),
1 Unmet (test_continuous_integration — Test-Vigil.ps1 not yet wired into
GHA), 2 ? (dynamic_analysis, dynamic_analysis_enable_assertions).
Schema source: criteria/criteria.yml top-level '0:' block on
coreinfrastructure/best-practices-badge.
Companion to RAN-57 (codeiq), RAN-58 (otelcontext), RAN-59 (snipIT).
Co-Authored-By: Paperclip <noreply@paperclip.ing>
---------
Co-authored-by: Paperclip <noreply@paperclip.ing>1 parent 45f3acb commit bce5f30
9 files changed
Lines changed: 971 additions & 1 deletion
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
0 commit comments