OpenSSF Best Practices & Scorecard Self-Assessment¶
The primary foundation path is LF AI & Data Sandbox, whose published lifecycle explicitly requires a Passing OpenSSF Best Practices badge. The Scorecard remains a separate supply-chain signal. The underlying posture is already strong (signed digest-pinned image and chart, SLSA + SBOM attestations, Flux keyless verification, DCO, private vulnerability reporting, SHA-pinned workflow actions), so this is measurement and packaging, not new controls — and it never weakens the CD digest-pin flow or any existing control to chase a score.
This document is the preparable part of issue #460. The repository is public, but the remaining publication steps are still a human action under the maintainer account: register the bestpractices.dev project entry, enable Scorecard publication and SARIF upload, verify the public results, and add the rendered badges to the README. Until that explicit step, the workflow retains publish_results: false and keeps SARIF as a bounded artifact; public visibility alone is not evidence that those external records exist.
Best Practices passing-level criteria → evidence¶
Every row below maps a passing-level criterion to concrete in-repo evidence. No criterion is claimed that the repository does not implement; where a criterion is only partially met the row says so.
Basics¶
- Project description and homepage —
README.mdstates what the project does and how to evaluate it. - Contribution process —
CONTRIBUTING.mddocuments the issue→PR workflow, labels, and DCO sign-off (no CLA);CHARTER.md,GOVERNANCE.md, andMAINTAINERS.mdrecord TSC authority, decisions, and voting membership. - FLOSS license — Apache-2.0 (
LICENSE, rationale indocs/licensing.md); an OSI-approved license, stored in the standard location. - Documentation (basics + interface) —
README.mdplus the topic specs underdocs/and the agent-facingAGENTS.mddescribe the architecture and interfaces. - English / other — the project communicates in English; the issue and PR templates live under
.github/.
Change control¶
- Public version-controlled source — the public GitHub repository exposes its version-controlled source and history.
- Unique, semantic versioning — releases are
v-prefixed semver via thereleaseskill; themainbranch is protected by theprotect-mainruleset (no force-push, deletion, or non-linear history). - Release notes / changelog — releases publish a
git-cliffchangelog (Conventional Commits drive it); see thereleaseskill and tagged GitHub releases.
Reporting¶
- Bug-reporting process —
.github/ISSUE_TEMPLATE/provides structured issue forms; the backlog convention is in thegithub-flowskill. - Vulnerability-reporting process —
SECURITY.mddefines private vulnerability reporting; security bugs are never filed as public issues. - Vulnerability-report response — the security release process covers private report → signed patch → GHSA/CVE publication → adopter notification.
Quality¶
- Working build system —
miseis the single source of truth forinstall/build/format/check/test; lefthook and CI reuse the same tasks. - Automated test suite + CI —
mise run testruns the Go suites (race + coverage), the Python/knowledge suites, and the deterministic manifest/policy gates;.github/workflows/ci.ymlruns the identical gates on every PR, and.github/workflows/fuzz.ymlruns an extended nightly fuzz. - Tests for new functionality — the testing standard requires deterministic tests for changes; new agents are gated by
mise run test:agents-goldenand the offlinemise run agent:test <name>loop. - Warning flags treated as errors — the lint gates run warning-free (golangci-lint,
ruff,shellcheck --severity=style,dprint,trivy config), and a change that introduces a warning failsmise run check.
Security¶
- Secure development knowledge — the security spec §7 and the threat model map controls (prompt injection is the stated #1 threat); prompt-injection controls states each control's honest limits.
- Good cryptographic practices — ES256/JCS (RFC 8785) Signed AgentCards and usage receipts, P-256 keys, TLS for all web traffic, SOPS-age for secrets; no weak/rolled-own primitives, and verify-only public material is exchanged across organizations.
- Secured delivery against MITM — the bridge image and Helm chart are cosign-signed and consumed by immutable digest; Flux source-controller keyless-verifies the chart before helm-controller sees it (supply-chain verification); all workflow actions are SHA-pinned.
- Publicly known vulnerabilities addressed —
trivy,govulncheck, and CodeQL gate every change; advisories are remediated promptly (e.g. the mid-cyclegolang.org/x/textGO-2026-5970 bump). - No leaked credentials — a
gitleakspre-commit and CI gate plus SOPS-age encryption keep plaintext secrets out of Git; only*.sops.yamlciphertext is committed.
Analysis¶
- Static analysis — golangci-lint (Go),
ruff(Python),shellcheck(shell),trivy config(IaC), and CodeQL via GitHub code scanning default setup (actions/go/python, on every PR and weekly) run on every change. - Dynamic analysis — Go native fuzzing over the owned untrusted-input parsers (
mise run test:fuzz, nightly extended budget) and the isolated Matrix↔A2A integration fixture.
Scorecard: accepted deviations¶
.github/workflows/scorecard.yml runs the OpenSSF Scorecard weekly and on demand. The following checks are not yet published at their maximum posture because of deliberate design or the pending publication step; each is an accepted deviation with a written rationale, not a silent control weakening.
- Branch-Protection —
mainuses theprotect-mainruleset (blocks force-push, deletion, non-linear history), but intentionally omits repo-level required-PR/required-status-checks: CD's digest-pin step fast-forwards a commit tomainasgithub-actions[bot], which a repo-level PR/check rule would block, and a repo ruleset cannot grant the built-in Actions app a bypass (that needs an org-scoped ruleset). This trade-off is documented inAGENTS.md; enforced review for outside contributors is the documented org-ruleset next step. - SARIF upload / publish_results — the repository is public, but publication remains deliberately disabled until the maintainer completes and verifies the external-account steps in #460; until then SARIF remains a bounded workflow artifact.
- Pinned-Dependencies, Token-Permissions, Dangerous-Workflow — expected to pass: every workflow action is SHA-pinned with a version hint (
mise run check:github-actionsenforces it), every workflow declares an explicit least-privilegepermissionsmap, and no workflow checks out and executes untrusted code. - Fuzzing, SAST, CI-Tests, Vulnerabilities, Security-Policy — expected to pass on the evidence above (Go fuzz, CodeQL/golangci-lint/trivy, the CI gate,
govulncheck, andSECURITY.md).
Before adding the badges, re-run Scorecard, record the actual public per-check scores here, and resolve or re-justify every non-passing check.