Skip to content

refactor: rename the library to FirstClassErrors - #3

Merged
Reefact merged 2 commits into
mainfrom
claude/code-review-docs-audit-a4948x
Jul 1, 2026
Merged

refactor: rename the library to FirstClassErrors#3
Reefact merged 2 commits into
mainfrom
claude/code-review-docs-audit-a4948x

Conversation

@Reefact

@Reefact Reefact commented Jul 1, 2026

Copy link
Copy Markdown
Owner

Summary

Renames the library from DiagnosableExceptions to FirstClassErrors, to reflect its error-centric identity (the error is the model; exceptions and Outcome are just transports). This is follow-up work on top of the already-merged review (#1) and comparison-page (#2) PRs.

Changes

  • Rename the product, root namespace, NuGet PackageId, assemblies, projects, folders, solution (FirstClassErrors.sln + .sln.DotSettings) and all documentation from DiagnosableExceptions to FirstClassErrors. using directives, project references and InternalsVisibleTo are updated accordingly.
  • Kept on purpose: the base exception type DiagnosableException (it is still, literally, a diagnosable exception → now FirstClassErrors.DiagnosableException); its subtypes are unaffected.
  • Repository URLs (PackageProjectUrl, RepositoryUrl, NuGet readme link) updated to github.com/Reefact/first-class-errors to match the renamed repository. Image asset filenames are left unchanged.

Breaking change

The root namespace and the NuGet package id change from DiagnosableExceptions to FirstClassErrors. Consumers must update their using directives and package reference.

Verification

The rename was verified statically (no residual DiagnosableExceptions token, .sln/.csproj/references consistent), but not compiled in this environment — please run dotnet build + the test suite locally to confirm.

🤖 Generated with Claude Code


Generated by Claude Code

claude added 2 commits July 1, 2026 14:42
…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
Reefact merged commit 56c5836 into main Jul 1, 2026
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
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