Skip to main content
CleanStart

Knowledge Hub

The 11 Verification Artifacts

Every build in CleanStart Source Intelligence Core produces 11 distinct artifacts. Each serves a specific purpose in the verification and governance pipeline. Together, they form an immutable record of what was built, how it was built, and what it contains.

1. SPDX 3.0 Software Bill of Materials

Purpose: Standardized inventory of all components, with detailed relationships and metadata.

Format: JSON-LD (JavaScript Object Notation for Linked Data)

Contents: The SPDX document lists every dependency with its exact version, includes license information for each package, documents relationships between components, records cryptographic hashes of each element, and tracks vulnerability linkages for supply chain security.

Why it matters: SPDX is the industry standard. Insurance companies, compliance auditors, and government agencies expect SPDX documents. It enables automated analysis across your entire software portfolio.

{  "spdxVersion": "SPDX-3.0.0",  "creationInfo": {    "created": "2024-03-20T14:30:00Z",    "creators": ["Tool: cleanstart-factory-v2"]  },  "packages": [    {      "SPDXID": "SPDXRef-Package-express",      "name": "express",      "versionInfo": "4.18.2",      "downloadLocation": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",      "filesAnalyzed": true,      "checksums": [        {          "algorithm": "SHA256",          "checksumValue": "abc123..."        }      ]    }  ]}

Use cases: SPDX documents serve multiple critical purposes including providing a board-level inventory of all software components, enabling license compliance reporting to verify legal obligations, supporting insurance policy verification for coverage determination, and creating regulatory audit evidence required by compliance frameworks.

2. CycloneDX 1.4 Bill of Materials

Purpose: Lightweight, developer-friendly BOM format focused on software composition and vulnerabilities.

Format: XML and JSON variants

Key differences from SPDX: More compact representation. Built-in vulnerability tracking Service metadata support Licensing simplified to commons patterns

Example:

<?xml version="1.0"?><bom xmlns="http://cyclonedx.org/schema/bom/1.4">  <metadata>    <timestamp>2024-03-20T14:30:00Z</timestamp>    <tools>      <tool>        <vendor>cleanstart</vendor>        <name>factory-builder</name>        <version>2.0.0</version>      </tool>    </tools>  </metadata>  <components>    <component type="library" bom-ref="pkg:npm/express@4.18.2">      <name>express</name>      <version>4.18.2</version>      <purl>pkg:npm/express@4.18.2</purl>      <vulnerabilities>        <vulnerability ref="cve-2024-0001">          <id>CVE-2024-0001</id>          <source name="NVD">...</source>        </vulnerability>      </vulnerabilities>    </component>  </components></bom>

Use cases: Development team daily usage. Vulnerability scanning integration Dependency update tracking Package manager integration

3. SLSA L4 Build Attestation

Purpose: Cryptographic proof that the build process was secure and followed approved procedures.

Format: SLSA Provenance v1.0 (JSON)

What it verifies:

Who initiated the build (identity verified) When the build occurred (timestamp) What source code was built (git commit hash) How the build was done (build parameters) What environment it was built in (build runner specs) The build output hashes (artifact integrity)

Full example:

{  "_type": "https://slsa.dev/schema/v1.0/provenance",  "predicate": {    "builder": {      "id": "https://github.com/cleanstart/factory/builders/v2.0"    },    "buildType": "https://cleanstart.dev/buildType/standard",    "invocation": {      "configSource": {        "uri": "git+https://github.com/myapp/repo.git",        "digest": {          "sha256": "abc123def456..."        },        "entryPoint": "Dockerfile"      },      "parameters": {        "buildTarget": "production",        "optimizationLevel": "O2",        "reproducible": true      },      "environment": {        "runner": "google-cloud-build-n2-standard-4",        "containerImage": "gcr.io/cleanstart-builders/builder:v2.0"      }    },    "buildConfig": {      "sourceChain": [        {          "revision": "abc123def456...",          "fromRevision": "def456ghi789..."        }      ],      "resolvedDependencies": [        {          "uri": "npm:express@4.18.2",          "digest": {            "sha256": "..."          }        }      ]    },    "materials": {      "dockerfile": {        "uri": "file:///build/Dockerfile",        "digest": {"sha256": "..."}      }    },    "byproducts": {      "stderr": "Build completed successfully\nTimestamp: ...",      "buildLog": "file:///artifacts/build.log"    },    "completeness": {      "parameters": true,      "environment": true,      "materials": true    }  }}

Signature: Signed by CleanStart's build service account using a key stored in Cloud KMS.

Use cases: Governance verification ("was this built securely?"). Audit trails for compliance Supply chain integrity verification Detection of build environment tampering

4. In-Toto Link Metadata

Purpose: Detailed tracking of each step in the build pipeline with cryptographic linkage between steps.

Format: JSON (In-Toto v1.0 specification)

Steps tracked: Source code checkout. Dependency resolution Build compilation Tests execution Artifact generation Signing and attestation

Example link for "compile" step:

{  "_type": "link",  "name": "compile",  "materials": {    "src/app.js": {      "sha256": "abc123..."    },    "Dockerfile": {      "sha256": "def456..."    }  },  "products": {    "app.o": {      "sha256": "ghi789..."    }  },  "byproducts": {    "return-value": 0,    "stdout": "Compilation successful",    "stderr": ""  },  "environment": {    "USER": "builduser",    "PWD": "/build"  },  "command": [    "gcc",    "-c",    "src/app.c",    "-o",    "app.o"  ]}

The full chain creates an immutable timeline of the build process.

Use cases: Detailed audit of what happened during the build. Detecting when and where tampering occurred Understanding dependency graph evolution Reproducibility verification

5. Cosign Signature

Purpose: Cryptographic signature proving the artifacts haven't been modified since the build.

Format: OCI image signature (stored in OCI artifact manifest)

How it works:

# During buildcosign sign \  --key $SIGNING_KEY \  --tlog-upload=true \  gcr.io/cleanstart/myapp:1.0.0 # On verificationcosign verify \  --key $PUBLIC_KEY \  gcr.io/cleanstart/myapp:1.0.0

What's signed: OCI image digest (all layers). Timestamp of signature Signing identity Optional annotations (build reason, approval, etc.)

Signature log: Stored in transparency log for long-term verification even if your key is lost.

Use cases: Ensuring artifact hasn't been modified in transit. Supply chain verification (verifying who built it) Image pull policies (only run signed images) Revocation of compromised builds

6. Vulnerability Exposure Exchange (VEX) Document

Purpose: Formal assertions about which vulnerabilities affect your application.

Format: NTIA-compliant JSON (or SBOM extension)

Typical content:

{  "vex_format": "cyclonedx",  "vex_version": "1.0",  "vulnerabilities": [    {      "cve": "CVE-2024-1234",      "component": "openssl",      "status": "not_affected",      "justification": "vulnerable_code_not_in_execute_path",      "impact_statement": "The TLS 1.3 session ticket handling is only triggered if client requests session resumption. Our implementation always creates new sessions."    },    {      "cve": "CVE-2024-5678",      "component": "curl",      "status": "affected",      "remediation": {        "recommendation": "Update curl from 7.88 to 7.91",        "date": "2024-03-25"      }    }  ]}

Why this matters: Automates the distinction between "vulnerable code present" and "vulnerability affects us".

Use cases: Risk prioritization. Automated security dashboards Compliance reporting Insurance policy verification

7. Build Provenance Record

Purpose: Human-readable summary of build origin and parameters.

Format: Structured metadata (JSON with signatures)

Contains: Source repository and commit. Build timestamp and duration Builder identity and version Build parameters (optimization flags, target platform, etc.) Output artifacts and their hashes Approval chain (who approved this build)

build_id: build-20240320-143051-abc123source:  repository: https://github.com/myapp/repo  commit: abc123def456...  branch: main  tag: v1.0.0  verified_commit_signature: truebuild_environment:  builder_version: cleanstart-v2.0.0  platform: linux/amd64  build_runner: google-cloud-build  timestamp: 2024-03-20T14:30:51Z  duration_seconds: 287parameters:  optimization_level: O2  reproducible: true  security_checks: allartifacts:  - name: app.tar.gz    sha256: abc123...    size_bytes: 52428800  - name: app.tar.gz.sig    signature_algorithm: RSASSA-PKCS1-v1_5approval_chain:  - approver: security-team    timestamp: 2024-03-20T14:25:00Z  - approver: ops-team    timestamp: 2024-03-20T14:28:00Z

Use cases: Governance and policy enforcement. Change tracking Incident investigation Compliance audit evidence

8. Build Log (Structured)

Purpose: Complete transcript of the build process with structured machine-readable format.

Format: Newline-delimited JSON (NDJSON) with timestamps and severity levels

Example entries:

{"timestamp": "2024-03-20T14:30:00Z", "level": "info", "component": "builder", "message": "Build started", "build_id": "abc123"}{"timestamp": "2024-03-20T14:30:05Z", "level": "info", "component": "source", "message": "Source code fetched", "size_bytes": 5242880, "hash": "def456"}{"timestamp": "2024-03-20T14:30:12Z", "level": "info", "component": "resolver", "message": "Resolved 52 dependencies", "count": 52}{"timestamp": "2024-03-20T14:31:45Z", "level": "warning", "component": "vulnerability_scan", "message": "847 CVEs found in dependency tree", "after_filtering": 40}{"timestamp": "2024-03-20T14:33:51Z", "level": "info", "component": "image", "message": "Image built successfully", "digest": "sha256:ghi789", "size_bytes": 52428800}

Searchable fields: timestamp, severity, component, message, metrics

Use cases: Post-incident analysis. Performance optimization Debugging build failures Security event investigation

9. Test Results Summary

Purpose: Proof that automated tests passed before the artifact was released.

Format: JSON with detailed test execution metadata

Contents:

{  "test_run_id": "test-20240320-143051",  "timestamp": "2024-03-20T14:33:00Z",  "total_tests": 847,  "passed": 847,  "failed": 0,  "skipped": 0,  "coverage": {    "line_coverage": 94.2,    "branch_coverage": 87.5,    "function_coverage": 96.1  },  "test_suites": [    {      "name": "unit_tests",      "passed": 523,      "failed": 0,      "duration_ms": 4521    },    {      "name": "integration_tests",      "passed": 267,      "failed": 0,      "duration_ms": 18932    },    {      "name": "security_tests",      "passed": 57,      "failed": 0,      "duration_ms": 2145    }  ],  "security_checks": {    "sast_issues": 0,    "dast_issues": 0,    "dependency_vulnerabilities": 40  }}

Policy gates: No artifact is released if tests don't meet threshold (e.g., 85% coverage minimum).

Use cases: Quality assurance verification. Regression detection Coverage tracking Policy enforcement

10. Helm Chart (for Kubernetes)

Purpose: Declarative configuration for deploying the built application to Kubernetes.

Format: Helm 3 chart structure

Key files: A Helm chart contains several essential components. The Chart.yaml file holds chart metadata. The values.yaml file provides default configuration. The templates/ directory contains deployment templates including deployment.yaml (the Pod deployment spec), service.yaml (the Service definition), and configmap.yaml (application configuration). The values-prod.yaml file provides production overrides for environment-specific settings.

Immutability: The chart is versioned alongside the application version and signed.

# Chart.yamlapiVersion: v2name: myappversion: 1.0.0appVersion: 1.0.0maintainers:  - name: Platform Team    email: platform@example.com

Why it matters: Deployment is reproducible and version-controlled. Configuration changes are auditable Rollbacks are instant (revert to previous chart version) GitOps workflows integrate automatically

Use cases: Kubernetes cluster deployments. Multi-environment promotion Configuration management Disaster recovery and rollback

11. OCI Image

Purpose: The final, production-ready container image.

Format: OCI Image Format Specification (Docker-compatible)

Structure: An OCI Image consists of several components. The Image Index contains manifests for multiple architectures (supporting multi-platform builds). The Image Manifest holds references to all layers. The Config Blob stores image metadata. The Layer Blobs include the base OS layer (Alpine, Debian, etc.), the runtime layer (Java, Node.js, Python, etc.), a dependencies layer, and the application layer.

Metadata included: All previous artifacts embedded (SBOM, attestations, VEX). Cryptographic signatures Build provenance Digest (SHA256 of entire image)

Reproducibility: If rebuilding produces a different digest, something changed. The build is not reproducible.

Use cases: Container orchestration platforms. Serverless deployment Disaster recovery Distribution and replication

The 11-Artifact Workflow

The build workflow starts with application source code, which flows through the build pipeline. The pipeline generates 11 artifacts: SPDX 3.0 SBOM, CycloneDX SBOM, SLSA L4 Attestation, In-Toto Metadata, Cosign Signature, VEX Document, Build Provenance, Structured Build Log, Test Results, Helm Chart, and OCI Image. All artifacts are signed and distributed together, enabling deployment with full chain-of-custody verification.

Verification Chain

Each artifact depends on and references the others:

SBOM references the resolved dependencies (integrity-checked) SLSA Attestation references the source commit and build parameters Cosign Signature covers the OCI image and attestation In-Toto links connect each build step VEX document updates the SBOM with vulnerability status Test Results are referenced in the build log Helm Chart references the image digest

If any artifact is tampered with, the cryptographic chain breaks and verification fails.

Why This Matters

Organizations need all 11 artifacts because:

  1. Compliance: Auditors require specific standards (SPDX, SLSA)
  2. Security: Multiple verification vectors catch different attack types
  3. Operations: Teams need both technical records (logs, attestations) and business records (test results, approvals)
  4. Governance: Policies are enforced through structured metadata
  5. Supply chain: Downstreams need proof of what they're receiving

The artifacts transform a "container image" from a black box into a fully-transparent, cryptographically-secured software component with complete chain-of-custody.