You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is the general-availability release of v4.0.0 — CoreEx's re-imagine/re-invention as an AI-augmented foundation for enterprise back-end services — superseding v4.0.0-preview-1 through v4.0.0-preview-5.
No upgrade path from v3.x. This is a major version with significant breaking changes; core capabilities and patterns remain largely consistent, but some v3 capabilities were dropped as legacy/unused/superseded, with the intention to re-add further capabilities in future releases as required.
Headline addition: CoreEx.Cosmos. Typed Azure Cosmos DB data access (CosmosDbContainer<TModel>/CosmosDbMappedContainer<TValue,TModel,TMapper>), a TransactionalBatch-based transactional outbox, and a Change Feed Processor-based outbox relay, demonstrated by the new Contoso.Customers sample. CoreEx.Cosmos publishes to NuGet alongside every other package in this release, but is flagged as preview-quality in its README/AGENTS.md — its API surface may still change in a future release without following strict semver until it stabilizes.
See CHANGELOG.md for the curated NuGet-facing summary of what's in v4.0.0.
Preview history
v4.0.0-preview-1 through preview-5 (2026-06-20 → 2026-08-22)
Database-layer review (outbox, EF Core concurrency/tenancy, error mapping), a full code-review hardening sweep across every package, Aspire AppHost template (#179-#183).
Version.props bumped to stable 4.0.0 (from preview versioning).
Removed the prerelease OpenTelemetry.Instrumentation.Process dependency that blocked a stable NuGet pack (NU5104) — no stable version exists, and its metrics are redundant with platform-native process monitoring.
Renamed the coreex-solution-scaffolder skill to coreex-scaffold for naming consistency across the coreex-* skill suite, and added the missing .claude/commands/*.md wrappers for full Claude Code / Copilot parity.
Synced AGENTS.md, .github/copilot-instructions.md, samples/README.md, samples/docs/*.md, and .github/agents/README.md with the CoreEx.Cosmos/Contoso.Customers additions from Introduce CoreEx.Cosmos: typed Cosmos DB data access, outbox, and Contoso.Customers sample #186 (missing package-table row, missing cosmos-emulator infra entry, stale per-package-guide count, undocumented Cosmos repository pattern, missing test-taxonomy row, etc.).
Fixed a stale root README.md table-of-contents (dead Version 4 (preview) link, Status entry pointed at the wrong anchor).
Added src\CoreEx.Cosmos to nuget-publish.ps1's ProjectsToPublish list (previously missing, which would have silently skipped it on release), and added a "preview, API surface may change" disclaimer to every doc that references the package (root README.md/AGENTS.md, CoreEx.Cosmos's own README.md/AGENTS.md, and the samples/docs/*.md cross-references) now that it ships alongside the rest of v4.0.0 instead of being held back.
Test plan
dotnet build CoreEx.sln -c Release — full solution build, 0 warnings/errors (TreatWarningsAsErrors is on).
dotnet test CoreEx.sln -c Release — full framework + sample test suite.
tools/validate-template-pack.ps1 — confirms CoreEx.Template scaffolds and builds cleanly across all parameter combinations after the skill rename and packaging changes.
Confirm generated NuGet package filenames reflect the stable 4.0.0 version (no -preview suffix), and that CoreEx.Cosmos is included in the nuget-publish.ps1 push alongside every other package.
CHANGELOG.md: add chullybun to key-contributor call-out (manual tweak).
README.md: remove dead 'Version 4 (preview)' TOC link (no matching heading) and fix 'Status' to point at the actual 'Build and Package Status' heading.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Eric Sibly <eric.sibly@avanade.com>
- Add src\CoreEx.Cosmos to nuget-publish.ps1's ProjectsToPublish list
- Replace 'not packaged' language with a preview/subject-to-change
disclaimer across README.md, AGENTS.md, CoreEx.Cosmos's own
README.md/AGENTS.md, and samples docs, since it now ships alongside
the rest of v4.0.0 instead of being held back
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Eric Sibly <eric.sibly@avanade.com>
Generate deliberately accepts and defaults its secondary data value to null, but the new data! suppresses that nullability at the Handlebars call site without documenting why the call is safe. Add a short explanation of Handlebars.Net's nullable contract (or use an API shape that preserves it) so the suppression does not hide a future nullability error.
Justify null-forgiving Root casts in helper registration
The new null-forgiving cast suppresses a possible missing Root entry without documenting the invariant. This repository requires justification for !; explain that Handlebars always supplies the root CodeGenContext here (or validate/cast it explicitly), and apply the same justification to the other two helper registrations.
Update catalog to report 15 L1 skills
.github/agents/README.md:123
This still reports 14 L1 skills, but the catalog now contains 15 (coreex-adapter through coreex-validator), and .github/coreex-ai-workflows.md already describes them as fifteen. Please update the count so the generated workflow documentation is consistent.
- Add missing CoreEx.Cosmos AGENTS.md to CoreEx.Template's AI doc bundle
and bump the per-package guide count from 17 to 18 throughout
.github/agents/README.md
- Fix validate-template-pack.ps1's FilesAbsent checks to assert against
the actual old skill path (.github/skills/coreex-solution-scaffolder)
instead of a path that was never used
- Sync .claude/commands/coreex-scaffold.md's frontmatter description
with the renamed coreex-scaffold skill's actual description
- Correct samples/docs/infrastructure-layer.md and tooling.md: Cosmos
CodeGen does generate persistence models (CosmosPersistenceModelGenerator)
- only DbContext/database-migration generation is absent
- Fix a non-compiling CustomerRepository doc snippet (missing _cosmos
field declaration)
- Remove CoreExExtensions.WithCoreExTelemetry's automatic process-wide
AppContext.SetData mutation of the regex NonBacktracking automata cap
(a library should not silently raise a global resource limit for
every regex in a consuming app); documented the net8.0 opt-in via
RuntimeHostConfigurationOption for hosts that need it
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Eric Sibly <eric.sibly@avanade.com>
Generated skill inventory has incorrect scope and count
.github/agents/README.md:123
This generated-output inventory has two mismatches: acquire-codebase-knowledge and aspire are framework-repo-only and are not copied by dotnet new coreex-ai (the template copies the CoreEx assets explicitly), and the current skill catalog lists 15 L1 skills, not 14. Please describe the shipped CoreEx suite separately from those two repo-only skills and correct the count.
CustomersCosmosDb example omits the options field
samples/docs/infrastructure-layer.md:74
This example uses _options in the primary-constructor base call but never declares it, so the documented CustomersCosmosDb snippet does not compile. Add the CosmosDbOptions field shown in the actual sample before the container properties.
…ibrary-side mutation
WithCoreExTelemetry() no longer silently calls AppContext.SetData for the net8.0
non-backtracking regex automata-size cap (per PR #187 review feedback). However,
Contoso.Shopping/Products Subscribe+Relay hosts combine WithCoreExTelemetry() with
WithCoreExServiceBusTelemetry()'s wildcard ActivitySource pattern, which reliably
exceeds net8.0's default 1,000-node cap and throws NotSupportedException at host
startup (reproduced and confirmed via live dotnet run).
Adds CoreExExtensions.IncreaseNet8RegexNonBacktrackingAutomataLimit() as an explicit,
documented, host-invoked opt-in (still AppContext.SetData under the hood - it is the
only mechanism that actually works). The MSBuild RuntimeHostConfigurationOption/
runtimeconfig.json route does not work for this switch: it surfaces the value to
AppContext.GetData as a boxed string, but dotnet/runtime's
SymbolicRegexThresholds.GetSymbolicRegexSafeSizeThreshold() requires a boxed int
(is int pattern match), so the runtimeconfig-supplied value is silently ignored
and the default of 1,000 still applies - verified empirically with an isolated
net8.0 console app and against a live Contoso.Shopping.Relay run.
The 4 affected sample hosts now call the new method, wrapped in #if NET8_0 so it
compiles out entirely on net9.0/net10.0 and can be deleted outright once net8.0
support is dropped. The CoreEx.Template-generated hosts are unaffected: the
scaffolded solution's Directory.Build.props pins TargetFramework to net10.0 only.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Eric Sibly <eric.sibly@avanade.com>
CoreEx's public WithCoreExTelemetry() no longer mentions this edge case at all -
it only affects 4 sample hosts that combine it with WithCoreExServiceBusTelemetry's
wildcard ActivitySource pattern on net8.0, so it doesn't belong in the library's
public API docs. Each of the 4 affected Contoso Subscribe/Relay samples now sets
AppContext.SetData("REGEX_NONBACKTRACKING_MAX_AUTOMATA_SIZE", 10_000) directly,
inline, wrapped in #if NET8_0 for easy removal once net8.0 support is dropped.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Eric Sibly <eric.sibly@avanade.com>
The template now adds the Cosmos guide to the explicit AI bundle, but this validation scenario never asserts that .github/docs/coreex/agents/CoreEx.Cosmos.md is present; a packaging regression could therefore pass. Add the generated guide to FilesPresent.
Correct consumer bundle skill inventory
.github/agents/README.md:123
This consumer-bundle list still claims that acquire-codebase-knowledge, aspire, and only 14 L1 skills are installed. The template does not copy the two generic skills, and the catalog above contains 15 L1 plus 2 L2 CoreEx skills; update the line to describe the actual generated bundle.
Add Cosmos to published cache inventory
.github/skills/coreex-docs-sync/README.md:54
This rename update leaves the published cache inventory stale: CoreEx.Template.csproj now copies CoreEx.Cosmos/AGENTS.md, but this README's guide list and count still omit CoreEx.Cosmos.md and say there are 17 guides. Update the synchronized docs-sync inventories to include Cosmos and use 18.
Document Cosmos emulator setup for Customers API
samples/README.md:170
Customers is now listed as requiring the cosmos-emulator, but the linked samples/docs/local-dev.md service inventory and connection-string sections still contain no Cosmos service or configuration guidance. A clean setup following the documented compose/startup steps therefore cannot configure the Customers API tests; add the emulator ports and Customers connection details to the local-development guide.
Add missing CosmosDbOptions field to example
samples/docs/infrastructure-layer.md:75
This CustomersCosmosDb excerpt uses _options in the base-constructor call but omits the actual class's CosmosDbOptions field, so the published example does not compile as shown. Include the declaration, matching CustomersCosmosDb.cs:8, before showing the container properties.
The public data parameter is explicitly nullable, but this new null-forgiving operator suppresses that fact without explaining why the non-null generic Handlebars template accepts a null secondary context. Preserve the nullable type if the API permits it, or document this adapter boundary so the suppression is justified.
Replace unchecked Root null-forgiving operators with validation
This new null-forgiving operator suppresses nullable analysis on the Handlebars root lookup without documenting or checking the required invariant. CoreEx's C# guidance forbids ! without a clear reason; use an explicit CodeGenContext check so a malformed helper invocation fails deterministically.
This issue also appears in the following locations of the same file:
line 38
line 45
Correct L1 skill inventory count from 14 to 15
.github/agents/README.md:123
The generated bundle now ships coreex-graphql as an L1 skill, and the workflow catalog lists 15 L1 skills, but this inventory still says 14. Update the count so the consumer asset inventory matches the files this PR packages.
Add preview-quality disclaimer to CoreEx.Cosmos reference
.github/copilot-instructions.md:72
This newly added CoreEx.Cosmos reference is missing the preview-quality disclaimer used by the other release documentation. Because this file is shipped as global AI guidance, state here that the API may change without strict semver until it stabilizes.
Declare CosmosDbOptions field in documentation example
samples/docs/infrastructure-layer.md:74
This example passes _options to the CosmosDb base constructor but never declares that field, so the new documentation snippet does not compile. Add the same CosmosDbOptions field used by CustomersCosmosDb before declaring the containers.
- HandlebarsHelpers: replace null-forgiving Root casts with a validating GetRootContext helper that throws deterministically on a malformed invocation.
- HandlebarsCodeGenerator.Generate: document why the null-forgiving operator on the Handlebars data parameter is safe.
- .github/agents/README.md: correct L1 skill count (14 -> 15) to include coreex-graphql.
- .github/copilot-instructions.md: add preview-quality disclaimer to the CoreEx.Cosmos polyglot-data reference.
- samples/docs/infrastructure-layer.md: declare the CosmosDbOptions field used by the CustomersCosmosDb example so it compiles.
- CoreEx.Template GlobalUsing.cs: alphabetize CoreEx.Data.Json using.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Eric Sibly <eric.sibly@avanade.com>
CreateDatabaseIfNotExistsAsync (the first Cosmos call per test-host TFM pass) intermittently fails against the local Cosmos emulator with an SSL/connection-reset error under sustained CI load. Add a bounded retry-with-backoff scoped to this test-setup call only; no production CosmosClient/CosmosDbOptions changes.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Eric Sibly <eric.sibly@avanade.com>
The reason will be displayed to describe this comment to others. Learn more.
Copilot review overview
🔵 Needs a closer look
One or more issues must be addressed before approval.
Review effort: Lite Findings: None
Previously missed (1)
In code that hasn't changed since last review
Synchronize docs-sync lists and package counts
src/CoreEx.Template/CoreEx.Template.csproj:227
Adding this _AiDocFile entry makes the packaged cache contain 18 per-package guides, but the shipped docs-sync sources are still inconsistent: .github/skills/coreex-docs-sync/SKILL.md and its README omit CoreEx.Cosmos.md (and the README still says 17), while .github/coreex-ai-workflows.md:31 still says 17. Update those lists and counts together so a consumer's /coreex-docs-sync documentation matches the bundle this change now produces.
…d to docs-sync lists
Addresses PR review follow-up: .github/coreex-ai-workflows.md and .github/skills/coreex-docs-sync/{SKILL,README}.md still listed 17 per-package guides and omitted CoreEx.Cosmos.md from the cache-layout/refresh file lists, inconsistent with the 18-guide bundle CoreEx.Template.csproj now produces.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Eric Sibly <eric.sibly@avanade.com>
Clarify Cosmos outbox documents reside in the business container
samples/docs/infrastructure-layer.md:99
This wording is inaccurate for Cosmos: CosmosDbEventPublisher enlists $outbox documents into the same business container as the mutation, rather than a separate outbox container (see src/CoreEx.Cosmos/AGENTS.md:101-118). Calling it “the outbox container” can send operators to the wrong place when diagnosing retained events; describe these as outbox documents in the hosting container.
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
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
This is the general-availability release of v4.0.0 — CoreEx's re-imagine/re-invention as an AI-augmented foundation for enterprise back-end services — superseding
v4.0.0-preview-1throughv4.0.0-preview-5.CoreEx.Cosmos. Typed Azure Cosmos DB data access (CosmosDbContainer<TModel>/CosmosDbMappedContainer<TValue,TModel,TMapper>), aTransactionalBatch-based transactional outbox, and a Change Feed Processor-based outbox relay, demonstrated by the newContoso.Customerssample.CoreEx.Cosmospublishes to NuGet alongside every other package in this release, but is flagged as preview-quality in its README/AGENTS.md — its API surface may still change in a future release without following strict semver until it stabilizes.CHANGELOG.mdfor the curated NuGet-facing summary of what's inv4.0.0.Preview history
v4.0.0-preview-1 through preview-5 (2026-06-20 → 2026-08-22)
CoreEx.Templatescaffolding (#170).QueryArgsConfigrefactor,CoreEx.Data.GraphQL(GraphQL-lite) query bridge, ref-data querying modernization, JSON database columns (#171-#178).If-Matchsupport, expandedEventActionlifecycle values, and a documentation/reality-gap correction pass (#184).What's new since preview-5
JsonFilterrecursive-descent paths and a streaming exclude engine;EventFormatternow stripsetagby default.CoreEx.Cosmos: typed Cosmos DB data access, transactional outbox, Change Feed Processor relay, and theContoso.Customerssample domain (API host only — no Relay/Subscribe host yet).Version.propsbumped to stable4.0.0(from preview versioning).OpenTelemetry.Instrumentation.Processdependency that blocked a stable NuGet pack (NU5104) — no stable version exists, and its metrics are redundant with platform-native process monitoring.coreex-solution-scaffolderskill tocoreex-scaffoldfor naming consistency across thecoreex-*skill suite, and added the missing.claude/commands/*.mdwrappers for full Claude Code / Copilot parity.AGENTS.md,.github/copilot-instructions.md,samples/README.md,samples/docs/*.md, and.github/agents/README.mdwith theCoreEx.Cosmos/Contoso.Customersadditions from Introduce CoreEx.Cosmos: typed Cosmos DB data access, outbox, and Contoso.Customers sample #186 (missing package-table row, missingcosmos-emulatorinfra entry, stale per-package-guide count, undocumented Cosmos repository pattern, missing test-taxonomy row, etc.).README.mdtable-of-contents (deadVersion 4 (preview)link,Statusentry pointed at the wrong anchor).src\CoreEx.Cosmostonuget-publish.ps1'sProjectsToPublishlist (previously missing, which would have silently skipped it on release), and added a "preview, API surface may change" disclaimer to every doc that references the package (rootREADME.md/AGENTS.md,CoreEx.Cosmos's ownREADME.md/AGENTS.md, and thesamples/docs/*.mdcross-references) now that it ships alongside the rest ofv4.0.0instead of being held back.Test plan
dotnet build CoreEx.sln -c Release— full solution build, 0 warnings/errors (TreatWarningsAsErrorsis on).dotnet test CoreEx.sln -c Release— full framework + sample test suite.tools/validate-template-pack.ps1— confirmsCoreEx.Templatescaffolds and builds cleanly across all parameter combinations after the skill rename and packaging changes.4.0.0version (no-previewsuffix), and thatCoreEx.Cosmosis included in thenuget-publish.ps1push alongside every other package.Co-authored-by: Copilot App 223556219+Copilot@users.noreply.github.com