test(consumers): add NUKE + Fallout consumer compatibility sentinels#256
Merged
Conversation
Three small build-project consumers under tests/Consumers/ that exercise Fallout's current public surface from real downstream-user perspectives. These compile against THIS commit's API shape — so any future PR that breaks consumer-facing types/namespaces/attributes will conflict with the consumer code on rebase/merge, surfacing the breakage at PR-time. Projects: - tests/Consumers/Nuke.Consumer/ — pre-rename NUKE consumer using `class Build : NukeBuild`, `[Solution]`, `Target` via the Nuke.Common / Nuke.Build / Nuke.Components transition shims. Includes a documented `using Target = Fallout.Common.Target;` alias because the shim generator skips delegates by C# language limit (SHIM002). - tests/Consumers/Fallout.Consumer.Local/ — Fallout consumer using direct ProjectReferences to this repo's local source. Tracks HEAD; catches breakage of the in-repo Fallout surface. - tests/Consumers/Fallout.Consumer.NuGet/ — Fallout consumer against the last published packages (pinned to 11.0.8) with ReplacePackageReferences=false + central package management off, so PackageReferences actually resolve against nuget.org. Catches packaging issues + upgrade-direction breakage when bumped after a release. All three are in fallout.slnx — `dotnet build fallout.slnx` (the existing CI gate) validates them. Compile failure ⇒ a consumer-facing API broke. Runtime smoke tests not included: spawning the consumers via `dotnet run` fails because Fallout's FalloutBuild.cctor() requires the full Fallout.Common.props/targets environment (Host activation reflects for IsRunningHost property and throws on minimal consumers). Reproducing that environment is more setup than the test's marginal value justifies. README documents this and points at how to revisit if needed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5 tasks
This was referenced May 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Replaces #255 (closed — wrong stack ordering). This PR is based on main with the current pre-rename API shape baked into the consumer code. That makes it the breaking-change detector: any future PR that changes consumer-facing types/namespaces/attributes will conflict with the consumer code, and resolving the conflict IS the migration story.
Three consumer projects
All in `fallout.slnx` — `dotnet build fallout.slnx` is the CI gate.
The deliberate workflow
This works as designed only because the consumer code is frozen to a point-in-time API shape, not auto-regenerated to match new code. `tests/Consumers/README.md` documents the intent and warns against breaking that contract.
Runtime smoke tests deliberately excluded
`FalloutBuild.cctor()` enumerates `Host` subclasses and reflects for `IsRunningHost` — minimal consumers without the full Fallout.Common.props/targets environment throw `ArgumentException: Host type 'Host' defines no property 'IsRunningHost'` at activation. Reproducing the full build-app environment was meaningfully more setup than the runtime check's marginal value justified. Compile-time validation captures the breaking-change signal we actually need.
Test plan