Skip to content

Release v4.0.0-preview-3 - #178

Merged
chullybun merged 3 commits into
mainfrom
v4.0.0-preview-3
Aug 4, 2026
Merged

Release v4.0.0-preview-3#178
chullybun merged 3 commits into
mainfrom
v4.0.0-preview-3

Conversation

@chullybun

Copy link
Copy Markdown
Collaborator

Summary

Publishes v4.0.0-preview-3. All milestone work is already on main; this branch adds a final documentation/instructions clarification pass and bumps Version.props to 4.0.0-preview-3 (commit 27d729f).

Milestone

v4.0.0-preview-3 milestone — 5/5 closed.

# Title Type
#171 Refactor QueryArgsConfig into reusable per-entity classes, add query AI-enablement docs PR (merged)
#172 feat: add CoreEx.Data.GraphQL (GraphQL-lite) query bridge PR (merged)
#173 Add omitted Shopping tests to CI filters PR (merged)
#174 Modernize ref-data querying, fix alias resolution, add coreex-graphql skill PR (merged)
#175 JsonElementStringConverter: non-generic IConverter overloads use swapped/wrong casts Issue (fixed by #177)

Two additional PRs merged into main in this same cycle, not tagged to the milestone but part of this release's scope:

Testing summary (AI-assisted validation)

Every PR in this cycle was built/validated through iterative AI-agent review before merge, not just a single pass — #172 in particular went through "several rounds of independent/automated review" that caught real bugs (culture-sensitive float parsing, silent long→int overflow, duplicate alias last-wins bugs, a pre-existing unrelated JsonFilter prefix-matching bug, etc.) before merge. Aggregate results reported across the individual PRs:

This branch's own change (27d729f)

Documentation/instruction clarifications discovered while doing the above AI-assisted work, folded back into the AI workflow assets so future sessions don't repeat the same mistakes:

  • Standardized GraphQL argument handling (args.GetIdentifier<TId>()) across samples/instructions.
  • Documented the named cancellationToken requirement for repository paging methods (prevents parameter-binding errors).
  • Clarified ref-data field naming (navigation property, not {Name}Code).
  • Added a CQRS read service/controller scaffolding gate requiring repository query methods first.
  • Warned against inventing CoreEx API member names; added a resolution order.
  • Bumped Version.props to 4.0.0-preview-3.

Co-authored-by: Copilot App 223556219+Copilot@users.noreply.github.com

- Standardized GraphQL argument handling with `args.GetIdentifier<TId>()` in all samples and instructions.
- Documented named `cancellationToken` requirement for repository paging methods to prevent parameter binding errors.
- Clarified reference data field naming: always use the contract's navigation property, not `{Name}Code`.
- Added CQRS read service/controller scaffolding gate to ensure repository query methods exist first.
- Warned against inventing CoreEx API member names; provided resolution order for correct usage.
- Updated AI skill catalog refresh guidance to require client restart after skill changes.
- Improved clarity and consistency across docs, quick-references, and workflows.
- Bumped version to `4.0.0-preview-3`.
Copilot AI review requested due to automatic review settings August 3, 2026 22:28

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Publishes v4.0.0-preview-3 by bumping the shared version and applying a final clarification pass across the CoreEx docs/AI guidance (GraphQL-lite usage, query/paging conventions, CQRS scaffolding gates, and docs-sync guardrails).

Changes:

  • Bump Version.props to 4.0.0-preview-3.
  • Clarify/query sample patterns (notably GraphQL-lite identifier handling and named cancellationToken for paging helpers).
  • Tighten AI skill/instruction guidance (CQRS read-service gating, ref-data field naming, “don’t invent API member names”, docs-sync restart reminder).

Reviewed changes

Copilot reviewed 21 out of 21 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
Version.props Version bump to 4.0.0-preview-3.
src/CoreEx.EntityFrameworkCore/AGENTS.md EF Core usage guide updates (CRUD + mapped model + paging/query sample).
src/CoreEx.Data/AGENTS.md Query/paging sample updated to include paging + named cancellationToken.
src/CoreEx.Data.GraphQL/README.md GraphQL-lite docs updated to use GetIdentifier<TId>() in AddGet.
src/CoreEx.Data.GraphQL/AGENTS.md GraphQL-lite AI usage guide aligned with GetIdentifier<TId>().
samples/docs/hosts-layer.md Sample host docs aligned with current GraphQL-lite root registration pattern.
docs/capabilities.md Capabilities docs aligned with current GraphQL-lite registration guidance.
.github/skills/coreex-repository/SKILL.md Repository skill clarifications (ref-data nav property naming; named cancellationToken).
.github/skills/coreex-repository/references/workflow.md Repository workflow guidance expanded (ref-data field rule; named cancellationToken).
.github/skills/coreex-graphql/SKILL.md GraphQL skill guidance tightened (identifier arg handling; usage rules).
.github/skills/coreex-graphql/references/workflow.md GraphQL workflow examples updated to GetIdentifier<TId>().
.github/skills/coreex-docs-sync/SKILL.md Docs-sync skill clarifies reporting + client restart when skill set changes.
.github/skills/coreex-docs-sync/README.md Docs-sync README adds restart note after skill add/remove/rename.
.github/skills/coreex-app-service/SKILL.md App-service skill adds CQRS gating: require repo query methods first.
.github/skills/coreex-app-service/references/workflow.md App-service workflow adds “stop-and-check” CQRS guidance.
.github/skills/coreex-api/SKILL.md API skill adds CQRS gating: create read service before read controllers.
.github/skills/coreex-api/references/workflow.md API workflow adds explicit “do not skip” read-service gate.
.github/instructions/coreex-repositories.instructions.md Repository instruction clarifications (named token; ref-data field naming; mapper call patterns).
.github/instructions/coreex-host-setup.instructions.md Host setup instructions updated for GraphQL-lite guidance.
.github/instructions/coreex-conventions.instructions.md Conventions expanded (named token guidance; “don’t invent member names” resolution order).
.github/copilot-instructions.md Adds CPM note about spike/reflection projects inside the repo tree.
Suppressed comments (1)

