Skip to content

[Release/Supply chain] Establish reproducible exact-head artifacts and provenance #165

Description

@seonghobae

Buyer / acquisition gap

Protected develop@622e5e6c3d534f230c390f10e3832efadfc01825 has CI, dependency review, SBOM and security workflows, but a fresh repository search found no dedicated release/provenance workflow, no artifact-attestation path, and no existing mightyETL issue owning reproducible release artifacts or provenance verification. The commercial loop's release policy is therefore stronger than the executable repository release evidence currently visible.

Status: planned.

This is a supply-chain/release-product gap, not permission to publish an artifact immediately. Current blockers such as #151 licensing, #121 source-identity controls, #162/#164 non-vacuous coverage, required security/review evidence, and protected-head integration remain independent prerequisites and must not be bypassed.

Product decision

A release is an explicit protected-head operation. mightyETL must not treat a green pull-request synthetic merge, an arbitrary workflow run, a locally built binary, or an SBOM by itself as releasable provenance.

The target release boundary is:

exact protected source head
→ deterministic validated package/container build
→ dependency/license/security/coverage/migration/compatibility acceptance
→ SBOM + artifact digest
→ provenance/attestation bound to source/workflow/commit
→ verification
→ version/tag/release publication
→ post-publication artifact verification

No release workflow should be opened merely to manufacture attestation while the product cannot yet pass its protected release prerequisites.

Current GitHub-native feasibility

GitHub's current official artifact-attestation documentation provides a supported implementation path rather than requiring an invented signing service:

  • actions/attest@v4 can create artifact attestations for build outputs and container images;
  • attestation jobs require explicit least privilege such as id-token: write, contents: read, and attestations: write for the documented GitHub-native path;
  • SBOM attestations are supported;
  • consumers can verify provenance with gh attestation verify;
  • attestation statements bind build evidence such as repository/workflow/commit identity and must be verified rather than treated as proof merely because an attestation exists.

Primary documentation:

Use the current supported GitHub mechanism or a separately justified equivalent at implementation time; reverify versions and semantics before writing the workflow. Never copy an example action/version unpinned into protected release authority.

Required RCA before implementation

Inventory the actual distributable surface and establish one authoritative release contract:

  1. Which outputs are commercially supported: Maven artifacts, runnable JARs, container images, compose bundle, migration files, API/event contracts, or another package?
  2. Which artifact is the canonical installable unit for standalone operation and which artifacts compose the modular MSA profile?
  3. How are versions synchronized across the root reactor, service artifacts, containers, machine-readable contracts, database migrations and CHANGELOG?
  4. Can two clean builds from the same exact protected source produce byte-identical artifacts? If not, identify every nondeterministic input and decide whether reproducibility means byte identity or a rigorously bounded reproducible-build contract with normalized metadata.
  5. Which dependency/container/license/NOTICE obligations must ship with each output? [Acquisition diligence] Establish explicit repository licensing and copyright policy #151 is an explicit legal/product prerequisite; do not invent a license.
  6. Which database migrations and rollback/forward-recovery procedures must be included and rehearsed for a version?
  7. Which compatibility matrix applies to Java, PostgreSQL, Kafka/Debezium, connector/runtime dependencies and supported deployment profiles?
  8. What rollback means after an irreversible database or external-side-effect boundary?
  9. Which workflow/ref is authorized to publish: protected branch/tag only, never an arbitrary PR ref or synthetic merge.
  10. How tag/version publication is made race-safe so the attested digest, release tag and released bytes cannot refer to different source heads.

Bounded remediation options

Preferred architecture

After prerequisites are integrated, create one protected release workflow whose source is an exact immutable integrated ref and whose jobs are separated by authority:

  • build/test authority — read-only source checkout bound to the release SHA; execute the same full CI/security/coverage/package/migration/compatibility acceptance required by repository policy or consume immutable accepted evidence only when identity equivalence is provable;
  • package authority — produce canonical artifacts with deterministic metadata and explicit digests;
  • SBOM/license authority — create/validate SBOM and required LICENSE/NOTICE/provenance inventory without fabricating legal rights;
  • attestation authority — obtain only the minimal GitHub/OIDC permissions needed to attest the already-built immutable digest; no source mutation;
  • publication authority — publish only an already-validated/attested digest from the exact expected source/tag; fail closed if the protected ref or release identity changes;
  • verification authority — independently verify the published artifact digest and attestation after publication.

Acceptable alternative

Use another maintained provenance/signing system only if it provides equivalent or stronger source/workflow/artifact identity, secret handling, verification, revocation/incident handling and acquisition evidence, and its operational dependency is explicitly accepted by ADR.

