Aller au contenu

OpenSSF Best Practices Badge — feuille de réponses « passing » (2026-06-29)

Date : 2026-06-29. Type : feuille de réponses opérationnelle pour remplir le questionnaire passing du badge sur bestpractices.dev (BadgeApp). Méthode : chaque ligne cite une preuve réelle vérifiée dans le dépôt — discipline d’honnêteté des signaux (ADR 0070, ADR 0083). Aucun critère n’est coché « pour le badge ».

Verdict. passing atteignable — 0 Unmet. Les 4 manques initiaux sont fermés : 2 en code (encart anglais dans README/CONTRIBUTING/SECURITY ; .github/ISSUE_TEMPLATE/) et 2 par réglage GitHub, faits le 2026-06-29 (description du dépôt enrichie ; Discussions activées, has_discussions: true). Bilan : ~52 Met, ~12 N/A légitimes, 0 Unmet. Les critères release/test/CI sont plus forts qu’au dépôt jumeau cluster (vrai build TS, 316 fichiers de test, provenance OIDC npm).

  1. Créer le projet sur https://www.bestpractices.dev/ (connexion GitHub, dépôt univ-lehavre/atlas). Le BadgeApp auto-remplit beaucoup de critères via l’API GitHub.
  2. Pour chaque critère ci-dessous : recopier la réponse (Met / N/A / Unmet) et coller la justification + l’URL de preuve. Toute mention fichier se traduit en URL par la base https://github.com/univ-lehavre/atlas/blob/main/ + le chemin.
  3. Les critères N/A sont légitimement non applicables (pas de cryptographie maison) — le badge les compte comme satisfaits dès lors que la justification est fournie.
  4. Tous les critères sont Met ou N/A : recopier directement les réponses ci-dessous dans le BadgeApp pour obtenir le badge passing.

Le BadgeApp ne réclame une URL que pour un sous-ensemble de critères (champ *_url obligatoire ou attendu). Voici ces seuls critères, avec le lien réel vérifié à coller — les autres critères se cochent sans URL.

