Skip to content
bitzorcas
中EN

Guide

Commercial GA Gate

Prepare the feed, signatures, provenance, SBOM, policy evidence, and external Consumer required for a formal BitzOrcas release.

Last updated

Commercial GA is a release-batch gate, not one more ordinary CI job. It verifies immutable artifacts from a controlled release workflow and never rebuilds packages from product source on the spot.

Inputs required before dispatch

InputProviderPurpose
Release run id and artifact nameRelease workflowLocate the immutable candidate
Full 40-character commitRelease owner/automationBind source and provenance
Authenticated HTTPS feedPackage platformReal customer restore endpoint
Short-lived read-only credentialIdentity/secret platformLeast-privilege feed access
Signer fingerprintsSecurity/release teamConstrain trusted signers
Vulnerability thresholdSecurity governanceDefine the blocking line
Third-party license policyLegal/OSS governanceDefine license acceptance
External Consumer artifactRelease workflowRepository-external consumption target

Artifact contract

At minimum, the candidate contains:

packages/ signed immutable nupkg files
consumer/ one external .slnx and its projects
provenance.json packages, hashes, commit, signers, evidence index
SBOM / policy evidence

Published versions are immutable. Fixes require a new version and new provenance.

Verification order

Check external prerequisites
→ validate artifact layout
→ validate provenance schema and release commit
→ validate package set, versions, and SHA-256
→ dotnet nuget verify --all
→ validate signers, SBOM, vulnerabilities, and license policy
→ external Consumer empty-cache restore/build/test/publish

Order matters. Once a hash or commit is inconsistent, the batch identity is not trustworthy and later consumption results cannot repair it.

Why fail-closed is mandatory

These shortcuts create false evidence and are prohibited:

  • replacing an unavailable feed with a local folder;
  • repacking current source after an artifact download failure;
  • skipping signatures when no signer is configured;
  • warning-only behavior for missing SBOM or policy evidence;
  • substituting a product-repository solution for the external Consumer.

Run and diagnose

Check prerequisite variables first:

Terminal window
scripts/build/verify-commercial-ga.sh --check-prerequisites

Missing values are listed and return failure. The GitHub Actions Commercial GA workflow then injects artifact paths and runs complete verification.

OutputMeaningOwner
external prerequisite unavailableRelease infrastructure input is missingRelease/platform team
provenance schema/hash mismatchArtifact and index disagreeRelease workflow owner
signer mismatchSigner is outside the trusted setSecurity/release team
policy evidence failedVulnerability or license policy rejectedSecurity/OSS governance
Consumer restore/build failureFeed, closure, or template regressionFramework/package owners

Exact environment variables

--check-prerequisites verifies only that variables are non-empty. Full execution validates schema, hashes, signatures, policies, and Consumer behavior.

VariableContent
BITZORCAS_COMMERCIAL_FEED_URLHTTPS feed without embedded credentials, query, or fragment
BITZORCAS_RELEASE_PACKAGES_DIRRelease artifact packages/ directory
BITZORCAS_RELEASE_PROVENANCE_PATHPath to provenance.json
BITZORCAS_RELEASE_GIT_COMMITControlled 40-character release commit
BITZORCAS_TRUSTED_SIGNER_FINGERPRINTSNon-empty SHA-256 signer fingerprint set
BITZORCAS_VULNERABILITY_THRESHOLDThreshold matching provenance and scan evidence
BITZORCAS_THIRD_PARTY_LICENSE_POLICYPolicy identifier/threshold matching evidence
BITZORCAS_APPROVED_LICENSE_EXPRESSIONSAllow-listed SPDX expressions for third-party licenses
BITZORCAS_RELEASE_CONSUMER_SOLUTIONThe sole .slnx, outside the vendor repository
BITZORCAS_RELEASE_PUBLISH_PROJECTSPublish projects joined by platform path separator
NuGetPackageSourceCredentials_BitzOrcasCommercialShort-lived NuGet feed credential
Terminal window
# Report presence only; never echo secret values.
for name in \
BITZORCAS_COMMERCIAL_FEED_URL \
BITZORCAS_RELEASE_PACKAGES_DIR \
BITZORCAS_RELEASE_PROVENANCE_PATH \
BITZORCAS_RELEASE_GIT_COMMIT \
BITZORCAS_TRUSTED_SIGNER_FINGERPRINTS \
BITZORCAS_VULNERABILITY_THRESHOLD \
BITZORCAS_THIRD_PARTY_LICENSE_POLICY \
BITZORCAS_RELEASE_CONSUMER_SOLUTION \
BITZORCAS_RELEASE_PUBLISH_PROJECTS \
NuGetPackageSourceCredentials_BitzOrcasCommercial
do
# Expand the variable name indirectly and print presence only.
test -n "${!name:-}" && printf '%s=present\n' "$name" || printf '%s=missing\n' "$name"
done

