Novolis Docs
novolis-governance / frank-naming-and-structure.md

Frank.* → Novolis naming and structure

dotnetgovernancenovolis

Status: Signed off 2026-05-17 (maintainer execution). Blocks: extraction briefs and migrate-frank-slice.ps1 until this doc is updated for new packages.

Authoritative mapping for extract/rebuild migrations. Package IDs, folder paths, namespaces, and public API names must match this document.

Related: naming.md, frank-inventory.md, frank-migration-runbook.md.

Sign-off

RoleDateNotes
Migration execution2026-05-17Defaults below applied for P0 pilot + waves 0–2; storage wave 3 subset

Repo ↔ domain (reserved — do not rename)

GitHub repoDomainFrank sources (P0)Layout
novolis-messagingMessagingChannels.DI, PulseFlowMulti-package
novolis-testingTestingFrank.Testing (5 publishable facets)Multi-package
novolis-transportsTransportsBedrockSlim, Http, WireFishMulti-package
novolis-storageStorageDataStorage subsetMulti-package
novolis-securitySecurityCryptography, HIBPMulti-package
novolis-codegenCodeGenReflection subset + Xml/Xsd emitMulti-package
novolis-analyzersAnalyzersAutoMapper, CodeLengthMulti-package
novolis-templatesTemplatesFrank.Templates (7 packs)Single template NuGet pack
novolis-mathMathGameEngine Primitives subsetMulti-package
novolis-machinelearningMachineLearningFrank.ML neural foundationMulti-package
novolis-markupMarkupFrank.Markdown, Frank.MermaidMulti-package
novolis-commandsCommandsGreenfield (parse → envelope → queue)Multi-package
novolis-gamingGame authoringGreenfield (Novolis.Game.*)Multi-package
novolis-xsdXsdFrank.UblSharp, Finance.Documents.Ubl, Libraries.Ubl/SBDHMulti-package

Structural rule (Frank → Novolis)

Frank uses project folders at repo root. Novolis uses:

novolis-<domain>/
  src/Novolis.<Domain>.<Facet>/
  tests/Novolis.<Domain>.Unit/     # single TUnit project per solution
    <Facet>/                       # tests grouped by project under test
  tests/Novolis.<Domain>.TestSupport/   # optional shared fixtures (not a test runner)
  samples/                    (when Frank had Samples/)
  Novolis.<Domain>.slnx
  .novolis/packages.json
  Directory.Build.props
  Directory.Packages.props
  global.json

On extract: move projects into src/ / tests/; do not preserve Frank flat root layout.

NuGet package naming (P0 — resolved)

