Instantiates docs/standards/QUALITY-AND-METRICS-STANDARD.md's per-repo DoD
for tods-validate's actual shape: a Python CLI/library + composite GitHub
Action + static playground, no service, no AI/LLM component, English-only.
Reviewed at each release; update this file in the same PR that changes what
"done" means (e.g. adding a new gate).
- Format + lint —
ruff check+ruff format --check, zero errors. - Type-check —
mypy --strictonsrc/, zero errors. - Tests + coverage — full suite green; line and branch coverage
≥ 90% (
--cov-fail-under=90,[tool.coverage.run] branch = true); cyclomatic complexity ≤ 10 (ruffC901,max-complexity = 10). - Security — Semgrep (
ci --config auto), CodeQL (python+actions), gitleaks (pre-commit + CI, nocontinue-on-error),pip-audit --strict(no mute pattern), Trivy image scan (CRITICAL,HIGH, blocking, indocker.yml); everyuses:SHA-pinned; CycloneDX SBOM + cosign + SLSA provenance on every release artifact. - Workflow SAST — zizmor, blocking on High/Critical, on any PR touching
.github/workflows/**oraction.yml. - Accessibility — scoped to the
--format htmlreport andweb/playground. Not yet a blocking CI gate (tracked:docs/CONFORMANCE-GAPS.md#accessibility); today this is enforced only by unit tests asserting lang/viewport/landmark/contrast properties (tests/test_report_extras.py). - i18n — N/A, declared (
docs/I18N.md), CI-enforced (scripts/check_i18n.py). - AI-eval — N/A, no LLM/AI component (
docs/RESPONSIBLE-TECH-AUDITS.md). - Observability — N/A beyond the Tier C declaration (README
## Observability); no structured-log gate applicable (no--log-format jsonflag shipped yet). - Performance —
scripts/benchmark.pyexists; not yet a CI budget gate (tracked:docs/CONFORMANCE-GAPS.md#quality-and-metrics). - Build —
python -m build(sdist + wheel) and the Docker image both build in the release workflows; the composite Action self-tests against the fixture feed on every PR (action-self-testinci.yml).
make verify runs stages 1–5 locally, byte-for-byte identical to CI
(ci.yml, .github/workflows/verify.yml).
- PR description states acceptance criteria and links an issue where one
exists (see
.github/PULL_REQUEST_TEMPLATE.md). - A new rule ships a passing and failing fixture, and
docs/rules.md/docs/spec-questions.mdare updated if the rule interprets an ambiguous part of the spec (docs/authoring-rules.md). - A change to a workflow,
action.yml, orDockerfilegets a threat-model read-through againstSECURITY.mdbefore merge (these paths are also routed through.github/CODEOWNERS). - A new custom interactive surface in
web/gets a keyboard + screen-reader pass before merge (informal today; see the accessibility gap above). CHANGELOG.mdis updated when behavior changes (CONTRIBUTING.md).
make verifyis green at the tagged commit (.github/workflows/verify.yml, called frompypi-publish.yml,docker.yml,release-corpus.ymlbefore any publish step runs).- Tag,
pyproject.tomlversion, andCITATION.cffversion agree, andCHANGELOG.mdhas a section for the released version (checked mechanically as part ofverify.yml). - The release tag is annotated and signed (
git tag -s vX.Y.Z -m "release: vX.Y.Z") — enforced byverify.ymlgoing forward; seedocs/CONFORMANCE-GAPS.md#release-and-versioningfor the pre-existing tags this does not retroactively cover. - SBOM + build provenance (PyPI) and SBOM + provenance + cosign signature (GHCR) are (re)generated as part of the publish workflow, never hand-built.
verify-published(inpypi-publish.ymlanddocker.yml) re-downloads what was actually published and checks its attestation/signature before the release is considered done.
Not yet enabled as a live GitHub ruleset — this needs an interactive
GitHub Settings change, which is outside what this repo's files can express
or what an automated remediation pass should do unattended. See
docs/CONFORMANCE-GAPS.md#ci-cd for the exact ruleset this DoD assumes
(PR required, required status checks including the security jobs above,
CODEOWNERS review, linear history, no force-push, no admin bypass) and the
one-time setup command/UI path to enable it.