Do not persist these values in repository scripts or shared shell history. The formal workflow derives them from GitHub Variables, Secrets, downloaded artifact paths, and controlled inputs.

Provenance and package identity checks

The verifier:

  1. validates structure against 0012-commercial-release-provenance.schema.json;
  2. matches provenance commit to the controlled workflow commit;
  3. requires provenance signers to equal the controlled fingerprint set;
  4. requires physical nupkg, provenance, and commercial catalog packageId sets to be identical;
  5. validates per-file SHA-256 (nupkgs additionally carry SHA-512 aligned with the NuGet global-packages representation), nuspec id/version, and dependencies;
  6. rejects source, PDB, Source Link, machine paths, and credential markers;
  7. requires SBOM coverage for released identities and package dependencies;
  8. rejects unresolved findings and expired exemptions.

Different hashes for one packageId/version violate immutability. Missing and extra packages both fail; this is exact-set validation, not “contains at least the catalog packages.”

External Consumer verification

GA writes a temporary NuGet.Config with <clear /> and Package Source Mapping, forces BitzOrcas.* to the formal feed, and isolates package, HTTP, plugin, and CLI-home caches.

It runs dotnet nuget verify --all with trusted fingerprints for every package, then restores, Release-builds, Release-tests the external Solution, and publishes every declared project. Commands kill their process group after a 15-minute timeout; failed output is redacted before reporting.

Current GA publish does not force PublishTrimmed=true. Trimming depends on external project settings. A Profile claiming trim safety must set that property in the release Consumer and add an explicit assertion.

workflow_dispatch operation

The formal GitHub Actions workflow accepts three manual inputs: release run id, artifact name, and full release commit. It checks out verifier code at that commit, then downloads the candidate from the selected run.

The downloaded artifact must contain exactly one top-level Consumer .slnx and at least one .csproj; otherwise it fails with external prerequisite unavailable: release Consumer artifact layout. Never rewrite $GITHUB_ENV to point at a vendor-repository Solution.

After the gate passes

A passing GA gate permits entry into the cutover window. The runbook must still verify configuration, readiness, License state, observability, database compatibility, and rollback conditions while retaining the previous version during the observation period.

Governance manifests

The GA gate and runtime enforcement draw on a set of reviewable governance manifests maintained in the source repository at docs/architecture/00-governance/manifests/. They are the machine-readable source of truth for production readiness, not documentation prose.

ManifestScope
0001-module-governance-legacy-ledger.jsonlegacy module-root ratchet
0002-production-adapter-readiness.jsonadapter readiness guard
0003-operations-runtime-surface.jsonoperations runtime visibility surface
0004-template-upgrade-map.jsontemplate version upgrade map
0005-test-drift-ledger.jsontest-drift classifications
0006-persistence-surface-classification.jsonentity/persistence surface classification
0008-error-catalog.jsonstrong-typed error catalog (1,968 codes — measure with `jq ‘.entries
0009-error-catalog-legacy-baseline.jsonlegacy two-segment error-code baseline
0010-commercial-package-catalog.jsoncommercial package / profile / license catalog
0011-profile-package-closure.jsonprofile package closure + runnable combinations
0012-commercial-release-provenance.schema.jsonrelease provenance schema (referenced above)
0013-runtime-license-policy-catalog.jsonshared runtime license policies + static combination boundary

(Numbering jumps 0006 → 0008; there is no 0007.) The full governance narrative and the gates these manifests back are documented in the Governance section.

GA completion checklist

  • workflow inputs bind a trusted release run and 40-character commit;
  • downloaded artifact exactly matches provenance and physical package sets;
  • every nupkg hash, identity, content, and signer passes;
  • SBOM covers release identities and transitive package dependencies;
  • vulnerability and third-party license policies pass with no expired exemption;
  • external Consumer restores from the formal HTTPS feed with empty caches;
  • Consumer Release build, test, and every selected publish pass;
  • Runtime License, migration, readiness, monitoring, and rollback runbook pass in target environment;
  • release record preserves workflow run, artifact, provenance, policy evidence, and approvers;
  • the previous version and rollback path remain during observation.

If any item is absent, the state is “GA incomplete” or “external prerequisite unavailable,” never “partially passed GA.”

See also

100%

Scroll or use controls to zoom · drag when enlarged · double-click for 100% / 200%