Skip to content

Introduce the Dummies library and its dum release train#170

Merged
Reefact merged 7 commits into
mainfrom
claude/fce-testing-dummies-lib-l2jbu4
Jul 17, 2026
Merged

Introduce the Dummies library and its dum release train#170
Reefact merged 7 commits into
mainfrom
claude/fce-testing-dummies-lib-l2jbu4

Conversation

@Reefact

@Reefact Reefact commented Jul 17, 2026

Copy link
Copy Markdown
Owner

Summary

Introduces Dummies, a standalone library generating arbitrary yet valid test values through a fluent, constraint-carrying DSL (Any.String().StartingWith("ORD-").WithLength(12)), and wires its own independently-versioned dum release train so it can publish without riding the lib or cli trains.

Type of change

  • Bug fix
  • New feature
  • Breaking change
  • Refactoring
  • Analyzer / diagnostic change
  • Tests
  • Documentation
  • Build / CI / tooling

Changes

  • New Dummies project (netstandard2.0, zero dependencies, PackageId Dummies): IAny<out T> generators with parameterless Generate(), implicit conversions to string/int, and immutable constraint specifications.
  • First increment ships the Int32 and String verticals: values are built to satisfy the declared constraints in one draw (no generate-then-retry), and contradictory constraints fail at declaration time with a ConflictingAnyConstraintException naming both sides (e.g. WithLength(3) vs StartingWith("ORD-")).
  • Composition toward domain types without reflection: .As(factory) bridges a constrained primitive to a value object through its own factory; Any.Combine(...) assembles parts through constructor lambdas; factory failures wrap into AnyGenerationException carrying the replay seed.
  • Seedable randomness: ambient AsyncLocal context with Any.Reproducibly(...) (reports the seed on failure, replays it on demand) plus an isolated Any.WithSeed(seed) context.
  • 82 unit tests: generation, conflict detection (including the flagship conflicting chains), seed reproducibility, implicit conversions, generic inference through IAny<T>, value-object showcases, and an architecture test asserting Dummies references no FirstClassErrors assembly.
  • dum release train, per the AddingAReleaseTrain runbook: row in tools/trains.sh, release.yml tag trigger/dispatch/version resolution, pack.sh branch with a fail-closed standalone guard (the packed nuspec must declare no FirstClassErrors dependency), dry-run rehearsal of pack and notes, changelog.yml option, dummies commit scope, pre-created Dummies/CHANGELOG.md.
  • Maintainer docs updated (train tables in AddingAReleaseTrain EN/FR, ReleaseDryRun EN/FR, changelog workflow pages EN/FR) and train enumerations refreshed in the tooling's comments and usage strings.
  • Merged main back in: kept the new GenDoc major-bump release gate, and renumbered the Dummies ADR to ADR-0011 after main took ADR-0010 for the GenDoc catalog contract.

Testing

  • dotnet build FirstClassErrors.sln
  • dotnet test FirstClassErrors.sln
  • Analyzer tests pass (FirstClassErrors.Analyzers.UnitTests)