Frank package / projectNovolis PackageIdRepo folder
Frank.Channels.DependencyInjectionNovolis.Messaging.Channelssrc/Novolis.Messaging.Channels/
Frank.PulseFlowNovolis.Messagingsrc/Novolis.Messaging/
Frank.BedrockSlim.ServerNovolis.Transports.Tcp.Serversrc/Novolis.Transports.Tcp.Server/
Frank.BedrockSlim.ClientNovolis.Transports.Tcp.Clientsrc/Novolis.Transports.Tcp.Client/
Frank.BedrockSlim.Cryptography(deferred)—
Frank.HttpNovolis.Transports.Httpsrc/Novolis.Transports.Http/
Frank.Http.AbstractionsNovolis.Transports.Http.Abstractionssrc/Novolis.Transports.Http.Abstractions/
Frank.Http.AuthenticationNovolis.Transports.Http.Authenticationsrc/Novolis.Transports.Http.Authentication/
Frank.Http.ExtensionsNovolis.Transports.Http.Extensionssrc/Novolis.Transports.Http.Extensions/
Frank.Testing.TestOutputExtensions`Novolis.Testing.TUnit`src/Novolis.Testing.TUnit/
Frank.Testing.LoggingNovolis.Testing.Loggingsrc/Novolis.Testing.Logging/
Frank.Testing.TestBasesNovolis.Testing.TestBasessrc/Novolis.Testing.TestBases/
Frank.Testing.TestcontainersNovolis.Testing.Testcontainerssrc/Novolis.Testing.Testcontainers/
Frank.Testing.TestServerNovolis.Testing.TestServersrc/Novolis.Testing.TestServer/
Frank.DataStorage.AbstractionsNovolis.Storage.Abstractionssrc/Novolis.Storage.Abstractions/
Frank.DataStorage.Core(do not port)—
Frank.DataStorage (meta)(do not port)—
Frank.DataStorage.JsonNovolis.Storage.Jsonsrc/Novolis.Storage.Json/
Frank.DataStorage.SqliteNovolis.Storage.Sqlitesrc/Novolis.Storage.Sqlite/
Frank.Security.Cryptography (generation)Novolis.Security.Secretssrc/Novolis.Security.Secrets/
Frank.Security.Cryptography (hashing)Novolis.Security.PasswordHashingsrc/Novolis.Security.PasswordHashing/
Frank.Security.Cryptography (string AES)Novolis.Security.Encryptionsrc/Novolis.Security.Encryption/
Frank.Security.HaveIBeenPwnedNovolis.Security.HaveIBeenPwnedsrc/Novolis.Security.HaveIBeenPwned/
Frank.Security.ResourcesNovolis.Security.WordLists (internal)src/Novolis.Security.WordLists/
Frank.ReflectionNovolis.CodeGen.Reflectionsrc/Novolis.CodeGen.Reflection/
Frank.Reflection.DumpNovolis.CodeGen.Reflection.Dumpsrc/Novolis.CodeGen.Reflection.Dump/
Frank.Reflection.MermaidNovolis.CodeGen.Reflection.ClassDiagramsrc/Novolis.CodeGen.Reflection.ClassDiagram/
(greenfield)Novolis.CodeGen.Xmlnovolis-codegen/src/Novolis.CodeGen.Xml/
(greenfield)Novolis.CodeGen.Xsdnovolis-codegen/src/Novolis.CodeGen.Xsd/
Frank.Analyzers.AutoMapperNovolis.Analyzers.AutoMappersrc/Novolis.Analyzers.AutoMapper/
Frank.Analyzers.CodeLengthNovolis.Analyzers.CodeLengthsrc/Novolis.Analyzers.CodeLength/
Frank.TemplatesNovolis.Templatessrc/Novolis.Templates/ (PackageType=Template)
Frank.GameEngine.Primitives/SubPrimitivesNovolis.Math.Arrayssrc/Novolis.Math.Arrays/
Frank.GameEngine.Primitives (geometry subset)Novolis.Math.Geometrysrc/Novolis.Math.Geometry/
Frank.ML.Foundation.CoreNovolis.MachineLearning.Coresrc/Novolis.MachineLearning.Core/
Frank.ML.Foundation.Neural.AbstractionsNovolis.MachineLearning.Neural.Abstractionssrc/Novolis.MachineLearning.Neural.Abstractions/
Frank.ML.Foundation.Neural.ImplementationNovolis.MachineLearning.Neuralsrc/Novolis.MachineLearning.Neural/
Frank.ML.Foundation.AutoMlNovolis.MachineLearning.AutoMlsrc/Novolis.MachineLearning.AutoMl/
Frank.ML.Domain.Racing (sim)Novolis.Simulation.Racingnovolis-simulation/src/Novolis.Simulation.Racing/
Frank.ML.Domain.Racing (ML glue)(dogfood app) NeuralRacingnovolis-dogfooding/apps/NeuralRacing/
Frank.WireFishNovolis.Transports.WireFishsrc/Novolis.Transports.WireFish/
Frank.MarkdownNovolis.Markup.Markdownsrc/Novolis.Markup.Markdown/
Frank.MermaidNovolis.Markup.Mermaidsrc/Novolis.Markup.Mermaid/
Frank.UblSharp (+ Generation)Novolis.Xsd.Generatornovolis-xsd/src/Novolis.Xsd.Generator/
Frank.UblSharp (runtime)Novolis.Xsd.Ublnovolis-xsd/src/Novolis.Xsd.Ubl/
Frank.UblSharp.ValidationNovolis.Xsd.Ubl.Validationnovolis-xsd/src/Novolis.Xsd.Ubl.Validation/
Frank.Libraries.SBDHNovolis.Xsd.Peppolnovolis-xsd/src/Novolis.Xsd.Peppol/
Frank.Finance.Documents.Ubl(regen under Ubl; do not vendor tree)novolis-xsd
Frank.XsdCodeGeneration(reference only; do not ship)—

Facet decisions:

  • Messaging DI: facet name `Channels`, not DependencyInjection.
  • Testing output helpers: `Novolis.Testing.TUnit` — extensions on TUnit TestContext (naming.md: TUnit only, no xUnit).
  • Bedrock: drop “BedrockSlim”; use `Tcp` segment.
  • Storage: explicit packages only; no meta Novolis.Storage umbrella in wave 3.

Namespace and assembly rules

RuleConvention
Root namespaceMatches PackageId (e.g. Novolis.Messaging.Channels)
Internal typesNovolis.<Domain>.Internal (e.g. Novolis.Messaging.Internal)
Test namespacesPer-facet: Novolis.Messaging.Channels.Tests, Novolis.Messaging.Tests, etc. (unchanged; folder is tests/Novolis.Messaging.Unit/Channels/)
Test projectsOne per solution: Novolis.<Domain>.Unit (TUnit). Do not add Novolis.<Domain>.<Facet>.Tests unless required (analyzers, golden/integration, template payloads).
Assembly nameDefault = PackageId
Legacy Frank.*Must not appear in production Novolis code

Public API vocabulary (PulseFlow — keep Frank terms)

FrankNovolisDecision
IPulseIPulseKeep (product term)
IConduitIConduitKeep
IFlowIFlowKeep
Nexus / PulseNexusInternal onlyNovolis.Messaging.Internal
AddPulseFlow()AddPulseFlow()Keep in Novolis.Messaging
Product docs“PulseFlow”OK in README; package ID is Novolis.Messaging

Public API vocabulary (Tcp / Bedrock)

FrankNovolis
IConnectionProcessorKeep
UseTcpConnectionHandler<T> etc.Align with Novolis.Transports.Tcp.Server namespace

Frank.* dependency removal (P0)

Former depReplacement
Frank.Channels.DependencyInjectionNovolis.Messaging.Channels project reference
Frank.Reflection / Frank.Reflection.DumpNovolis.CodeGen.Reflection / Novolis.CodeGen.Reflection.Dump (TUnit references Dump package)
Frank.Testing.*Novolis.Testing.* package references
Frank.DataStorage.Abstractions → Reflection packageRemove unused package reference

.novolis/packages.json templates

novolis-messaging

{
  "packages": {
    "Novolis.Messaging.Channels": {
      "project": "src/Novolis.Messaging.Channels/Novolis.Messaging.Channels.csproj",
      "paths": [
        "src/Novolis.Messaging.Channels/**",
        "tests/Novolis.Messaging.Channels.Tests/**",
        "Directory.Build.props",
        "Directory.Packages.props",
        "global.json",
        "Novolis.Messaging.slnx"
      ]
    },
    "Novolis.Messaging": {
      "project": "src/Novolis.Messaging/Novolis.Messaging.csproj",
      "paths": [
        "src/Novolis.Messaging/**",
        "tests/Novolis.Messaging.Tests/**",
        "Directory.Build.props",
        "Directory.Packages.props",
        "global.json",
        "Novolis.Messaging.slnx"
      ]
    }
  }
}

novolis-testing

Entries: Novolis.Testing.TUnit, .Logging, .TestBases, .Testcontainers, .TestServer — each with matching src/ + tests/ paths and shared build files.

novolis-transports

Entries: Novolis.Transports.Tcp.Server, .Tcp.Client, .Http, .Http.Abstractions, .Http.Authentication, .Http.Extensions, .WireFish.

novolis-storage (wave 3)

Entries: Novolis.Storage.Abstractions, .Json, .Sqlite.

novolis-security (wave 4)

Entries: Novolis.Security.Secrets, .PasswordHashing, .Encryption, .HaveIBeenPwned.

novolis-codegen (wave 5)

Entries: Novolis.CodeGen.Reflection, .Reflection.Dump, .Reflection.ClassDiagram, .Xml, .Xsd.

novolis-analyzers (wave 5)

Entries: Novolis.Analyzers.AutoMapper, .CodeLength.

novolis-templates (wave 6)

