refactor!: iter2 major — ClaimCheck/Outbox/ScatterGather migrate to PatternKit (with legacy adapters)#27
Merged
Conversation
… execution
- Replace qwen3:30b-instruct with qwen2.5:1.5b (1.5B params, <=2B constraint)
everywhere the model is configured: OllamaAgentProvider default, OllamaFixture,
SemanticKernelE2ETests, AiDsl sample, TaskStream sample extension
- Reduce OllamaFixture warmup timeout from 300s to 120s; remove /no_think from
warmup prompt (qwen3-specific; harmless on qwen2.5 but unnecessary)
- Add xunit.runner.json to Tests.E2E with parallelizeTestCollections:false and
maxParallelThreads:1 – combined with the existing [Collection("Ollama")] attribute
this guarantees all Ollama-backed tests run one at a time
- Update OllamaFactAttribute skip message to reference new model
- Update OllamaOptionsTests default model assertion to match new default
- Update prerequisite XML doc comment in AgentLoopOllamaE2ETests
To run the Ollama-backed E2E tests locally:
ollama pull qwen2.5:1.5b
dotnet test tests/WorkflowFramework.Tests.E2E/WorkflowFramework.Tests.E2E.csproj \
--filter Category=E2E
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… seeded workflow
Adds the AI DSL Emitter demo to the dashboard in two complementary ways:
1. Template ("New from Template" browser): id=ai-dsl-emitter, name="AI DSL Emitter",
category="AI & Agents", marked IsFeatured=true with preview SVG.
2. Seeded workflow (open-existing list): id=sample-ai-dsl-emitter,
name="AI DSL Emitter", immediately visible in the workflow list on startup.
Step types used match the Extensions.AI implementation:
SelectProvider (Action) → EmitSteps (DslEmitterStep) → ApprovePlan (ApprovalStep)
→ BridgeContext (Action) → ExecuteEmittedSteps (WorkflowDslExecutorStep)
Also registers DslEmitterStep and WorkflowDslExecutorStep in StepTypeRegistry
so the designer UI can render their config schemas.
Tests: 43/43 passed (WorkflowTemplateLibraryTests + SampleWorkflowSeederTests).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…orkflow
The SelectProvider step in SampleWorkflowSeeder had the old expression
"Resolve the agent provider from {provider} (echo or ollama)..." with an
unresolved {provider} template variable. This made the seeded/open-existing
workflow appear broken in the dashboard.
Aligned the expression to match InMemoryWorkflowTemplateLibrary:
"Provider is configured as echo (offline/demo default). To run live,
change the provider field in EmitSteps to ollama before executing."
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…t IClaimCheckStore<T>
OBSOLETION: WorkflowFramework.Extensions.Integration.Abstractions.IClaimCheckStore
is now [Obsolete(error: false)]. Migrate to PatternKit.Messaging.Transformation
.IClaimCheckStore<object>. LegacyClaimCheckStoreAdapter bridges old implementations
for one release; it will be removed in the next major version.
BEHAVIOR CHANGE: ClaimCheckStep now generates its own claim ID (Guid.NewGuid().ToString("N"))
rather than accepting one from the caller. The ID is stored under ClaimTicketKey as before.
Tests updated to assert the ticket is non-null/non-empty rather than a caller-supplied value.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nKit IOutboxStore<T> OBSOLETION: WorkflowFramework.Extensions.Integration.Abstractions.IOutboxStore is now [Obsolete(error: false)]. Migrate to PatternKit.Messaging.Reliability .IOutboxStore<object>. Use OutboxStoreExtensions.EnqueueObjectAsync for the common case of enqueueing plain objects without custom headers. LegacyOutboxStoreAdapter bridges old implementations for one release. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…t AsyncScatterGather<T>
BREAKING (behavioral): Recipient contract changed to ScatterGatherStep.Recipient
(typed name + ValueTask-returning handler). The shared-context mutation pattern
(__Result_{Name} keys) is removed — it was a concurrency hazard with no isolation.
OBSOLETION: The IEnumerable<IStep> constructor overload is now [Obsolete] and
bridges to the typed API for one release. Migrate to ScatterGatherStep.Recipient.
BEHAVIOR CHANGE (OperationCanceledException): PatternKit swallows non-caller-
initiated OperationCanceledException without adding a failure envelope. A cancelled
branch produces 0 results, not a null entry in results. Tests updated accordingly.
BEHAVIOR CHANGE (result ordering): PatternKit uses ConcurrentBag internally;
result order is non-deterministic. Tests changed from index-based to predicate
assertions (ContainSingle) where ordering assumptions existed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…cy addition Added PatternKit.Core package reference to Abstractions project; regenerated lock files for all four affected projects via --force-evaluate. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…terGather as Adopted Added §8, §9, §10 documenting Phase 3 adoption details for each step. Moved the three steps from Future Evaluation Targets to strikethrough entries linking to the new Adopted sections. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Code Coverage |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #27 +/- ##
==========================================
- Coverage 89.77% 89.44% -0.33%
==========================================
Files 291 293 +2
Lines 8342 8405 +63
Branches 1502 1516 +14
==========================================
+ Hits 7489 7518 +29
- Misses 527 554 +27
- Partials 326 333 +7
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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
Phase 3 of the PatternKit adoption plan: three EIP steps re-rooted on PatternKit v0.113.0 typed interfaces. All three ship legacy adapters and
[Obsolete]bridge overloads so existing consumers are not immediately broken.IClaimCheckStore→PatternKit.Messaging.Transformation.IClaimCheckStore<object>; step self-generates its own claim ID (Guid);LegacyClaimCheckStoreAdapterbridges old impls for one release.IOutboxStore→PatternKit.Messaging.Reliability.IOutboxStore<object>; usesEnqueueObjectAsync;LegacyOutboxStoreAdapterbridges old impls for one release.Recipient(name, handler)contract replacesIStep-based shared-context mutation; usesAsyncScatterGather<IWorkflowContext,object?,IReadOnlyList<object?>>withAllOrTimeout; deprecatedIEnumerable<IStep>overload retained for one release.BREAKING / Deprecation Notes
WF.Extensions.Integration.Abstractions.IClaimCheckStore[Obsolete]PatternKit.Messaging.Transformation.IClaimCheckStore<object>WF.Extensions.Integration.Abstractions.IOutboxStore[Obsolete]PatternKit.Messaging.Reliability.IOutboxStore<object>ScatterGatherStep(IEnumerable<IStep>, ...)ctor[Obsolete]ScatterGatherStep(IEnumerable<ScatterGatherStep.Recipient>, ...)WorkflowBuilderExtensions.ClaimCheck(IClaimCheckStore, ...)[Obsolete]IClaimCheckStore<object>WorkflowBuilderExtensions.ClaimRetrieve(IClaimCheckStore, ...)[Obsolete]IClaimCheckStore<object>Migration Guide
ClaimCheck (before → after)
Implement
PatternKit.Messaging.Transformation.IClaimCheckStore<object>:StoreAsync(string claimId, object payload, MessageHeaders headers, CancellationToken ct)TryLoadAsync(string claimId, CancellationToken ct) -> ValueTask<ClaimCheckStoredPayload<object>?>TransactionalOutbox (before → after)
Implement
PatternKit.Messaging.Reliability.IOutboxStore<object>:EnqueueAsync(Message<object> message, ...) -> ValueTask<OutboxMessage<object>>SnapshotPendingAsync(...)MarkDispatchedAsync(Guid id, ...)MarkFailedAsync(Guid id, ...)ScatterGather (before → after)
Behavioral changes to be aware of:
OperationCanceledExceptionin a recipient is swallowed without a null entry (PatternKit omits timed-out branches entirely rather than null-padding).ConcurrentBaginternally). Do not rely on index-based result access; use predicate-based queries.Removal Timeline
All
[Obsolete]symbols (adapters, deprecated overloads, old interfaces) will be removed in the next major version (no sooner than one full minor-version release cycle after this PR merges).Test Plan
dotnet testWorkflowFramework.Tests — net8.0 / net9.0 / net10.0 — all green (1955 tests × 3 TFMs)dotnet testWorkflowFramework.Tests.TinyBDD — net8.0 / net9.0 / net10.0 — all green (588 tests × 3 TFMs)[Obsolete]warnings in production code (only in adapters and deprecated bridge overloads, which are intentionally marked)docs/patternkit-adoption.mdupdated with §8, §9, §10 adoption entries🤖 Generated with Claude Code