Repository navigation
Description
Current baseline (reviewed on 2026-10-29)
The latest published stable release documented on main is 3.6.0; 3.6.1 is prepared but not yet published. The earlier "[3.6]" roadmap is historical and must not be treated as work still required for 3.6.0.
Already available on main:
- Source-generated registration and materializers for supported mutable/immutable, nested and component value-object shapes, profiles, safe column reordering and statically-known property converter types.
GeneratedParametersfor reflection-free strict-generated commands, including bounded Native AOT evidence.- A centralized Dapper TypeHandler compatibility boundary and runtime/generated precedence tests.
Closed baseline: #230 (generated converters/TypeHandler hardening) is completed/superseded. Its residual coverage validation belongs to #232, and remaining reflective TypeHandler/AOT investigation to #240. Do not reopen or depend on #230.
Objective
Close actual gaps in strict-generated execution without duplicating features already implemented, changing normal Dapper semantics, or claiming blanket Native AOT support.
Version policy: future compatible release, not 3.6.0 or the already prepared 3.6.1. Before feature work or package version edits, check the current published/prepared state and apply .agents/skills/semantic-versioning/SKILL.md. Recommend the next version from the real diff; do not auto-increment major or rewrite a prepared release's contract.
Delivery scope and order
| Order | Issue | Remaining deliverable | Prerequisite |
|---|---|---|---|
| 1 | #228 | Support statically-resolvable ConstructUsing(...) factory shapes in generated strict mode; retain deterministic rejection for unsupported delegates |
Current main baseline |
| 2 | #229 | Audit already-generated nested/value-object cases; close specifically proven strict-generation/null/shape/diagnostic gaps | #228 only where factory composition requires it |
| 3 | #231 | Source-generate strongly typed parameter binders without runtime parameter-object reflection | Current GeneratedParameters contract; may proceed independently of #229 |
| 4 | #232 | Certify supported/unsupported matrix, semantic parity, targeted provider/AOT coverage, performance and documentation; deliver single cumulative PR | #228, #229 and #231 completed |
No active delivery steps for #230; it is linked as completed evidence only.
Branch and PR policy
- First implementation task creates
roadmap/generated-coverage-followupsfrom the then-currentmain, after resolving the prepared 3.6.1 release boundary. - [Generated coverage] Support statically resolvable ConstructUsing factories in strict mode #228, [Generated coverage] Audit and close strict nested/value-object materialization gaps #229 and [Generated coverage] Add source-generated typed parameter binders for strict queries #231 commit and push sequentially to that branch (unless [Generated coverage] Add source-generated typed parameter binders for strict queries #231 is implemented separately and deliberately integrated before the final review); no intermediate PRs under the shared-branch strategy.
- [Generated coverage] Certify strict support matrix, compatibility and cumulative delivery #232 reviews the entire cumulative diff and opens one PR into
main. - The final PR references this roadmap and closes [Generated coverage] Support statically resolvable ConstructUsing factories in strict mode #228, [Generated coverage] Audit and close strict nested/value-object materialization gaps #229, [Generated coverage] Add source-generated typed parameter binders for strict queries #231, [Generated coverage] Certify strict support matrix, compatibility and cumulative delivery #232 and [Roadmap] Expand strict-generated coverage after FluentMap 3.6.1 #227 on merge. Do not include
Closes #230, which is already closed. - Do not assume a particular future version or tag until SemVer review; a PR merge does not by itself prove package publication.
Constraints
- Keep FluentMap a mapping/materialization layer over Dapper: no SQL generator, unit of work, change tracking, graph persistence or ORM expansion.
- Preserve source/binary and observable compatibility for a non-major release; review any breaking change explicitly rather than silently broadening scope.
- No silent reflection/dynamic-code fallback in strict-generated APIs.
- Preserve
GeneratedParametersand normal Dapper parameter binding; generated typed binders are additive. - Align generated/runtime semantics for compatible mapped shapes; unsupported cases must produce contextual, deterministic errors.
- Keep TypeHandler reflection/AOT limitations explicit in
COMPATIBILITY.mdand [3.8] Inventory reflection and dynamic-code boundaries for the AOT-safe subset #240. - Existing Continuous Benchmark roadmap [Roadmap] Add continuous benchmark history and performance observability #219–[Docs] Document continuous benchmark history and finalize the performance roadmap #223 is useful but not a blocker: use checked-in benchmarks/CI evidence until history is available.
Definition of Ready (DoR)
- Verify current published and prepared version, current
mainstate and passing baseline CI; follow semantic-versioning governance. - Inventory remaining unsupported strict-generated shapes against actual generator and tests, identifying which are intentional limitations.
- Verify existing
ConstructUsing, nested/value-object, converter, generated parameter and Native AOT smoke baselines. - Confirm that [Generated coverage] Support statically resolvable ConstructUsing factories in strict mode #228, [Generated coverage] Audit and close strict nested/value-object materialization gaps #229, [Generated coverage] Add source-generated typed parameter binders for strict queries #231 and [Generated coverage] Certify strict support matrix, compatibility and cumulative delivery #232 have compatible scope/DoR/DoD with no dependencies on [3.6] Generate property conversion paths and harden TypeHandler interoperability #230.
Acceptance criteria
- At least one statically analyzable explicit factory executes in strict-generated mode without runtime reflection.
- Existing nested/value-object generated shapes are preserved; any newly supported cases have parity, null and rejection evidence.
- A known typed parameter object binds in strict-generated mode without runtime reflection, while
GeneratedParametersremains supported. - Unsupported captures, member graphs, readers, parameter objects and conversion shapes fail deterministically without silent fallback.
- A machine-readable or documented support matrix distinguishes runtime, generated, strict and tested Native AOT support.
- No unjustified performance or public API regression.
Definition of Done (DoD)
- [Generated coverage] Support statically resolvable ConstructUsing factories in strict mode #228, [Generated coverage] Audit and close strict nested/value-object materialization gaps #229, [Generated coverage] Add source-generated typed parameter binders for strict queries #231 and [Generated coverage] Certify strict support matrix, compatibility and cumulative delivery #232 meet their revised DoDs; [3.6] Generate property conversion paths and harden TypeHandler interoperability #230 remains closed.
- Full generated/runtime test suite, relevant real providers, strict/AOT smoke, package/PublicAPI, CI, CodeQL and Sonar checks pass (or unrelated blockers are documented).
- Readme/usage/compatibility/migration/changelog EN/PT-BR and generated documentation, if affected, reflect actual behavior.
- One cumulative PR is merged to
main, with explicit evidence, SemVer rationale and closure links. - No release/version publication is claimed before the governed release workflow completes.
Traceability
Original plan and decisions: #230 (closed), #294 (closed), PR #298; residual Native AOT investigation: #240; performance history: #219–#223. This issue's prior 3.6 plan is superseded by the present scope.
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsIn Progress
Activity
rodri-oliveira-dev commentedon Oct 29, 2026
Roadmap reconciliation (2026-10-29)
#230 is already implemented/superseded on
mainand is being closed separately. The generated read-converter path, Dapper TypeHandler boundary, precedence regression tests and compatibility limitations have established implementations. Please do not treat #230 as a new implementation prerequisite.Remaining follow-ups were moved to #232 (generated coverage/equivalence) and #240 (reflection/Native AOT boundary).
The original execution plan and
3.6version references below are historical:3.6.0was published on 2026-10-13, and the reviewedmainprepares3.6.1. Before starting remaining work in #228, #229, #231 and #232, re-scope the roadmap for a future compatible release and update the cumulative PR/closure instructions accordingly. Do not recreate or require reopening #230.Evidence: #230 closure review, #294 / PR #298;
main026fbcd26c48af0298ec4776ca5ac1659a2d676f.[-][Roadmap] FluentMap 3.6: complete generated materialization coverage[/-][+][Roadmap] Expand strict-generated coverage after FluentMap 3.6.1[/+]