Also run locally: tools/packaging/pack.sh 0.0.0-dry.2 dum (SBOM embedded and asserted; standalone guard passes, and empirically fails closed on an unreadable package) and tools/packaging/release-notes.sh dum dum-v0.0.0 HEAD (lists only dummies-scoped commits; the lib train's notes exclude them).

Documentation

  • Public API / error documentation updated (XML docs on the whole public surface; package README.nuget.md)
  • README / doc/ updated (maintainer docs: AddingAReleaseTrain EN/FR, ReleaseDryRun EN/FR, changelog workflow pages EN/FR)
  • French translation (doc/handwritten/for-users/README.fr.md) updated if user-facing behavior changed — not applicable: no FirstClassErrors user-facing behavior changes; the Dummies user guide is deferred until the V1 surface stabilizes (ADR-0011 follow-up)
  • No documentation change required

Architecture decisions

  • No architectural decision in this pull request
  • New decision recorded — ADR drafted as Proposed: ADR-0011 (host Dummies as a standalone package in this repository, hard no-reference boundary toward FirstClassErrors, guarded by an architecture test)
  • Supersedes an existing ADR — successor proposed, status not flipped: ADR-____
  • ⚠️ Conflicts with an existing ADR — flagged for the maintainer: ADR-____

Related issues

None.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UhPrBqngpiSwdsF4DWvNPw

claude added 7 commits July 17, 2026 13:17
The Dummies library joins the repository as its own component; its
commits need a scope of their own in the closed list enforced by the
shared linter and documented in CONTRIBUTING.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UhPrBqngpiSwdsF4DWvNPw
Dummies generates arbitrary yet valid test values through a fluent DSL
of typed, immutable generators (IAny<T>): constraints express the
invariants a value must satisfy, values are built to satisfy them in
one draw (no generate-then-retry), and contradictory constraints fail
at declaration time with a ConflictingAnyConstraintException naming
both sides. This first increment ships the Int32 and String verticals,
composition toward domain types (As, Combine), implicit conversions,
and a seedable ambient random context (Reproducibly, WithSeed).

The project is deliberately standalone: it references no
FirstClassErrors project, and an architecture test guards that
boundary. Not yet wired to any release train.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UhPrBqngpiSwdsF4DWvNPw
Records the decision (Proposed) to ship Dummies as its own NuGet
package hosted in this repository, with a hard no-reference boundary
toward FirstClassErrors guarded by an architecture test, and lists the
triggers that would justify extracting it to a dedicated repository.
Realizes the extraction follow-up anticipated by ADR-0006.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UhPrBqngpiSwdsF4DWvNPw
Give Dummies its own independently-versioned release train (tag prefix
dum-v*), following the AddingAReleaseTrain runbook: one data row in
tools/trains.sh, the static edits in release.yml (tag trigger, dispatch
choice, version resolution), a dum branch in pack.sh with a standalone
guard asserting the packed nuspec declares no FirstClassErrors
dependency, dry-run rehearsal of the new train's pack and notes, the
changelog dispatch option, the maintainer-doc train tables, and a
pre-created Dummies/CHANGELOG.md.

Verified locally: release-notes partition lists only dummies-scoped
commits on the dum train, and pack.sh 0.0.0-dry.1 dum packs with the
SBOM embedded and the standalone guard passing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UhPrBqngpiSwdsF4DWvNPw
Conflict resolutions:
- .github/workflows/release.yml: keep main's new GenDoc major-bump
  release gate alongside this branch's dum-aware pack comment.
- doc/handwritten/for-maintainers/adr/README.md: keep ADR-0009 as
  Accepted and ADR-0010 (GenDoc catalog contract) from main; the
  Dummies ADR proposed by this branch is renumbered to ADR-0011 to
  resolve the number collision (files renamed, index and pack.sh
  references updated accordingly).
Follow-ups surfaced by a completeness sweep of the new train:
- pack.sh: make the dum standalone guard fail closed — an unmatched
  glob or unreadable nuspec now errors instead of passing as ok,
  matching the cli guard's shape.
- changelog.yml, release-notes.sh, collect-prs.sh: refresh the train
  enumerations in comments and usage strings for the third train (and
  heal the lib rows that predated the binder joining that train).
- workflows/changelog docs (en/fr): add the dum row to the train
  tables.
- CLAUDE.md: add the dummies scope to the closed scope list.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UhPrBqngpiSwdsF4DWvNPw
The architecture test enumerated the exact BCL facades the Debug build
happened to reference; the CI Release build also references
System.Threading.Thread, failing the allowlist. The facade split varies
with the SDK and build configuration and carries no boundary meaning:
assert the intent instead — every reference must be netstandard,
mscorlib, or System.* — which still rejects any FirstClassErrors or
third-party dependency.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UhPrBqngpiSwdsF4DWvNPw
@Reefact
Reefact merged commit 22d161b into main Jul 17, 2026
13 checks passed
@Reefact
Reefact deleted the claude/fce-testing-dummies-lib-l2jbu4 branch July 17, 2026 13:44
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.

2 participants