Entry: Novolis.Templates — paths include src/Novolis.Templates/content/**, Novolis.Templates.slnx.

novolis-markup (wave 10)

Entries: Novolis.Markup.Markdown, Novolis.Markup.Mermaid.

novolis-commands

Entries: Novolis.Commands.Abstractions, Novolis.Commands.Engine, Novolis.Commands.Queueing, Novolis.Commands.DependencyInjection, Novolis.Commands.Testing — v0 0.1.0-preview.1.

Solution and dependency graph

RepoSolutionPackage references
novolis-messagingNovolis.Messaging.slnxNovolis.Messaging → Novolis.Messaging.Channels
novolis-testingNovolis.Testing.slnxFacets independent; tests may reference multiple facets
novolis-transportsNovolis.Transports.slnxHttp facets → Abstractions; Tcp Server/Client independent
novolis-storageNovolis.Storage.slnxJson/Sqlite → Abstractions
novolis-securityNovolis.Security.slnxIndependent facets
novolis-codegenNovolis.CodeGen.slnxDump/Mermaid → Reflection
novolis-analyzersNovolis.Analyzers.slnxIndependent analyzer packages
novolis-testingNovolis.Testing.slnxNovolis.Testing.TUnit → Novolis.CodeGen.Reflection.Dump
novolis-mathNovolis.Math.slnxGeometry independent; Arrays has no deps
novolis-machinelearningNovolis.MachineLearning.slnxNeural → Abstractions; Core independent
novolis-markupNovolis.Markup.slnxMarkdown and Mermaid independent
novolis-commandsNovolis.Commands.slnxEngine/Queueing/Testing/DI → Abstractions; DI → Engine + Queueing

Namespace replacement table (automation)

Use scripts/migrate-frank-slice.ps1 with these replacements (longest match first):

FromTo
Frank.Templates.TestContainerTemplateNovolis.Templates.TestContainerTemplate
Frank.Templates.NoXaml.SolutionNovolis.Templates.NoXaml.Solution
Frank.Templates.NoXaml.AppNovolis.Templates.NoXaml.App
Frank.Templates.SemanticKernelNovolis.Templates.SemanticKernel
Frank.Templates.GitHubSolutionNovolis.Templates.GitHubSolution
Frank.Templates.MicroserviceNovolis.Templates.Microservice
Frank.Templates.MonoGameNovolis.Templates.MonoGame
Frank.TemplatesNovolis.Templates
Frank.Reflection.MermaidNovolis.CodeGen.Reflection.ClassDiagram
Frank.Reflection.DumpNovolis.CodeGen.Reflection.Dump
Frank.ReflectionNovolis.CodeGen.Reflection
Frank.Analyzers.AutoMapperNovolis.Analyzers.AutoMapper
Frank.Analyzers.CodeLengthNovolis.Analyzers.CodeLength
Frank.Channels.DependencyInjectionNovolis.Messaging.Channels
Frank.PulseFlow.InternalNovolis.Messaging.Internal
Frank.PulseFlowNovolis.Messaging
Frank.Testing.TestOutputExtensionsNovolis.Testing.TUnit
Frank.Testing.TestBasesNovolis.Testing.TestBases
Frank.Testing.TestcontainersNovolis.Testing.Testcontainers
Frank.Testing.TestServerNovolis.Testing.TestServer
Frank.Testing.LoggingNovolis.Testing.Logging
Frank.TestingNovolis.Testing
Frank.BedrockSlim.ServerNovolis.Transports.Tcp.Server
Frank.BedrockSlim.ClientNovolis.Transports.Tcp.Client
Frank.BedrockSlimNovolis.Transports.Tcp
Frank.Http.AbstractionsNovolis.Transports.Http.Abstractions
Frank.Http.AuthenticationNovolis.Transports.Http.Authentication
Frank.Http.ExtensionsNovolis.Transports.Http.Extensions
Frank.HttpNovolis.Transports.Http
Frank.DataStorage.AbstractionsNovolis.Storage.Abstractions
Frank.DataStorage.JsonNovolis.Storage.Json
Frank.DataStorage.SqliteNovolis.Storage.Sqlite
Frank.DataStorageNovolis.Storage
Frank.Security.HaveIBeenPwnedNovolis.Security.HaveIBeenPwned
Frank.Security.CryptographyNovolis.Security.Secrets / .PasswordHashing / .Encryption
Frank.SecurityNovolis.Security
Frank.ML.Foundation.Neural.ImplementationNovolis.MachineLearning.Neural
Frank.ML.Foundation.Neural.AbstractionsNovolis.MachineLearning.Neural.Abstractions
Frank.ML.Foundation.CoreNovolis.MachineLearning.Core
Frank.GameEngine.Primitives.SubPrimitivesNovolis.Math.Arrays
Frank.GameEngine.PrimitivesNovolis.Math.Geometry
Frank.MarkdownNovolis.Markup.Markdown
Frank.MermaidNovolis.Markup.Mermaid

Preview versioning

PackageFirst preview
Novolis.Messaging.Channels0.1.0-preview.1
Novolis.Messaging0.1.0-preview.1
Other P0 facets0.1.0-preview.1 unless noted in wave brief

Migration publish gate (not org bootstrap)

First migration trusted-publish validation: `Novolis-Platform/novolis-messaging`, workflow release.yml, environment nuget.org, package `Novolis.Messaging.Channels` 0.1.0-preview.1.

novolis-smoketest remains org bootstrap / template CI only.