Skip to content

Cutover: consume JustDummies from NuGet and remove its source from this repository #404

Description

@Reefact

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions