Introduce the Dummies library and its dum release train#170
Merged
Conversation
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
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.
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-versioneddumrelease train so it can publish without riding theliborclitrains.Type of change
Changes
Dummiesproject (netstandard2.0, zero dependencies,PackageIdDummies):IAny<out T>generators with parameterlessGenerate(), implicit conversions tostring/int, and immutable constraint specifications.Int32andStringverticals: values are built to satisfy the declared constraints in one draw (no generate-then-retry), and contradictory constraints fail at declaration time with aConflictingAnyConstraintExceptionnaming both sides (e.g.WithLength(3)vsStartingWith("ORD-"))..As(factory)bridges a constrained primitive to a value object through its own factory;Any.Combine(...)assembles parts through constructor lambdas; factory failures wrap intoAnyGenerationExceptioncarrying the replay seed.AsyncLocalcontext withAny.Reproducibly(...)(reports the seed on failure, replays it on demand) plus an isolatedAny.WithSeed(seed)context.IAny<T>, value-object showcases, and an architecture test assertingDummiesreferences noFirstClassErrorsassembly.dumrelease train, per theAddingAReleaseTrainrunbook: row intools/trains.sh,release.ymltag trigger/dispatch/version resolution,pack.shbranch with a fail-closed standalone guard (the packed nuspec must declare noFirstClassErrorsdependency), dry-run rehearsal of pack and notes,changelog.ymloption,dummiescommit scope, pre-createdDummies/CHANGELOG.md.AddingAReleaseTrainEN/FR,ReleaseDryRunEN/FR, changelog workflow pages EN/FR) and train enumerations refreshed in the tooling's comments and usage strings.mainback in: kept the new GenDoc major-bump release gate, and renumbered the Dummies ADR to ADR-0011 aftermaintook ADR-0010 for the GenDoc catalog contract.Testing
dotnet build FirstClassErrors.slndotnet test FirstClassErrors.slnFirstClassErrors.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) andtools/packaging/release-notes.sh dum dum-v0.0.0 HEAD(lists onlydummies-scoped commits; thelibtrain's notes exclude them).Documentation
README.nuget.md)doc/updated (maintainer docs:AddingAReleaseTrainEN/FR,ReleaseDryRunEN/FR, changelog workflow pages EN/FR)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)Architecture decisions
Proposed: ADR-0011 (host Dummies as a standalone package in this repository, hard no-reference boundary toward FirstClassErrors, guarded by an architecture test)Related issues
None.
🤖 Generated with Claude Code
https://claude.ai/code/session_01UhPrBqngpiSwdsF4DWvNPw