Reject

  • publishing from pull_request synthetic merge revisions;
  • signing/attesting a mutable filename without digest binding;
  • producing provenance before tests/security/coverage and then replacing the artifact;
  • reusing an SBOM from another head/base;
  • letting a model-executing job hold release credentials merely for convenience;
  • long-lived static signing secrets when supported OIDC/ephemeral identity can meet the requirement;
  • latest-only container publication as release identity;
  • changing branch protection or required gates to make a release workflow pass;
  • claiming reproducibility because one build succeeded;
  • publishing before [Acquisition diligence] Establish explicit repository licensing and copyright policy #151 has an explicit owner-approved licensing posture.

TDD / release acceptance

Before production release automation, add fail-first workflow/package contracts proving the protected repository currently lacks the required boundary. Final acceptance must prove at minimum:

  1. workflow can run only from the intended protected immutable release identity and records the exact source SHA;
  2. PR synthetic merge/event ref cannot enter the publication path;
  3. package/container manifests and application version agree with the release version;
  4. clean supported-environment builds produce the declared reproducibility result, with nondeterministic inputs either eliminated or explicitly normalized and tested;
  5. generated artifact digest is captured before attestation and publication;
  6. SBOM corresponds to that exact artifact/source and includes available license metadata;
  7. required LICENSE/NOTICE files are present in every distributable once [Acquisition diligence] Establish explicit repository licensing and copyright policy #151 is resolved;
  8. all exact deterministic tests, non-vacuous 100% owned-production coverage, dependency review, SAST/security, secret scanning, SBOM, migration/rollback, compatibility and operator acceptance gates pass on the exact release source;
  9. machine-readable OpenAPI/AsyncAPI artifacts, once feat(api): add machine-readable HTTP and CDC contracts #157 integrates, are versioned and match the released runtime behavior;
  10. database migrations are ordered, upgrade-rehearsed and accompanied by an explicit rollback or forward-recovery boundary;
  11. provenance/attestation is generated for the immutable digest with minimal permissions and no model/reviewer credential reuse;
  12. gh attestation verify or an equivalent independent verifier succeeds against the published artifact and expected repository identity;
  13. tampered bytes, wrong repository/workflow identity, wrong source SHA and wrong release version fail verification;
  14. publication is expected-head/digest safe and cannot silently release another actor's newer branch/tag state;
  15. post-publication verification fetches the actual released artifact/container digest rather than trusting the upload response;
  16. failure before publication leaves no partial release; failure after publication has a documented incident/yank/revoke/supersede procedure appropriate to the package channel;
  17. CHANGELOG/release notes contain only behavior integrated on the exact protected source and never active_pr claims;
  18. qualifying independent non-author review and release approval satisfy live governance without self-approval or synthesized identities.

Reproducibility evidence

Do not reduce reproducibility to one checksum assertion. The test plan should identify and control, where applicable:

  • compiler/JDK and Maven versions;
  • dependency and plugin resolution;
  • timestamps, archive ordering and file modes;
  • generated manifests/build metadata;
  • container base-image digests and build context;
  • architecture/platform variance;
  • generated API/event/schema artifacts;
  • migration file contents/order;
  • environment-dependent configuration that must remain outside artifacts.

Record the exact reproducibility model and any residual nondeterminism in canonical release/provenance documentation.

Documentation / traceability

Issue #159 already requires a discoverable release/provenance authority. The integrated release slice must update or explicitly index:

  • PRD/TRD release requirements;
  • Architecture deployment/release authority;
  • Security/Threat Model for supply-chain compromise and credential boundaries;
  • Test Strategy for reproducibility/verification;
  • Operability runbook including rollback/yank/incident response;
  • migration/compatibility authority;
  • licensing/NOTICE authority from [Acquisition diligence] Establish explicit repository licensing and copyright policy #151;
  • CHANGELOG/versioning rules;
  • ADR for release/provenance architecture;
  • traceability from requirement → workflow → test → artifact → attestation → release.

Sequencing

Do not open the release workflow implementation while an exact release cannot satisfy its prerequisites. Re-evaluate after #121 source-identity controls, #162/#164 non-vacuous coverage, #151 licensing posture, machine-readable contract integration as applicable, and the relevant product/security stack have stabilized on protected history. A waiting release issue never blocks unrelated product/security work.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: authAuthentication, authorization, identity, or tenant isolationarea: ci-cdCI, GitHub Actions, checks, release, or supply chainarea: dependenciesDependency or lockfile maintenancearea: securitySecurity boundary, hardening, or vulnerability preventionmaintenancepriority: mediumNormal-priority or P2 workstatus: triagedOpen issue has an organization taxonomy assignmenttype: featureNew or expanded product capability

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions