refactor: rename the library to FirstClassErrors - #3
Merged
Conversation
…Errors Rename the product, root namespace, package id, assemblies, projects, folders, solution and documentation from DiagnosableExceptions to FirstClassErrors, to reflect the library's error-centric identity. - Namespace/package/project/folder/solution renames DiagnosableExceptions -> FirstClassErrors. - The base exception TYPE `DiagnosableException` is intentionally kept (it is still, literally, a diagnosable exception); its subtypes are unaffected. - The GitHub repository slug and its URLs (diagnosable-exceptions) and the image asset filenames are left unchanged: they are external identities to rename separately. BREAKING CHANGE: the root namespace and the NuGet package id change from DiagnosableExceptions to FirstClassErrors. Consumers must update their `using` directives and package reference accordingly. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0193U5BYKQDbnJq7EbKMbBfw
Update PackageProjectUrl, RepositoryUrl and the NuGet readme link from github.com/Reefact/diagnosable-exceptions to github.com/Reefact/first-class-errors, to match the renamed GitHub repository. Image asset paths are left unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0193U5BYKQDbnJq7EbKMbBfw
Reefact
pushed a commit
that referenced
this pull request
Jul 15, 2026
The suite had 100% line and branch coverage yet a real bug (#3) had slipped through — because coverage proves a line RUNS, not that a behaviour is ASSERTED. A mutation hunt across every binder source file, each candidate verified empirically in an isolated worktree (apply the mutation, build, run the suite: did it still pass?), surfaced ten behaviours that were executed but never asserted. Close every one: - optional reference / optional value, present-but-invalid: pin the code (REQUEST_ARGUMENT_INVALID, not just "a failure") and the wrapped cause; - a null element in the middle of a complex list must not short-circuit collect-all — the failing elements after it are still collected; - the cross-binder ownership guard is now asserted on ALL three Get overloads (only RequiredField was covered; OptionalReference/OptionalValue were not); - the selector resolver unwraps EVERY stacked Convert node, not just the outer; - the binder-owned errors' public/detailed/diagnostic messages are pinned (short summary, and the argument path named in the detailed and diagnostic text). Verified: re-applying all ten mutations makes at least one test fail (10/10 killed); binder coverage stays 100% line and branch (54 tests). Refs: #126
Reefact
pushed a commit
that referenced
this pull request
Jul 15, 2026
The suite had 100% line and branch coverage yet a real bug (#3) had slipped through — because coverage proves a line RUNS, not that a behaviour is ASSERTED. A mutation hunt across every binder source file, each candidate verified empirically in an isolated worktree (apply the mutation, build, run the suite: did it still pass?), surfaced ten behaviours that were executed but never asserted. Close every one: - optional reference / optional value, present-but-invalid: pin the code (REQUEST_ARGUMENT_INVALID, not just "a failure") and the wrapped cause; - a null element in the middle of a complex list must not short-circuit collect-all — the failing elements after it are still collected; - the cross-binder ownership guard is now asserted on ALL three Get overloads (only RequiredField was covered; OptionalReference/OptionalValue were not); - the selector resolver unwraps EVERY stacked Convert node, not just the outer; - the binder-owned errors' public/detailed/diagnostic messages are pinned (short summary, and the argument path named in the detailed and diagnostic text). Verified: re-applying all ten mutations makes at least one test fail (10/10 killed); binder coverage stays 100% line and branch (54 tests). Refs: #126
Reefact
pushed a commit
that referenced
this pull request
Jul 16, 2026
The suite had 100% line and branch coverage yet a real bug (#3) had slipped through — because coverage proves a line RUNS, not that a behaviour is ASSERTED. A mutation hunt across every binder source file, each candidate verified empirically in an isolated worktree (apply the mutation, build, run the suite: did it still pass?), surfaced ten behaviours that were executed but never asserted. Close every one: - optional reference / optional value, present-but-invalid: pin the code (REQUEST_ARGUMENT_INVALID, not just "a failure") and the wrapped cause; - a null element in the middle of a complex list must not short-circuit collect-all — the failing elements after it are still collected; - the cross-binder ownership guard is now asserted on ALL three Get overloads (only RequiredField was covered; OptionalReference/OptionalValue were not); - the selector resolver unwraps EVERY stacked Convert node, not just the outer; - the binder-owned errors' public/detailed/diagnostic messages are pinned (short summary, and the argument path named in the detailed and diagnostic text). Verified: re-applying all ten mutations makes at least one test fail (10/10 killed); binder coverage stays 100% line and branch (54 tests). Refs: #126
Reefact
pushed a commit
that referenced
this pull request
Jul 16, 2026
The suite had 100% line and branch coverage yet a real bug (#3) had slipped through — because coverage proves a line RUNS, not that a behaviour is ASSERTED. A mutation hunt across every binder source file, each candidate verified empirically in an isolated worktree (apply the mutation, build, run the suite: did it still pass?), surfaced ten behaviours that were executed but never asserted. Close every one: - optional reference / optional value, present-but-invalid: pin the code (REQUEST_ARGUMENT_INVALID, not just "a failure") and the wrapped cause; - a null element in the middle of a complex list must not short-circuit collect-all — the failing elements after it are still collected; - the cross-binder ownership guard is now asserted on ALL three Get overloads (only RequiredField was covered; OptionalReference/OptionalValue were not); - the selector resolver unwraps EVERY stacked Convert node, not just the outer; - the binder-owned errors' public/detailed/diagnostic messages are pinned (short summary, and the argument path named in the detailed and diagnostic text). Verified: re-applying all ten mutations makes at least one test fail (10/10 killed); binder coverage stays 100% line and branch (54 tests). Refs: #126
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
Renames the library from DiagnosableExceptions to FirstClassErrors, to reflect its error-centric identity (the error is the model; exceptions and
Outcomeare just transports). This is follow-up work on top of the already-merged review (#1) and comparison-page (#2) PRs.Changes
PackageId, assemblies, projects, folders, solution (FirstClassErrors.sln+.sln.DotSettings) and all documentation fromDiagnosableExceptionstoFirstClassErrors.usingdirectives, project references andInternalsVisibleToare updated accordingly.DiagnosableException(it is still, literally, a diagnosable exception → nowFirstClassErrors.DiagnosableException); its subtypes are unaffected.PackageProjectUrl,RepositoryUrl, NuGet readme link) updated togithub.laiyagushi.com/Reefact/first-class-errorsto match the renamed repository. Image asset filenames are left unchanged.Breaking change
The root namespace and the NuGet package id change from
DiagnosableExceptionstoFirstClassErrors. Consumers must update theirusingdirectives and package reference.Verification
The rename was verified statically (no residual
DiagnosableExceptionstoken,.sln/.csproj/references consistent), but not compiled in this environment — please rundotnet build+ the test suite locally to confirm.🤖 Generated with Claude Code
Generated by Claude Code