CritèreURL à coller
contributionhttps://github.com/univ-lehavre/atlas/blob/main/CONTRIBUTING.md
contribution_requirementshttps://github.com/univ-lehavre/atlas/blob/main/CONTRIBUTING.md
documentation_basicshttps://univ-lehavre.github.io/atlas/
release_noteshttps://github.com/univ-lehavre/atlas/releases
documentation_interfacehttps://univ-lehavre.github.io/atlas/decisions/0033-contrat-interface-cluster/
vulnerability_report_processhttps://github.com/univ-lehavre/atlas/blob/main/SECURITY.md
report_processhttps://github.com/univ-lehavre/atlas/tree/main/.github/ISSUE_TEMPLATE
report_archivehttps://github.com/univ-lehavre/atlas/issues?q=is%3Aissue
static_analysishttps://github.com/univ-lehavre/atlas/blob/main/.github/workflows/codeql.yml
test_policyhttps://univ-lehavre.github.io/atlas/quality/tests/
CritèreRéponseJustification / preuve
description_goodMetDescription GitHub : « Monorepo généraliste : apps web, bibliothèques, services, CLIs et chaîne DataOps Python, sous une chaîne de qualité commune » + README détaillé.
interactMetREADME « Démarrage rapide », CONTRIBUTING.md, GitHub Discussions activées.
contributionMetCONTRIBUTING.md : branches, Conventional Commits, hooks, merge commit (ADR 0053).
contribution_requirementsMetExigences d’acceptation dans CONTRIBUTING.md (sujet minuscule, scope-enum, hooks pre-push, merge commit propre). URL : https://github.com/univ-lehavre/atlas/blob/main/CONTRIBUTING.md
floss_licenseMetLICENSE = MIT (FLOSS).
floss_license_osiMetMIT = OSI-approved.
license_locationMetLICENSE à la racine.
documentation_basicsMetSite doc Astro Starlight (univ-lehavre.github.io/atlas) : architecture, qualité, collaboration, glossaire.
documentation_interfaceMetContrat d’interface atlascluster (ADR 0033) + doc d’architecture du monorepo.
sites_httpsMetSite doc HTTPS (GitHub Pages) ; dépôt GitHub HTTPS. URL : https://univ-lehavre.github.io/atlas/
discussionMetGitHub Discussions activées (has_discussions: true) + issue tracker public searchable.
englishMetEncart « English summary » / « In English » dans README.md, CONTRIBUTING.md et SECURITY.md : issues, PR et rapports de sécurité en anglais acceptés. Doc de fond en FR (langue de l’équipe).
maintainedMetActivité quotidienne (PR/merges réguliers, releases par paquet, issues traitées).
CritèreRéponseJustification / preuve
repo_publicMetDépôt public versionné git.
repo_trackMetGit suit changements, auteurs, horodatages.
repo_interimMetBranches PR + merge commit (ADR 0053) préservent l’intermédiaire.
repo_distributedMetGit (distribué).
version_uniqueMetTags SemVer uniques par paquet (@univ-lehavre/atlas-…@X.Y.Z).
version_semverMetSemVer dérivé des commits par Changesets.
version_tagsMetReleases identifiées par tags ; GitHub Releases par paquet.
release_notesMetCHANGELOG.md (Keep a Changelog) par paquet, généré par Changesets ; GitHub Releases. URL : https://github.com/univ-lehavre/atlas/releases
release_notes_vulnsMetPas de CVE publique propre corrigée à ce jour ; les correctifs de sécurité passent en fix: au changelog.
CritèreRéponseJustification / preuve
report_processMet.github/ISSUE_TEMPLATE/ : formulaires bug_report.yml, feature_request.yml + config.yml (lien sécurité vers signalement privé).
report_trackerMetGitHub Issues utilisé activement (milestones Transverse — …).
report_responsesMetMainteneur réactif (issues ouvertes/fermées sous quelques jours).
enhancement_responsesMetIssues enhancement/tech-debt ouvertes depuis les audits (ADR 0052 R-findings).
report_archiveMetArchive publique et cherchable des signalements et réponses : issues GitHub ouvertes et fermées, indexées par la recherche. URL : https://github.com/univ-lehavre/atlas/issues?q=is%3Aissue
vulnerability_report_processMetSECURITY.md publié, lié au repo. URL : https://github.com/univ-lehavre/atlas/blob/main/SECURITY.md
vulnerability_report_privateMetGitHub Private Vulnerability Reporting documenté dans SECURITY.md (advisories privées).
vulnerability_report_responseMetDélais cibles documentés (SECURITY.md : évaluation initiale 7 jours).
CritèreRéponseJustification / preuve
buildMetVrai build : Turborepo (pnpm build) côté TS ; uv côté Python (dataops/).
build_common_toolsMetpnpm, turbo, vite, tsc, uv (outils standards).
build_floss_toolsMetToute la chaîne est FLOSS.
testMetSuite FLOSS : vitest + Playwright (e2e) côté TS, pytest + Hypothesis côté Python (ADR 0072).
test_invocationMetpnpm test (vitest), uv run pytest (dataops). Documenté dans le README.
test_mostMetLarge couverture : 316 fichiers de test + scénarios e2e Playwright + property-based.
test_continuous_integrationMetCI GitHub Actions sur chaque push/PR (ci.yml, e2e.yml).
test_policyMetPyramide de tests documentée (docs/quality/tests).
tests_are_addedMetTests ajoutés avec les features (property-based ADR 0072, a11y ADR 0038).
tests_documented_addedMetPage tests + section Tests du CONTRIBUTING.md.
warningsMetLinters stricts en CI : ESLint, Prettier --check, tsc strict, ruff, svelte-check.
warnings_fixedMetChecks bloquants requis sur main + enforce_admins actif (ADR 0016).
warnings_strictMetTypeScript strict, ESLint règles sécu/fonctionnelles, jscpd ≤ 5 %, CodeQL security-and-quality.
CritèreRéponseJustification / preuve
know_secure_designMetModèle de menace + compromis tracés en ADR ; SLA de remédiation (ADR 0018), runbook d’incident.
know_common_errorsMetgitleaks (secrets), CodeQL (SAST), Semgrep, OWASP ZAP (DAST), Scorecard.
crypto_publishedN/APas de crypto maison ; TLS/auth délégués aux plateformes (Appwrite, GHCR).
crypto_callN/AAucun algorithme crypto implémenté dans le code applicatif.
crypto_flossN/APas de fonctionnalité crypto propre.
crypto_keylengthN/APas de génération de clés par le projet.
crypto_workingN/AAucun algorithme crypto implémenté.
crypto_weaknessesN/AIdem.
crypto_pfsN/APas de négociation de clé maison.
crypto_password_storageN/APas de stockage de mot de passe applicatif (auth déléguée à Appwrite).
crypto_randomN/APas de génération de clés/nonces par le projet.
delivery_mitmMetGit/HTTPS + actions épinglées par SHA + images de base épinglées par digest (ADR 0084).
delivery_unsignedMetTéléchargements via HTTPS ; dépendances verrouillées (pnpm-lock.yaml, uv.lock).
vulnerabilities_fixed_60_daysMetDependabot (npm/pip/actions/docker) + audit npm bloquant (moderate) + Scorecard.
vulnerabilities_critical_fixedMetDependabot + délais SECURITY.md (Critical 7 j, ADR 0018).
no_leaked_credentialsMetgitleaks à chaque commit (pre-commit) et en CI ; valeurs réelles en config locale gitignorée.
CritèreRéponseJustification / preuve
static_analysisMetCodeQL (codeql.yml) + Semgrep + ESLint sécu + ruff. URL : https://github.com/univ-lehavre/atlas/blob/main/.github/workflows/codeql.yml
static_analysis_common_vulnerabilitiesMetCodeQL security-extended,security-and-quality + Semgrep + gitleaks + dependency-review.
static_analysis_fixedMetAlertes CodeQL/Semgrep triées (onglet Security) ; SLA de remédiation (ADR 0018).
static_analysis_oftenMetÀ chaque push/PR + cron hebdo (CodeQL, Scorecard).
dynamic_analysisMetOWASP ZAP baseline (DAST) sur les apps déployées + e2e Playwright.
dynamic_analysis_unsafeN/APas de langage memory-unsafe (TypeScript/Python).
dynamic_analysis_enable_assertionsMetAssertions des suites e2e/intégration ; gates de qualité bloquants en CI.
dynamic_analysis_fixedMetÉcarts e2e indexés (registre des drifts) puis corrigés.

Met : ~52 · N/A : ~12 · Unmet : 0. Le badge passing ignore les N/A justifiés : tous les critères sont satisfaits, plus aucune action requise.

Les 4 manques initiaux ont été fermés :

  • english — encart « English summary » / « In English » dans README.md, CONTRIBUTING.md, SECURITY.md.
  • report_process.github/ISSUE_TEMPLATE/ (bug_report.yml, feature_request.yml, config.yml).
  • description_good — description GitHub du dépôt enrichie (2026-06-29).
  • discussion — GitHub Discussions activées (2026-06-29).

Prochaine étape : créer le projet sur bestpractices.dev et recopier les réponses ci-dessus pour obtenir le badge passing.

Au-delà de passing (pistes silver/gold, déjà partiellement acquises) : enforce_admins actif, CodeQL + Semgrep + ZAP + gitleaks + Scorecard, provenance OIDC npm sur chaque publish (ADR 0017), actions épinglées par SHA et images par digest (ADR 0084), DOI Zenodo. Manques pour silver/gold : CITATION.cff (le DOI existe mais pas le fichier), CODEOWNERS imposé (existe mais non requis en protection, bloqué par le bus-factor = 1, cf. ADR 0016), signature cosign/SLSA des images.