.github/skills/coreex-graphql/references/workflow.md:65

  • GetIdentifier validates presence and type (cast) but does not perform type conversion; the comment currently implies conversion.
 // GetIdentifier<TId> reads/converts the named argument (default "id") and throws an ArgumentException, mapped by the engine to ARGUMENT_ERROR, if missing/empty/wrong-typed.
 .AddGet<{Entity}>("{entity}", (args, ct) => CoreEx.ExecutionContext.GetRequiredService<I{Entity}ReadService>().GetAsync(args.GetIdentifier<string>(), ct));

Comment thread src/CoreEx.Data.GraphQL/README.md Outdated
Comment thread src/CoreEx.Data.GraphQL/AGENTS.md Outdated
Comment thread samples/docs/hosts-layer.md Outdated
Comment thread docs/capabilities.md Outdated
Comment thread .github/skills/coreex-graphql/references/workflow.md Outdated
Comment thread .github/skills/coreex-graphql/SKILL.md Outdated
Comment thread .github/instructions/coreex-host-setup.instructions.md Outdated
Comment thread src/CoreEx.EntityFrameworkCore/AGENTS.md Outdated
… sample type mismatch

- GetIdentifier<TId> validates presence/type (casts to TId); it does not convert between types. Corrected wording across README/AGENTS.md/docs/skills/instructions that implied conversion (8 occurrences).
- src/CoreEx.EntityFrameworkCore/AGENTS.md QueryAsync sample: return type ItemsResult<ProductLite> was inconsistent with ProductMapper.From.Map(m), which returns Product for an IBiDirectionMapper<Product, ProductModel>. Fixed return type to ItemsResult<Product> and added a note on projecting inline for a reduced Lite contract.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 3, 2026 22:36

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 21 out of 21 changed files in this pull request and generated no new comments.

…, and video-scope note

- Step 11: Add an Employee query endpoint via /coreex-api skill (paging, LastName EQ/StartsWith, Gender filter, LastName/FirstName/Id default ordering).
- Step 12: Add GraphQL query support via /coreex-graphql skill.
- Added 'Going further (optional)' divider after step 10 to distinguish the core walkthrough from these extensions.
- Added a grouped table of contents (setup / core walkthrough / going further / reference).
- Noted the walk-through video covers steps 1-10 only.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings August 4, 2026 00:02

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 22 out of 22 changed files in this pull request and generated no new comments.

Suppressed comments (2)

.github/skills/coreex-graphql/SKILL.md:54

  • name = "id" is not valid C# named-argument syntax (it should be name: "id"). As written, this example won’t compile if someone copies it verbatim.
- Use `args.GetIdentifier<TId>(name = "id")` inside an `AddGet<T>` resolver to validate the identifier argument's presence and type (it casts to `TId`, it does not convert) — it throws an `ArgumentException` (mapped to `ARGUMENT_ERROR`) if missing/empty/wrong-typed. Do not reach for `args.TryGetValue(...)` directly — `GraphQLLiteArgs` is not a dictionary; use `args.Arguments.TryGetValue(...)` only for non-identifier arguments.

src/CoreEx.Data.GraphQL/README.md:92

  • This README correctly states that GetIdentifier<TId> casts (doesn’t convert). However, the API XML docs on GraphQLLiteArgs.GetIdentifier<TId> currently say it “converts”/“convertible”, which contradicts this guidance and can confuse consumers reading IntelliSense. Consider updating src/CoreEx.Data.GraphQL/GraphQLLiteArgs.cs to match the actual behavior (cast-only).
     // GetIdentifier<TId> validates the named argument (default "id") for presence and type (it casts to TId, it does not convert) and throws an ArgumentException - mapped by the engine to an ARGUMENT_ERROR GraphQL error - if
     // it is missing, empty, or the wrong type, instead of an unhandled KeyNotFoundException/NullReferenceException surfacing as an opaque EXECUTION_ERROR.
     .AddGet<Product>("product", (args, ct) => CoreEx.ExecutionContext.GetRequiredService<IProductReadService>().GetAsync(args.GetIdentifier<string>(), ct));

@chullybun
chullybun merged commit afe266c into main Aug 4, 2026
3 of 4 checks passed
@chullybun
chullybun deleted the v4.0.0-preview-3 branch August 4, 2026 14:46
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.

JsonElementStringConverter: non-generic IConverter overloads use swapped/wrong casts

2 participants