Skip to content
bitzorcas
中EN

Concept

Commercial Delivery Overview

Understand the BitzOrcas delivery boundary from product source and NuGet packages to Consumer Solutions and formal GA.

Last updated

Commercial delivery is not a source-code zip sent to a customer. BitzOrcas separates product source, customer-owned code, and release evidence with packages, templates, licensing, and independent gates.

Three worlds

WorldContentsAllowed dependency style
Product repositoryFull Framework, Platform, Profiles, Hosts, and Tooling sourceInternal integration may use ProjectReference
Consumer SolutionCustomer-owned Hosts, business modules, and testsUses PackageReference through a private feed
Release batchImmutable nupkg files, signatures, provenance, SBOM, policy evidenceRead only by controlled release and GA workflows

The product repository’s integration conveniences must not leak into customer projects. Generated solutions cannot reference product-repository paths or copy Framework, Platform, or Licensing implementation source.

Delivery chain

Product source
→ build / test / Release publish
→ pack immutable NuGet packages
→ produce hashes / provenance / SBOM / policy evidence
→ sign and timestamp
→ upload to authenticated private feed
→ generate Consumer Solution
→ restore through PackageReference
→ activate Runtime License
→ Commercial GA

Product commit

Build / Test / Pack

Immutable packages + provenance + SBOM

Signature and trusted timestamp

Authenticated private feed

bitzorcas-host template

Repository-external Consumer

Runtime License

Commercial GA

Cutover and observation window

Each stage answers a different question:

  • Catalogs and Profiles define which packages a customer receives.
  • Templates define which source code the customer owns.
  • Feed entitlement defines which packages and versions the customer can download.
  • Runtime License defines which capabilities a deployment may run.
  • Commercial GA proves packages, evidence, and external consumption came from one trusted release.

Packages and Profiles

Machine-readable catalogs register every publishable project. A Profile is a reusable package closure, not a second copy of implementation code. A template combination projects Profiles, Host roles, Generators, Endpoint/Job assemblies, and License Features into the Consumer Solution.

Generators enter declared Hosts directly as PrivateAssets=all analyzer references. They do not rely on NuGet transitive analyzer propagation.

Release train and immutability

One commercial batch binds a full 40-character commit, package version, package set, every nupkg SHA-256, signers, provenance, SBOM, policy result, and external Consumer. A change to any identity-bearing input requires a new batch; a published version cannot be overwritten.

ChangeReuse the batch?Correct action
Release-note text onlyDepends whether evidence indexes itPreserve audit and revalidate the index
nupkg content or dependencyNoIncrement version, repack, and resign
Signer rotationNever silentlyUpdate trusted fingerprints and emit new evidence
SBOM/vulnerability resultDo not ignoreRe-run policy gates
Consumer templateNoRe-run external consumption in a new candidate

Uploading different bits under the same version breaks caches, signatures, hashes, and customer reproducibility; it is not a patch mechanism.

Responsibility by boundary

RoleCore responsibilityDeliverable
Framework maintainersDependencies, public API, generators, template boundaryPackable source and tests
Release workflowReproducible build, pack, sign, upload, evidence indexImmutable artifact
Package platformFeed availability, authentication, version immutabilityHTTPS restore endpoint
Security/OSS governanceSigners, vulnerability threshold, third-party licensesPolicy evidence
Commercial operationsEntitlement and Runtime License issuanceCustomer/deployment authorization
Application deliveryConsumer configuration, migration, cutover, rollbackTarget-environment acceptance

No single team can replace the complete evidence chain with “my job is green.”

Example: the real generation path of a multi-tenant authorized platform

Take public profile default-business-multi-authorization (with either RuntimeAdapter). Boundary note: all fifteen current profiles generate only an API Host — JobHost, Website, and similar hosts are later standalone adoptions, not reachable through parameters.

  1. The template derives default-business-multi plus PlatformModule=authorization from ProfileChoice and copies the native asset tree for the chosen ORM;
  2. It generates only customer-owned output: the BitzConsumer.Api host shell, a Business Starter module skeleton, and Unit/Architecture test projects;
  3. AppHost orchestrates SQL Server, Schema Migrator, the API, and RabbitMQ; the authorization variant adds authorization bootstrap plus dedicated persistence identity parameters;
  4. Endpoint / DI / ORM Fluent Config wiring arrives through analyzer-form Generators (PrivateAssets=all) attached to the declared Host — never through transitive flow;
  5. Every BitzOrcas.* package restores from the private feed at one release-train version;
  6. The Profile’s License feature closure is frozen into static requirements while local Consumer Contracts validate restore→build→test→publish behind four isolated caches.

If generated output contains src/Framework or a product-repository ProjectReference, delivery boundaries have failed.

Verify machine-readable manifests

The commercial catalog and Profile closure in the product repository are the delivery source of truth. The manual must not maintain a separate handwritten package list.

Terminal window
# Validate catalog, Profile closure, and packability.
dotnet test tests/BitzOrcas.Architecture.Tests \
--configuration Release \
--filter 'FullyQualifiedName~CommercialPackageCatalogTests'
# Prove an isolated Consumer can restore, build, test, and Release publish.
dotnet test tests/BitzOrcas.Framework.ConsumerContract.Tests \
--configuration Release --blame-hang-timeout 12m

Catalog tests prove declaration consistency. Consumer Contracts prove current candidates are consumable outside the repository. Neither result proves the formal-feed artifact has passed GA.

Assign failures to the right layer

FailureBoundaryInvalid workaround
Restore 403Package EntitlementOne shared long-lived token for every customer
Host reports License UnavailableRuntime LicenseDisable the License gate
One tenant cannot use a featureTenant FeatureModify the global Runtime License
Consumer misses a packageProfile/package closureCopy product source into customer code
Provenance hash mismatchRelease identityRepack from the current branch
Readiness unhealthyRuntime environmentRoute traffic based only on /health/live

Current status

The repository implements commercial catalogs, Profile closures, the Consumer template matrix, local Consumer Contracts, Runtime License contracts, and Commercial GA verification. Formal GA still needs the release environment to supply the real private feed, short-lived credential, trusted signers, SBOM, policy evidence, and external Consumer artifact.

The accurate statement is: “GA gate capability exists and awaits a real release batch,” not “merging code automatically completes GA.”

Precise completion language

Commercial delivery is complete only when the target batch is immutable, the formal feed restores, signatures and policies pass, the external Consumer completes its flow, Runtime License matches deployment context, target readiness and migration pass, rollback conditions are executable, and the observation window triggers no stop condition.

When a real feed, short-lived credential, trusted signer, SBOM, or external Consumer artifact is missing, record “external prerequisite unavailable.” Never rename a green local contract test to GA.

In this section


Chapter Navigation

100%

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