Follow-up to #229, and the executable half of ADR-0069 (proposed in #403).
JustDummies now lives in Reefact/just-dummies, extracted with git filter-repo at fbf523b86acebdd34ba0bbfd437683864be3cb9c. Nothing was removed from this repository by that extraction — this issue is the removal, and it is deliberately blocked until a package exists.
Prerequisite — the one thing that unblocks everything
A restorable JustDummies package on nuget.org. It does not exist yet: the package has never been published, and Reefact/just-dummies cannot publish until its trusted-publishing policy is configured (owner Reefact, repo just-dummies, workflow release.yml, no environment, one policy per package ID, plus the NUGET_USER secret — full procedure in doc/handwritten/for-maintainers/migration/nuget-trusted-publishing.md over there).
Do not start this work before that version exists. Replacing a ProjectReference with a PackageReference to an unpublished version fails dotnet restore with NU1102 for every contributor and every CI run.
Record the version here when it lands: JustDummies X.Y.Z = _______
Why this cannot be split into small commits
FirstClassErrors.Testing does not merely reference JustDummies — it ships it. It carries a private ProjectReference plus the IncludeJustDummiesInPackage target that embeds JustDummies.dll inside the package's own lib/, with PrivateAssets="all" suppressing the <dependency> entry. Removing the project reference without removing the embedding produces a package that silently ships nothing; removing the embedding without adding the package reference produces one that resolves nothing. They move together, in one pull request.
The cutover, in the order that keeps the build green
Deleting the directories first turns every other step into a broken-build debugging session. Do them in this order.
1. Declare the version
Directory.Packages.props — add, alphabetically:
<PackageVersion Include="JustDummies" Version="X.Y.Z" />
2. Swap the four library references
| File |
Line |
Today |
FirstClassErrors.Testing/FirstClassErrors.Testing.csproj |
62 |
<ProjectReference Include="..\JustDummies\JustDummies.csproj" PrivateAssets="all" /> |
FirstClassErrors.UnitTests/FirstClassErrors.UnitTests.csproj |
34 |
<ProjectReference Include="..\JustDummies\JustDummies.csproj" /> |
FirstClassErrors.RequestBinder.UnitTests/FirstClassErrors.RequestBinder.UnitTests.csproj |
31 |
idem |
FirstClassErrors.Testing.UnitTests/FirstClassErrors.Testing.UnitTests.csproj |
28 |
idem |
Each becomes <PackageReference Include="JustDummies" />. On FirstClassErrors.Testing, drop PrivateAssets="all" — the package should declare an honest JustDummies dependency now.
3. Drop the analyzer plumbing
The analyzers ship inside the library package under analyzers/dotnet/cs, so the PackageReference above delivers them on its own. Delete the five OutputItemType="Analyzer" ReferenceOutputAssembly="false" PrivateAssets="all" ProjectReferences on JustDummies.Analyzers (FirstClassErrors.Testing.csproj:67, FirstClassErrors.UnitTests:39, FirstClassErrors.RequestBinder.UnitTests:36, FirstClassErrors.Testing.UnitTests:33, and any other consumer added since). ADR-0061 still holds — the analyzers keep running on this repository's code, they just arrive from NuGet.
4. Delete the embedding workaround
FirstClassErrors.Testing/FirstClassErrors.Testing.csproj, lines ~73–84: the TargetsForTfmSpecificBuildOutput hook and the whole IncludeJustDummiesInPackage target.
5. Unwire the dum train and the JustDummies CI
FirstClassErrors.sln — remove the 7 JustDummies.* projects (and their GlobalSection(NestedProjects) rows)
tools/trains.sh — the dum|dum-v|justdummies|… row
tools/packaging/pack.sh — the dum) scope arm and its standalone guard
.github/workflows/release.yml — the dum-v*.*.* tag trigger, the dum choice option, the dum-v*) case arm and lib|cli|dum) validation
.github/workflows/release-dryrun.yml — the pack.sh … dum and release-notes.sh dum calls
.github/workflows/changelog.yml — the dum choice option and its comment row
tools/commit-lint/lint-commit-message.sh — the justdummies scope in SCOPES and SCOPES_HUMAN
build/stryker/justdummies.json, justdummies-analyzers.json, justdummies-xunit.json
.github/workflows/justdummies.yml, .github/workflows/justdummies-mutation.yml
.gitignore — the tools/justdummies-check/ block
6. Delete the source, last
The 7 JustDummies*/ directories and tools/justdummies-check/, once nothing above references them.
7. Move the documentation that follows the code
Delete here what is now owned by the other repository: WritingJustDummiesTests.{en,fr}.md, specifications/justdummies-tool.{md,fr.md}, workflows/justdummies-mutation.{en,fr}.md, audit/2026-07-20-dummies-architecture-and-design-audit.{md,fr.md}, the 56 for-users/analyzers/JD0*.{en,fr}.md pages, and the JustDummies ADRs (0013, 0015, 0020, 0025, 0030–0033, 0035–0042, 0044, 0045, 0047–0054, 0058, 0059, 0063–0066).
Keep, and do not treat as leftovers:
- ADR-0011 and ADR-0022 — they bind both products and exist in both repositories
- ADR-0026, ADR-0061, ADR-0006 — their subject is this repository;
FirstClassErrors.Testing's history is unreadable without them
doc/handwritten/for-users/ArbitraryTestValues.{en,fr}.md — it documents this repository's testing package; give it a link to the new repository
Fix the resulting dangling links in the ADR index and in for-users/analyzers/README.md.
8. Verify
dotnet build FirstClassErrors.sln -c Release then dotnet test FirstClassErrors.sln -c Release, and check the produced FirstClassErrors.Testing package actually declares <dependency id="JustDummies" version="X.Y.Z" /> and no longer carries lib/netstandard2.0/JustDummies.dll.
What this fixes for consumers
Today FirstClassErrors.Testing carries a copy of JustDummies.dll with no dependency entry, so a consumer who also references JustDummies directly can end up with two copies at different versions and no diagnostic. After the cutover NuGet resolves one assembly and the version is visible and reviewable.
Constraint that outlives this issue
Commit messages in Reefact/just-dummies older than 2026-07-31 cite issue and pull-request numbers of this repository, and nothing there can be renumbered. Those references must keep resolving: close issues here, never delete them.
Follow-up to #229, and the executable half of ADR-0069 (proposed in #403).
JustDummies now lives in
Reefact/just-dummies, extracted withgit filter-repoatfbf523b86acebdd34ba0bbfd437683864be3cb9c. Nothing was removed from this repository by that extraction — this issue is the removal, and it is deliberately blocked until a package exists.Prerequisite — the one thing that unblocks everything
A restorable
JustDummiespackage on nuget.org. It does not exist yet: the package has never been published, andReefact/just-dummiescannot publish until its trusted-publishing policy is configured (ownerReefact, repojust-dummies, workflowrelease.yml, no environment, one policy per package ID, plus theNUGET_USERsecret — full procedure indoc/handwritten/for-maintainers/migration/nuget-trusted-publishing.mdover there).Do not start this work before that version exists. Replacing a
ProjectReferencewith aPackageReferenceto an unpublished version failsdotnet restorewith NU1102 for every contributor and every CI run.Record the version here when it lands:
JustDummiesX.Y.Z = _______Why this cannot be split into small commits
FirstClassErrors.Testingdoes not merely reference JustDummies — it ships it. It carries a privateProjectReferenceplus theIncludeJustDummiesInPackagetarget that embedsJustDummies.dllinside the package's ownlib/, withPrivateAssets="all"suppressing the<dependency>entry. Removing the project reference without removing the embedding produces a package that silently ships nothing; removing the embedding without adding the package reference produces one that resolves nothing. They move together, in one pull request.The cutover, in the order that keeps the build green
Deleting the directories first turns every other step into a broken-build debugging session. Do them in this order.
1. Declare the version
Directory.Packages.props— add, alphabetically:2. Swap the four library references
FirstClassErrors.Testing/FirstClassErrors.Testing.csproj<ProjectReference Include="..\JustDummies\JustDummies.csproj" PrivateAssets="all" />FirstClassErrors.UnitTests/FirstClassErrors.UnitTests.csproj<ProjectReference Include="..\JustDummies\JustDummies.csproj" />FirstClassErrors.RequestBinder.UnitTests/FirstClassErrors.RequestBinder.UnitTests.csprojFirstClassErrors.Testing.UnitTests/FirstClassErrors.Testing.UnitTests.csprojEach becomes
<PackageReference Include="JustDummies" />. OnFirstClassErrors.Testing, dropPrivateAssets="all"— the package should declare an honestJustDummiesdependency now.3. Drop the analyzer plumbing
The analyzers ship inside the library package under
analyzers/dotnet/cs, so thePackageReferenceabove delivers them on its own. Delete the fiveOutputItemType="Analyzer" ReferenceOutputAssembly="false" PrivateAssets="all"ProjectReferences onJustDummies.Analyzers(FirstClassErrors.Testing.csproj:67,FirstClassErrors.UnitTests:39,FirstClassErrors.RequestBinder.UnitTests:36,FirstClassErrors.Testing.UnitTests:33, and any other consumer added since). ADR-0061 still holds — the analyzers keep running on this repository's code, they just arrive from NuGet.4. Delete the embedding workaround
FirstClassErrors.Testing/FirstClassErrors.Testing.csproj, lines ~73–84: theTargetsForTfmSpecificBuildOutputhook and the wholeIncludeJustDummiesInPackagetarget.5. Unwire the
dumtrain and the JustDummies CIFirstClassErrors.sln— remove the 7JustDummies.*projects (and theirGlobalSection(NestedProjects)rows)tools/trains.sh— thedum|dum-v|justdummies|…rowtools/packaging/pack.sh— thedum)scope arm and its standalone guard.github/workflows/release.yml— thedum-v*.*.*tag trigger, thedumchoice option, thedum-v*)case arm andlib|cli|dum)validation.github/workflows/release-dryrun.yml— thepack.sh … dumandrelease-notes.sh dumcalls.github/workflows/changelog.yml— thedumchoice option and its comment rowtools/commit-lint/lint-commit-message.sh— thejustdummiesscope inSCOPESandSCOPES_HUMANbuild/stryker/justdummies.json,justdummies-analyzers.json,justdummies-xunit.json.github/workflows/justdummies.yml,.github/workflows/justdummies-mutation.yml.gitignore— thetools/justdummies-check/block6. Delete the source, last
The 7
JustDummies*/directories andtools/justdummies-check/, once nothing above references them.7. Move the documentation that follows the code
Delete here what is now owned by the other repository:
WritingJustDummiesTests.{en,fr}.md,specifications/justdummies-tool.{md,fr.md},workflows/justdummies-mutation.{en,fr}.md,audit/2026-07-20-dummies-architecture-and-design-audit.{md,fr.md}, the 56for-users/analyzers/JD0*.{en,fr}.mdpages, and the JustDummies ADRs (0013, 0015, 0020, 0025, 0030–0033, 0035–0042, 0044, 0045, 0047–0054, 0058, 0059, 0063–0066).Keep, and do not treat as leftovers:
FirstClassErrors.Testing's history is unreadable without themdoc/handwritten/for-users/ArbitraryTestValues.{en,fr}.md— it documents this repository's testing package; give it a link to the new repositoryFix the resulting dangling links in the ADR index and in
for-users/analyzers/README.md.8. Verify
dotnet build FirstClassErrors.sln -c Releasethendotnet test FirstClassErrors.sln -c Release, and check the producedFirstClassErrors.Testingpackage actually declares<dependency id="JustDummies" version="X.Y.Z" />and no longer carrieslib/netstandard2.0/JustDummies.dll.What this fixes for consumers
Today
FirstClassErrors.Testingcarries a copy ofJustDummies.dllwith no dependency entry, so a consumer who also referencesJustDummiesdirectly can end up with two copies at different versions and no diagnostic. After the cutover NuGet resolves one assembly and the version is visible and reviewable.Constraint that outlives this issue
Commit messages in
Reefact/just-dummiesolder than 2026-07-31 cite issue and pull-request numbers of this repository, and nothing there can be renumbered. Those references must keep resolving: close issues here, never delete them.