Skip to content

Rename kernel ring to Fallout.Core, fix onion review findings, and remove the Nuke.* shims#1

Closed
ChrisonSimtian wants to merge 7 commits into
refactor/onion-architecturefrom
refactor/kernel-to-core
Closed

Rename kernel ring to Fallout.Core, fix onion review findings, and remove the Nuke.* shims#1
ChrisonSimtian wants to merge 7 commits into
refactor/onion-architecturefrom
refactor/kernel-to-core

Conversation

@ChrisonSimtian

Copy link
Copy Markdown
Owner

Stacks on refactor/onion-architecture (the onion re-layering). This branch renames the kernel ring, fixes the findings from a full code review of the onion work, and removes the now-untenable Nuke.* transition shims. Base is set to the onion branch so the diff is just the 7 commits below.

⚠️ Breaking change

Public namespaces and package IDs change (Fallout.Kernel*Fallout.Core*, deepened sub-namespaces), and the Nuke.* transition shims are removed. This is a deliberate one-time break — the onion re-layering is too deep to shim honestly. NUKE consumers migrate via fallout-migrate; a fuller migration helper is the queued follow-up. Belongs on the experimental line, batched to the yearly major (ADR-0004).

What's here (7 commits)

Commit Scope
Rename onion kernel ring Fallout.KernelFallout.Core + align sub-namespaces rename + review #4
Fix dead using Fallout.Common.Tooling in the starter build template review #1
Repoint GenerateTools/References at Fallout.Application.Tools review #2
Extend the architecture fitness gate to every ring review #3
Remove dead framework conditionals left after the net472 drop cleanup
Remove the Nuke.* transition shims — migration is a hard break, not a shim shim removal
Tidy up the fitness tests + Domain README review nits

