Review all docs, diagrams, skill, and comments for the v2.0 release#125
Merged
Conversation
There is no WPF package in v2 — binding works off the core TypeConverters — so a NuGet package-layout diagram must not draw it. The utility group now spans the full bottom row: EfCore, Configuration, FsCheck. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
testing.md is the single source of truth for testing conventions, but the two suites v2 added — StrongTypes.Configuration.Tests (+ NullableDisabled) and StrongTypes.Wpf.Tests — were missing. Also generalize the analyzer "both directions" rule, which was worded for reference-gated analyzers only and did not fit ST0004. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CoverageLines: 4810 / 6297 (76.4%) Branches: 2514 / 3288 (76.5%) Files changed in this PR
StrongTypes — lines 92.6% (1942/2098), branches 87.8% (1245/1418)Booleans — lines 100.0% (14/14), branches 84.6% (22/26)
Collections — lines 90.2% (276/306), branches 85.1% (114/134)
ComponentModel — lines 89.5% (17/19), branches 68.8% (11/16)
Digits — lines 97.7% (85/87), branches 93.8% (30/32)
Emails — lines 97.4% (74/76), branches 95.7% (44/46)
Enums — lines 100.0% (58/58), branches 95.5% (21/22)
Exceptions — lines 78.9% (15/19), branches 50.0% (7/14)
Intervals — lines 96.5% (382/396), branches 95.5% (231/242)
Maybe — lines 92.1% (151/164), branches 83.9% (94/112)
Nullables — lines 100.0% (12/12), branches 83.3% (20/24)
Numbers — lines 100.0% (84/84), branches 94.4% (17/18)
Result — lines 98.5% (333/338), branches 95.6% (417/436)
Strings — lines 84.7% (133/157), branches 84.4% (54/64)
generated — lines 83.7% (308/368), branches 70.3% (163/232)
StrongTypes.Analyzers — lines 92.4% (514/556), branches 83.8% (238/284)(root) — lines 92.4% (514/556), branches 83.8% (238/284)
StrongTypes.Api — lines 97.3% (391/402), branches 86.3% (88/102)(root) — lines 100.0% (11/11), branches n/a (0/0)
Controllers — lines 97.0% (226/233), branches 86.3% (88/102)
Data — lines 100.0% (102/102), branches n/a (0/0)
Entities — lines 85.2% (23/27), branches n/a (0/0)
Models — lines 100.0% (29/29), branches n/a (0/0)
StrongTypes.AspNetCore — lines 89.3% (151/169), branches 84.5% (71/84)(root) — lines 89.3% (151/169), branches 84.5% (71/84)
StrongTypes.AspNetCore.TestApi — lines 90.7% (39/43), branches 92.5% (37/40)(root) — lines 100.0% (6/6), branches n/a (0/0)
Controllers — lines 89.2% (33/37), branches 92.5% (37/40)
StrongTypes.Configuration — lines 97.5% (79/81), branches 83.3% (40/48)(root) — lines 97.5% (79/81), branches 83.3% (40/48)
StrongTypes.Configuration.Tests.NullableDisabled — lines 100.0% (3/3), branches n/a (0/0)(root) — lines 100.0% (3/3), branches n/a (0/0)
StrongTypes.EfCore — lines 95.4% (227/238), branches 81.2% (78/96)(root) — lines 95.4% (227/238), branches 81.2% (78/96)
StrongTypes.FsCheck — lines 81.9% (127/155), branches 100.0% (2/2)(root) — lines 81.9% (127/155), branches 100.0% (2/2)
StrongTypes.OpenApi.Core — lines 91.4% (447/489), branches 83.4% (297/356)(root) — lines 91.9% (262/285), branches 86.1% (167/194)
Inlining — lines 90.7% (185/204), branches 80.2% (130/162)
StrongTypes.OpenApi.Microsoft — lines 38.1% (450/1180), branches 41.2% (177/430)(root) — lines 94.6% (246/260), branches 74.6% (97/130)
Binding — lines 98.1% (103/105), branches 78.6% (55/70)
Collections — lines 100.0% (19/19), branches 100.0% (8/8)
Digits — lines 100.0% (11/11), branches 100.0% (2/2)
Emails — lines 100.0% (11/11), branches 100.0% (2/2)
Inlining — lines 100.0% (7/7), branches 50.0% (1/2)
Intervals — lines 100.0% (24/24), branches 100.0% (6/6)
Maybe — lines 100.0% (12/12), branches 100.0% (2/2)
Numbers — lines 100.0% (8/8), branches 100.0% (2/2)
Strings — lines 100.0% (9/9), branches 100.0% (2/2)
obj/Debug/net10.0/Microsoft.AspNetCore.OpenApi.SourceGenerators/Microsoft.AspNetCore.OpenApi.SourceGenerators.XmlCommentGenerator — lines 0.0% (0/714), branches 0.0% (0/204)
StrongTypes.OpenApi.Swashbuckle — lines 94.7% (266/281), branches 79.1% (174/220)(root) — lines 98.7% (77/78), branches 93.4% (71/76)
Binding — lines 88.3% (106/120), branches 64.3% (72/112)
Collections — lines 100.0% (6/6), branches 100.0% (4/4)
Digits — lines 100.0% (10/10), branches 100.0% (4/4)
Emails — lines 100.0% (10/10), branches 100.0% (4/4)
Inlining — lines 100.0% (2/2), branches n/a (0/0)
Intervals — lines 100.0% (26/26), branches 100.0% (8/8)
Maybe — lines 100.0% (13/13), branches 75.0% (3/4)
Numbers — lines 100.0% (8/8), branches 100.0% (4/4)
Strings — lines 100.0% (8/8), branches 100.0% (4/4)
StrongTypes.OpenApi.TestApi.Microsoft — lines 41.0% (163/398), branches 31.6% (65/206)(root) — lines 100.0% (14/14), branches 100.0% (2/2)
obj/Debug/net10.0/Microsoft.AspNetCore.OpenApi.SourceGenerators/Microsoft.AspNetCore.OpenApi.SourceGenerators.XmlCommentGenerator — lines 38.8% (149/384), branches 30.9% (63/204)
StrongTypes.OpenApi.TestApi.Shared — lines 0.0% (0/193), branches n/a (0/0)(root) — lines 0.0% (0/193), branches n/a (0/0)
StrongTypes.OpenApi.TestApi.Swashbuckle — lines 100.0% (11/11), branches 100.0% (2/2)(root) — lines 100.0% (11/11), branches 100.0% (2/2)
|
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #125 +/- ##
==========================================
+ Coverage 85.33% 85.36% +0.02%
==========================================
Files 171 171
Lines 4842 4831 -11
Branches 992 992
==========================================
- Hits 4132 4124 -8
+ Misses 481 478 -3
Partials 229 229
🚀 New features to boost your workflow:
|
Apply the comment rule from CLAUDE.md across every project: XML docs keep only caller-facing contract, // comments keep only invariant markers, TODOs, and workaround pointers. Multi-paragraph summaries and mechanism narration are cut to the one sentence a future reader cannot recover from the code; name-restating docs are deleted. Comment lines only — no code, string literals, attributes, or directives changed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Verified every doc claim against the source. The real errors: two non-compiling readme snippets (CompareTo == string, assignment to a type name), an Interval row contradicted by the code (both endpoints may be null), and 'every type ships a TypeConverter / JSON converter' over-claims (TypeConverters sit on the scalar wrappers only; Digit and Result have no JSON converter). Stale content: CLAUDE.md still described the finished _Old migration, a nonexistent Try/ slice, and a pre-converter StrongTypes.Api; testing.md pointed at a Generators.cs location that would make a contributor duplicate the shipped class and missed the third OpenAPI suite subclass; the FsCheck/OpenApi package readmes omitted shipped generators and the Email/Digit schemas; the AspNetCore package description advertised a Maybe<T> binder that does not exist. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Six snippets did not compile in a consumer project (a nonexistent EnumExtensions<TEnum> pair, implicit int->Positive conversions, PartitionMatch named args, a variable named 'await', SafeMin misread as MinBy, ordering operators claimed against string). Behavioral fixes: JSON null yields a null reference rather than throwing, ToResult carries an ArgumentNullException instead of throwing, Swashbuckle's OpenAPI version knob lives on UseSwagger, Distinct has no comparer overload, and the TypeConverter claim is scoped to the scalar wrappers. Email was a shipped validated wrapper with no catalog row and no reference file — both added. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
KaliCZ
commented
Jul 16, 2026
Comment on lines
+61
to
+67
| success: ok => Save(ok), | ||
| error: bad => Log(bad)); | ||
|
|
||
| // Projection fold — returns R[] | ||
| R[] merged = results.PartitionMatch( | ||
| successes: ok => Summarise(ok), | ||
| errors: bad => Describe(bad)); | ||
| success: ok => Summarise(ok), | ||
| error: bad => Describe(bad)); |
Owner
Author
There was a problem hiding this comment.
These should actually be successes and errors. MAke sure the methods does this.
| `string` — no `.Value` needed for `==`, `!=`, `<`, `<=`, `>`, `>=`. | ||
| - Equality operators against `NonEmptyString` *and* `string` — no `.Value` | ||
| needed for `==` / `!=`. The ordering operators (`<`, `<=`, `>`, `>=`) are | ||
| wrapper-vs-wrapper only; against a `string` use `CompareTo(string)`. |
Owner
Author
There was a problem hiding this comment.
You don't need to explain implementation. You just need to make sure we say what is possible, so that the model can use it
Comment on lines
+109
to
+110
| var a = 3.ToPositive(); | ||
| var b = 5.ToPositive(); |
Owner
Author
There was a problem hiding this comment.
In these examples, using the types actually helps understand what the value is. Readers cannot just know that the result will be Positive.
…e types The PartitionMatch callbacks receive whole partitions, so the parameters are now successes/errors — the skill snippet had the right names and the method was what needed fixing. Applied the other two review principles across the skill: examples declare result types a reader cannot infer (no var over generic-closing factories), and capability bullets say what is possible instead of narrating limitations. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
Full pre-release review after #123 merged: every markdown doc, diagram, and skill file verified against the source, plus a repo-wide comment sweep applying the CLAUDE.md comment rule.
Package-layout diagram
The diagram still drew a WPF card (an "APP SURFACE" group left over from the deleted
Kalicz.StrongTypes.Wpfpackage). There is no WPF package in v2, so a NuGet package-layout diagram must not draw it. The utility group now spans the full bottom row: EfCore, Configuration, FsCheck. Light + dark variants; the dead.cta-textstyles went with the CTA.Doc accuracy (every claim checked against source)
CompareTo(...) == "Alice"→== 0; assignment to a type name in theMapTrueexample); theInterval<T>table row claimed "one endpoint must be present" while the code allows fully unbounded; the "every type ships aTypeConverter/ JSON converter" claims are now scoped to reality (TypeConverters sit on the scalar wrappers;DigitandResulthave no JSON converter);Email/Digit/intervals added to the Packages-table core row;logger.Log→LogError; undeclaredrangevariable now declared._Oldmigration section described a migration that is finished (zero_Oldfiles remain), the folder-layout example cited a nonexistentTry/slice (nowMaybe//ToMaybe), the#nullable enableper-file rule predates<Nullable>enable</Nullable>in the csproj, and the StrongTypes.Api section still said "uses plain string, converters will be wired in later".src/StrongTypes.Tests/Generators.cs, which would make them duplicate the shippedStrongTypes.FsCheck/Generators.cs; the OpenAPI section missed the third suite subclass (MicrosoftOpenApi31DocumentTests) and three partial files. Plus the two new sections from the earlier commit (Configuration + WPF suites).Email, interval, andResultarbitraries; both OpenApi readmes omitted theEmailandDigitschemas; Configuration now mentions ST0004 and scopes the TypeConverter claim; the AspNetCore csproj description advertised aMaybe<T>model binder that does not exist.Skill accuracy
Six snippets would not compile in a consumer project (nonexistent
EnumExtensions<TEnum>API, implicitint→Positive<int>conversions, wrongPartitionMatchnamed args, a variable namedawait,SafeMinmisread as MinBy, ordering operators claimed againststring). Behavioral fixes: JSONnullyields a null reference (it does not throw),ToResult()carries anArgumentNullExceptionin the error branch, Swashbuckle's OpenAPI-version knob lives onUseSwagger,Distincthas no comparer overload.Emailhad no catalog row and no reference file — addedreferences/email.md(every line verified againstEmail.csand the schema painters).Comment sweep (194 files, +326 / −1992)
The CLAUDE.md comment rule applied to every project: XML docs keep only caller-facing contract,
//keeps only invariant markers / TODOs / workaround pointers; multi-paragraph summaries and mechanism narration cut to their one-sentence kernels; name-restating docs deleted. Mechanically verified comment-lines-only — no code, string literal, attribute, or directive changed anywhere. Two stale claims died in the process (a transformer doc describingrequired-set normalization no code performs; a binder remark claiming TypeConverter-based parsing where the binder usesIParsable).Verification
dotnet build StrongTypes.slnx— 0 warnings, 0 errors (warnings-as-errors, so XML well-formedness is proven)🤖 Generated with Claude Code