Decision Gate Docs

Avaluació de portes determinista, reproduïble amb decisions auditable.

Asset Core docs

CI Release Gate Dogfooding

Aquesta guia documenta com Decision Gate controla la seva pròpia admissibilitat de llançament mitjançant proves CI deterministes. L’objectiu és demostrar una capa de política real i auditable sense substituir el sistema CI.

Per què això és rigorós

  • Separation of concerns: CI executes tests; Decision Gate evaluates the política i emet una decisió determinista.
  • Evidence-driven: The decision is based on a versioned evidence bundle més aviat que registres CI implícits.
  • Auditable output: Decision Gate exports a runpack with the full decision dades de seguiment i verificació.
  • Determinista: El mateix paquet d’evidències produeix la mateixa decisió.

Què és Gated

El flux de treball de l’etiqueta de llançament valida que un llançament és elegible en funció de:

  • Formatatge, lint i proves d’unitat
  • Proves del sistema P0 i P1
  • cargo-deny
  • Comprovacions de deriva del generador
  • Cobertura SBOM completa per a cada subjecte de llançament
  • Verificació de l’atestació de procedència per a cada subjecte de llançament
  • Verificació de signatura OIDC sense clau per a càrregues d’artifacts i procedència
  • Política de vulnerabilitat bloquejada (Alta/Crítica bloquejada + KEV bloquejat a qualsevol severitat)
  • Proves de packaging (Python + TypeScript)
  • Prova de fum de Docker
  • Consistència de la etiqueta/versió (l’etiqueta coincideix amb la versió de l’espai de treball)

Si falta o és fals qualsevol requisit, la porta nega la seva alliberament.

Paquet d’Evidències

El flux de treball de publicació escriu un paquet d’evidència JSON a un espai de treball d’evidència arrel i l’avalua mitjançant un camí de fitxer relatiu a l’arrel. L’exemple per defecte és ./evidence/release_evidence.json (relatiu a l’arrel del repositori), però l’arrel es pot substituir en temps d’execució amb --json-root.

Exemple (només forma):

{
  "release": {
    "tag": "v0.1.0",
    "version": "0.1.0",
    "tag_matches_version": true,
    "sha": "<git sha>",
    "generated_at": 1710000000000,
    "sbom_path": ".tmp/ci/sbom/decision-gate.sbom.spdx.json"
  },
  "checks": {
    "fmt": true,
    "clippy": true,
    "cargo_deny": true,
    "generate_all": true,
    "unit_tests": true,
    "system_tests_p0": true,
    "system_tests_p1": true,
    "sbom": true,
    "sbom_complete": true,
    "sbom_verified": true,
    "provenance_verified": true,
    "signature_verified": true,
    "vuln_policy_pass": true,
    "package_dry_run": true,
    "docker_smoke": true
  }
}

Escenari de Política

La porta de sortida s’expressa com un escenari estàndard de Decision Gate:

  • Plantilla: configs/ci/release_gate_scenario.json
  • Política: Totes les condicions han de ser certes (And gate)
  • Proveïdor: el proveïdor json integrat llegeix el paquet d’evidències
  • Execució: execució de l’escenari en viu (no precomprovació) de manera que es produeixi un runpack

L’escenari s’instancia en temps d’execució substituint els marcadors de posició de la plantilla:

  • {{SCENARIO_ID}} -> identificador únic de l’escenari
  • {{EVIDENCE_FILE}} -> ruta relativa al paquet d’evidències (dins de la carpeta arrel del proveïdor json)

Com s’executa en CI

El flux de treball de publicació realitza la següent seqüència:

  1. Executa comprovacions CI (fmt, clippy, proves, deny, empaquetatge, prova de fum).
  2. Generates release supply-chain evidence with scripts/ci/supply_chain_generate.sh (subjectes, SBOMs, procedència, signatures sense clau, artefactes de vulnerabilitat).
  3. Verifies supply-chain evidence with scripts/ci/supply_chain_verify.sh as a porta dura.
  4. Writes the Decision Gate release evidence bundle, including the new verificació de la cadena de subministrament booleans.
  5. Starts a local MCP server with configs/presets/ci-release-gate.toml (optionally adding --json-root <evidence-root> and --json-root-id <root-id>).
  6. Avalua l’escenari utilitzant el paquet d’evidències.
  7. Exporta i verifica un runpack.
  8. Uploads artifacts:
    • Conjunt d’evidències
    • Runpack
    • Paquet d’evidències de la cadena de subministrament (SBOM/provinença/signatures/artifacts de vulnerabilitat)
    • Payload de decisió i resum
    • Nom de l’artifact: decision-gate-release-gate

La implementació es troba a scripts/ci/ci_release_gate.sh i és cridada pel flux de treball de llançament.

Com es protegeix la publicació

La publicació és un flux de treball manual separat (.github/workflows/publish.yml). Abans que s’executin els passos de publicació, ara s’executa scripts/ci/supply_chain_generate.sh + scripts/ci/supply_chain_verify.sh per al target de publicació seleccionat. També verifica que el flux de treball de llançament de la etiqueta s’hagi completat amb èxit, així que la publicació no pot continuar sense ambdues:

  • aprovació, elegibilitat per a la publicació de Decision Gate auditada; i
  • aprovant la verificació de la cadena de subministrament per als artefactes objectiu.

Executant Localment

Podeu executar la mateixa porta de publicació localment amb un paquet d’evidències personalitzat:

python3 - <<'PY'
import json
from pathlib import Path

Path("evidence/release_evidence.json").write_text(json.dumps({
    "release": {
        "tag": "v0.1.0",
        "version": "0.1.0",
        "tag_matches_version": True,
        "sha": "local",
        "generated_at": 0,
        "sbom_path": "evidence/sbom/decision-gate.sbom.spdx.json",
    },
    "checks": {
        "fmt": True,
        "clippy": True,
        "cargo_deny": True,
        "generate_all": True,
        "unit_tests": True,
        "system_tests_p0": True,
        "system_tests_p1": True,
        "sbom": True,
        "package_dry_run": True,
        "docker_smoke": True,
    },
}, indent=2))
PY

bash scripts/ci/ci_release_gate.sh \
  --evidence-file evidence/release_evidence.json \
  --output-dir evidence/release-runpack \
  --config configs/presets/ci-release-gate.toml

Si alguna comprovació és falsa, l’script surt amb un codi diferent de zero i el resum de la decisió mostrarà el motiu de la denegació.

Per executar la generació + verificació de la cadena de subministrament amb paritat de versió local abans de l’avaluació de la porta:

bash scripts/ci/verify_all.sh --release-parity

Artefactes a Inspeccionar

  • decision_payload.json: càrrega útil de resposta del Decision Gate en brut
  • decision_summary.json: tipus de decisió + permetre/denegar
  • runpack/manifest.json: manifest de runpack determinista
  • runpack_verify.json: sortida de verificació de runpack
  • Docs/architecture/decision_gate_ci_and_workflow_architecture.md
  • configs/ci/release_gate_scenario.json
  • scripts/ci/ci_release_gate.sh