Kernel ring → Fallout.Core

  • Fallout.Kernel* renamed to Fallout.Core* across projects, assemblies, package IDs, namespaces, .slnx.
  • Sub-project namespaces deepened so namespace = project (review Add project-scoped skill for restructuring PR commit history #4): Fallout.Core.Text.Json, Fallout.Core.IO.Compression, Fallout.Core.IO.Globbing.
  • Reuses the Fallout.Core name freed when the old domain ring became Fallout.Domain — documented with a naming note in CHANGELOG.md / ADR-0006.

Shims removed

A code review showed the namespace deepening had already silently broken the shim path for glob/compression extension methods and the GlobbingCaseSensitivity enum. A half-working shim that compiles then fails at the edges is worse than none, so the whole shim layer is gone: src/Shims/*, the TransitionShimGenerator, the shim tests + Nuke.Consumer sentinel, and the .slnx entries. NukeNamespaceMap and the Fallout.Migrate CLI are kept — the migrate path still needs them.

Tests

dotnet build fallout.slnx green; full suite 461 passed / 0 failed / 7 skipped. Architecture fitness now guards Domain + Core + Application(+Components) + Infrastructure rings, each with a non-vacuous-scan precondition.

Follow-up (not in this PR)

Build the real migration helper in fallout-migrate (namespace/package moves a prefix-swap can't do) once the rearchitecture lands — the sanctioned consumer path now that shims are gone.

Test drive

Check out refactor/kernel-to-core and run ./build.sh (or ./build.ps1) — it carries the full onion stack plus these changes.

🤖 Generated with Claude Code

ChrisonSimtian and others added 7 commits June 13, 2026 00:33
…-namespaces

Renames the shared kernel ring projects/assemblies/package IDs Fallout.Kernel*
to Fallout.Core*, and deepens each sub-project's namespace to match its project
(review finding #4): Fallout.Core.Text.Json, Fallout.Core.IO.Compression, and
Fallout.Core.IO.Globbing (were flat Fallout.Kernel / Fallout.Kernel.IO).

Updates all consumer usings, fallout.slnx, the strongly-typed-solution Verify
snapshot, and reconciles CHANGELOG / ADR-0006 / spike-0003 (stranded "Kernel"
prose -> "Core", plus a naming note that the kernel ring reuses the Fallout.Core
name freed by the earlier Fallout.Core -> Fallout.Domain domain rename).

Build green; 463 passed / 0 failed / 7 skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The `:setup` scaffold's Configuration.cs imported `Fallout.Common.Tooling`, a
namespace that no longer exists since the onion realignment dissolved the
Fallout.Common catch-all — so a freshly-scaffolded consumer build failed to
compile. `Enumeration` and `TypeConverter<T>` now live in
`Fallout.Application.Tooling`; repoint the using there.

The template is shipped as an EmbeddedResource (not compiled in-repo), so the
solution build can't catch this; verified by compiling the emitted
Configuration.cs against the Fallout.Application.Tooling assembly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…view #2)

The GenerateTools and References targets still pointed SpecificationsDirectory at
the dissolved `src/Fallout.Common/Tools` and stamped the dead
`Fallout.Common.Tools.*` namespace, so regenerating tool wrappers was broken and
would have emitted wrong namespaces.

- SpecificationsDirectory -> `src/Fallout.Application.Tools` (where the tool specs moved).
- namespaceProvider -> `Fallout.Application.Tools.{Name}` (matches existing generated output).
- Add a shared `SpecificationFiles` list (the `<Tool>/<Tool>.json` glob) that excludes
  obj/bin build-output JSON, now that the spec directory is the project root rather than a
  dedicated Tools folder. `References` consumes it via the file-list overload instead of
  `Directory.GetFiles(..., TopDirectoryOnly)`, which never matched the subdir specs.

Verified: build/_build.csproj compiles; the selection resolves 61 tool specs, excludes the
2 obj artifacts, and the emitted namespace matches the committed generated files.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The fitness suite only guarded the Domain ring plus a single Application-ring
assertion that omitted Fallout.Application.Components, and there were no guards
for the Core (kernel) or Infrastructure rings. Adds:

- Fallout.Application.Components to the Application ⊥ Infrastructure test (and an
  explicit Fallout.Application.Solutions reference — it was only transitive before).
- CoreRingFitnessTests: the Core kernel ring must not depend on
  Application/Infrastructure/Cli (the kernel-side counterpart to the Domain test).
- InfrastructureRingFitnessTests: the Infrastructure ring must not depend on the
  Fallout.Cli composition root (it may still depend inward).
- Domain test now also forbids Fallout.Core and Fallout.Cli.

The Architecture.Tests csproj now references every ring assembly, since an
unreferenced assembly is silently dropped from the scan.

Architecture.Tests 1 -> 3 tests; full suite 465 passed / 0 failed / 7 skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
With net472 gone, two net10.0-only projects carried unreachable preprocessor
branches:

- ContextAwareTask.cs (Fallout.MSBuildTasks, net10.0-only): the net472 #else paths
  were already removed; this also drops the now-always-true `#if NETCOREAPP` guard
  around `using System.Runtime.Loader;`.
- NuGetToolPathResolver.cs (Fallout.Infrastructure.Tooling, net10.0-only): drops the
  dead `#if !NETSTANDARD2_0`/`#else` split, keeping the EnumerationOptions-based path.

No behavior change (the surviving branch is the one that already compiled on net10.0).
Live netstandard2.0 conditionals in Fallout.Core and the vendored
Fallout.Persistence.Solution are intentionally untouched. Full suite 465/0/7.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… shim

The onion re-layering + namespace deepening (ADR-0006) moves types across rings
and deepens namespaces in ways a re-export shim cannot honestly mirror — a code
review showed the deepening had already silently broken the shim path for
glob/compression extension methods and the GlobbingCaseSensitivity enum. A
half-working shim that compiles and then fails at the edges is worse than none,
so the shim layer is removed and the migration is treated as a deliberate,
one-time break (a fuller migration helper in fallout-migrate is the follow-up).

Removed:
- src/Shims/{Nuke.Common,Nuke.Components} shim projects (+ leftover Nuke.Build)
- src/Fallout.SourceGenerators/TransitionShimGenerator.cs (the shim generator)
- tests/{Nuke.Common,Nuke.Components}.Shim.Tests, tests/Consumers/Nuke.Consumer
- TransitionShimGeneratorTest + its Verify snapshots
- the corresponding fallout.slnx entries

Kept: src/Shared/NukeNamespaceMap.cs and the whole Fallout.Migrate(.Analyzers)
CLI — the migrate path still needs the map.

Docs/pipeline updated to match (AGENTS.md, repository-layout, from-nuke guide,
roadmap, release.yml); historical ADRs/spikes and the transient rebrand-plan
left as-is. Regenerated the strongly-typed-solution snapshot (5 Nuke.* accessors
dropped). Build green; full suite 460 passed / 0 failed / 7 skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sweeps the small findings from the code review:

- Extract a shared `RingFitness.AssertNoDependencyOn` helper for the three ring
  tests (was `FailingTypes` duplicated verbatim 4×). The helper also folds in a
  non-empty-scan precondition: a NetArchTest rule over an empty type set reports
  success, so a stale namespace filter (e.g. after a rename) would silently turn a
  guard into a no-op — now it fails loudly instead.
- Drop the legacy pre-realignment names from the Core and Domain forbidden lists.
  Those namespaces no longer exist (dead weight), and "Fallout.Build" specifically
  false-positives against the real, allowed `Fallout.Build.Shared` project
  (NetArchTest matches by namespace-segment prefix). Keep only the live outer-ring
  guards.
- Add a `Fitness_scan_is_not_vacuous` guard to the Domain tests (same vacuity
  concern; its two rules share the `Fallout` filter).
- Fix src/Fallout.Domain/README.md: it was titled `# Fallout.Core` and referenced
  `Fallout.Build` — both stale (Fallout.Core is now the live kernel ring;
  Fallout.Build is now Fallout.Application).

Full suite 461 passed / 0 failed / 7 skipped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ChrisonSimtian
ChrisonSimtian deleted the refactor/kernel-to-core branch June 13, 2026 00:37
ChrisonSimtian added a commit that referenced this pull request Jul 12, 2026
…t creation

Contributors weren't consistently labelling PRs, so release notes fell through to 'Other Changes'.

- .github/release.yml: document the label taxonomy inline (header + per-label blurbs on what
  each is for). It already drives auto-generated release notes; now it's also the canonical
  reference for which label to apply.
- issue-and-pr-style.md: add a label-at-creation rule next to the raise-in-draft rule.
- release-and-versioning.md: add a changelog-category-label step to the PR-creation flow.
- AGENTS.md: rule #1 now names the category label + points at release.yml.

So AI applies the matching changelog-category label whenever it raises a PR on the user's behalf.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ChrisonSimtian pushed a commit that referenced this pull request Jul 19, 2026
When working from a personal fork (origin) alongside the core repo
(upstream), branch from a stale origin/main instead of upstream/main and
open the PR against the wrong repo — both happened in practice and produced
a large, spurious merge conflict.

Add a step 0 to the PR-creation flow in release-and-versioning.md:
detect the fork/upstream remote setup via `git remote -v`, branch from
upstream/main, push new branches to origin, and open PRs against upstream.

Also restate the pre-existing draft-by-default rule (already documented in
issue-and-pr-style.md) directly in this flow, since it's the doc AGENTS.md
rule #1 points to at PR-creation time and the flag was dropped once already.

Point AGENTS.md rule #1 at both additions.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant