Novolis Docs
novolis-governance / executable-grains.md

Novolis executable grains

dotnetgovernancenovolis

Novolis has four executable grains. Use the first matching row; do not promote a host to a larger grain merely to obtain a different publishing mechanism.

DecisionToolUtilityAppLab
Audience.NET / Novolis developerTechnical user handling a file, wire, or devicePerson doing a product job or playing a gameNovolis maintainer proving a package integration
Primary jobRepeatable operator commandOne small technical jobPersistent product session, studio, reader, or game loopFast experiment, smoke, benchmark, or API walkthrough
Host shapeOne OutputType=Exe CLIOne OutputType=Exe, CLI or tiny UIProduct host; multiple projects/processes are allowedOne small host, with lab-only helpers allowed
DistributionNuGet PackAsToolExecutable or framework-dependent zipProduct release channelSource checkout only
InstallerForbiddenForbiddenAllowed and required by the declared Ship channelForbidden
PackAsToolRequiredForbiddenForbiddenForbidden
SDK/runtimeSDK requirement is intentionalSDK/runtime requirement is allowedRelease payload may bundle the runtimeDeveloper checkout requirement is expected
Canonical repositorynovolis-toolsnovolis-utilitiesnovolis-appsnovolis-lab
Library dependenciesPackageReference; local ProjectReference substitution only in Platform modeSameSameSame; optional library submodules are for checkout/local iteration, never committed project references
Shared host codeNo lab shared projectsNo lab shared projectsApp-private code onlylabs/shared is allowed for experiments, but graduates must remove it
Typical examplesnovolis-coverage, novolis-docs, novolis-manuscriptNDJSON explorer, ADB utility, WireFish viewerSketch Studio, Repo Studio, Merglyph, GeoPolity, PulseStripHello*, smokes, benches, SceneLab

Hard placement rules

  • Library repositories contain packable libraries, tests, repo-private benchmarks/ profile executables, and repo-private tools/ only. Profile executables are unpackable, are not shipped, and are not test hosts.
  • A library repository must not publish a PackAsTool, shipped CLI, executable zip, Windows installer, or Android APK.
  • All installable .NET tools live in novolis-tools, even when their domain library lives elsewhere.
  • All no-installer technical executables live in novolis-utilities.
  • All products and games with a product release channel live in novolis-apps.
  • novolis-lab is the staging ground for “spin up something quickly”; it is not a release catalog.
  • A lab graduates by moving its host into exactly one of the three shipping repositories. Its lab-only shared references do not graduate.

Publishing distinction

“Self-contained” describes the host shape: one executable project that can be run directly. It does not require dotnet publish --self-contained true.

  • Tools are published as tool packages and installed with dotnet tool install.
  • Utilities may require the .NET SDK/runtime and are distributed as executable artifacts or framework-dependent zips.
  • Apps choose a product channel such as windows-inno or android-apk.
  • Labs are not published.