Release readiness checklist¶
Formal go/no-go criteria for tagging a new public release of the Secure SDLC Evidence Collector. The project does not ship until every criterion is ticked and the evidence linked below is current.
Public repository readiness is handled through the maintainer issue queue and release approvals, not through committed private runbooks.
Validation is re-run on every release; the checklist below is the
authoritative gate. Current published line: 2.x (the live version is
shown by the PyPI badge in the README). Latest verified pass: the full
test suite is green (349 tests) with coverage above the
pyproject.toml gate; the sample release returns ready (coverage 100,
13/13 controls met), and the sample release without --attestations-dir
returns not_ready with the four expected missing critical controls
(ORG-CODE-REVIEW, ORG-RELEASE-APPROVAL, ORG-REL-ROLLBACK,
SSDF-PS.2) and exit code 2; back-to-back runs produce an identical
structural SHA. Lint, type, secret, SAST, and SCA gates (ruff,
mypy --strict, gitleaks, bandit, semgrep, pip-audit,
actionlint) run in security-ci-cd.yml and the local pre-publication
gate. Per-release evidence packs and session handoffs are generated
locally and are not committed to the public repository.
Quality gates¶
-
ruff check src tests scripts→ clean. -
ruff format --check src tests scripts→ clean. -
mypy --strict src tests→ zero errors. -
pytest→ all tests pass and the coverage gate inpyproject.tomlis met. -
sdlc-evidenceconsole script installs from a clean venv (python -m pip install -e ".[dev]") on Linux and Windows. - Docker image builds from
Dockerfileand runs the sample bundle as a non-root user.
Dogfood gates¶
- Sample release (
examples/sample_release/) producesrelease_status = ready, coverage 100, 13/13 controls met. - Self-release (
examples/self_release/) producesrelease_status = ready(orconditionalwith documented recommended-only gaps). - Sample release without
--attestations-dirproducesrelease_status = not_readywith the expected missing critical controls listed indocs/traceability.md §4. -
sdlc-evidence compare before.json after.jsonreports zero deltas for two back-to-back runs on the same inputs.
External-lab evidence¶
- Every lab in
examples/labs/can regenerate its ignoredartifacts/,logs/, andoutput/bundle.jsonlocally or in CI. - Each lab's obtained verdict matches the expected verdict in
docs/traceability.md §3–§4. - Any drift (expected ≠ obtained) is triaged — either code change,
catalog change, or documented limitation in
docs/limitations.md.
Documentation gates¶
-
README.mdclaims match implementation (no dead badges, correct workflow filenames, correct control count, correct example commands). -
CHANGELOG.mdup to date with the tag being released. -
docs/bundle_schema.mdmatches the current Pydantic schema (validated bysdlc-evidence schemadiff against the committed copy). -
docs/traceability.mdreflects the current scenarios and verdicts. -
docs/limitations.mdlists every known FP/FN and scope exclusion.
Security gates¶
-
security-ci-cd.yml(Semgrep + pip-audit + Trivy + actionlint) passes on the release commit. - No hardcoded secrets (
gitleaksclean,trivy secretclean). - No local home-directory paths in any tracked file outside fixtures explicitly marked as scrubbed.
- All GitHub workflows use
persist-credentials: false, least privilegepermissions:blocks, and SHA-pinned third-party actions (or explicit tag pins where SHA is not available). - Dependabot is green or every open alert has a waiver.
Release integrity gates¶
-
publish-pypi.ymlsigns wheel + sdist +bundle.jsonkeyless with cosign. -
sigstoretransparency-log entries are reachable for the latest release (verified withcosign verify-blob --certificate-identity ... --certificate-oidc-issuer https://token.actions.githubusercontent.com). -
SHA256SUMSpublished alongside release assets.
Governance gates¶
-
SECURITY.mdreporting address is active. - Issue / PR templates render correctly on GitHub.
-
CODEOWNERSresolves to an active reviewer. -
CONTRIBUTING.mddescribes the sign-off, DCO, and test-run expectations. -
CODE_OF_CONDUCT.mdreference is current.
Go / no-go¶
The maintainer signs off the release only when all boxes above are
checked. A failure in any single box blocks the release until the root
cause is either fixed or documented as an accepted limitation in
docs/limitations.md with explicit rationale.
How to run this checklist¶
# Quality gates
make lint typecheck test
# Dogfood gates
make run-example
python -m evidence_collector.cli.main run \
--application payments-api --repository acme/payments-api \
--release-id 2026.04.10 --commit-sha abcdef1234567890 \
--artifacts-dir examples/sample_release/artifacts \
--output-dir output/ready-check
python -m evidence_collector.cli.main compare \
output/ready-check/bundle.json \
output/sample_release/bundle.json
# External-lab evidence
bash scripts/scan_all_labs.sh
# Security gates (locally, before tagging)
gitleaks detect --source . --redact
trivy fs --scanners vuln,secret,misconfig --severity HIGH,CRITICAL .
semgrep scan --config p/security-audit --config p/secrets --error
# Reproducibility (clean container)
docker build -t sdlc-evidence:check . && \
docker run --rm -v "$PWD/examples/sample_release:/data:ro" \
sdlc-evidence:check run \
--application payments-api --repository acme/payments-api \
--release-id 2026.04.10 --commit-sha abcdef1234567890 \
--artifacts-dir /data/artifacts --attestations-dir /data/attestations \
--output-dir /tmp/bundle