Changelog
This page records issues discovered and resolved while hardening the library. All entries are fully resolved — none represent open bugs. The detailed engineering notes for each fix live in docs/known-issues/ (mirrors the GitHub bug-report template; kept as a developer reference).
Core DI
| ID | Summary | Severity |
|---|---|---|
| 001 | Open-generic pipeline behavior registrations throw at runtime under Native AOT when TResponse is a value type | High |
| 002 | ValidateOnBuild = false does not suppress the issue-001 runtime error | Medium |
| 004 | AddValidator registers a validator that is never wired into the pipeline — validation silently never runs | High |
| 015 | EnableCqrsBoundaryEnforcement() was an [Obsolete] no-op; runtime-API callers silently lost all enforcement | High |
| 019 | Behavior dedup compared (ServiceType, ImplementationType) only — lifetime-blind, skipped factory/instance registrations | Medium |
Source Generator
| ID | Summary | Severity |
|---|---|---|
| 005 | Generator emits an uncompilable type name for nested handler/behavior classes (drops enclosing-type chain) | High |
| 006 | Open-generic behavior closed with the interface's arity, not the class's own → CS0305 | High |
| 012 | GlobalizeType emits invalid global:: prefix for tuple / pointer / function-pointer types | Medium |
| 017 | SplitTopLevelArgs ignored tuple () — a tuple nested as a generic argument emitted uncompilable code | Medium |
| 022 | [Validator] derived the response type from the first IRequest<T> found; multi-IRequest requests now emit diagnostic MDG011 | Low |
| 024 | Open-generic behavior special constraints (class/struct/unmanaged/notnull/new()) were dropped, closing the behavior over non-conforming handlers → uncompilable code (CS0453); now captured as equatable flags and enforced in the cross-product | High |
| 025 | Generated RegisterGroup namespace was derived from the assembly name, ignoring MSBuild RootNamespace; it now reads build_property.RootNamespace first (and a new [RegisterGroup] partial class lets users pick the namespace/name explicitly) | Medium |
Pipeline & CQRS
| ID | Summary | Severity |
|---|---|---|
| 008 | Cross-assembly open-generic behavior is registered (and runs) twice — no dedup on the user-behavior path | High |
| 009 | Order is only a generator-local sort; runtime order follows DI registration across sources | Medium |
| 013 | Invoker overloads resolve handlers inconsistently (static TRequest vs runtime request.GetType()) | Medium |
| 016 | CQRS boundary marker leaked when a handler threw — spurious violation on later send in the same scope | Medium |
| 018 | CQRS enforcement was emitted per-discovered-handler only — manually registered handlers were not covered | Medium |
| 021 | EventDispatcher re-sorted behaviors via OrderBy on every publish (per-publish allocation) | Low |
Outbox
| ID | Summary | Severity |
|---|---|---|
| 010 | Outbox event lookup narrowed to ReferenceEquals — broke the public contract for equal-but-distinct events | Medium |
| 014 | Outbox lookup matched the first value-equal event across all scopes; stored items now carry a stable Guid identity via OutboxEntry | High |
| 020 | Outbox "failed count" counted retrying events (Attempts > 0), tripping the health check on transient retries | Medium |
| 023 | RecordOutbox* metric methods were dead no-ops on ISynapseMetrics (superseded by observable gauges); removed | Low |
Observability
| ID | Summary | Severity |
|---|---|---|
| 007 | Outbox observable gauges are never registered; Record* are no-ops so outbox metrics emit nothing | High |
| 011 | Tracing capture stores zero/invalid trace IDs (empty-string guard never fires) and stringifies twice | Medium |
ASP.NET Core
| ID | Summary | Severity |
|---|---|---|
| 003 | Pipeline short-circuit via Result.Failure<T>() mapped to HTTP 500; behavior now returns a typed UnauthorizedFailure → 401 | Medium |
Discovery context: Issues 001–003 were found while building the pipeline-behavior showcase in
examples/MinimalApion branchfeature/typed-pipeline-behaviorsagainst .NET 10 withPublishAot=true. Issues 004–023 were found in successive high-effort code reviews of the same branch (diff + working-tree, multiple finder angles). All are resolved. Line numbers in the individual files are approximate and may drift as the branch evolves.