Commit graph

7128 commits

Author SHA1 Message Date
Sipke Schoorstra 70690ad3d3
docs: refresh roadmap 2026-08-12 00:09:13 +02:00
Sipke Schoorstra 0412555b6e
Merge pull request #7913 from elsa-workflows/claude/cranky-boyd-269f7e
feat(core): let a container activity handle a child's fault via FaultSignal
2026-08-11 23:43:26 +02:00
Sipke Schoorstra 5e56161031
Merge pull request #7919 from elsa-workflows/claude/fix-nuke-nuget-frameworks
build: bump NuGet.Packaging to 7.9.0 to unbreak the NUKE build on SDK 10.0.400
2026-08-11 23:36:35 +02:00
Sipke Schoorstra fe6601ab5b
build: bump NuGet.Packaging to 7.9.0 to unbreak the NUKE build on SDK 10.0.400
CI started failing on every branch with an assembly load error out of NUKE's
project parsing, before any test ran:

  InvalidProjectFileException: The expression
  "[MSBuild]::GetTargetFrameworkIdentifier(net10.0)" cannot be evaluated.
  Could not load file or assembly 'NuGet.Frameworks, Version=7.9.0.0'.
  The located assembly's manifest definition does not match the assembly reference.
     at Nuke.Common.ProjectModel.ProjectModelTasks.ParseProject

Nothing in the repo changed to cause it. pr.yml requests dotnet-version 10.x,
and the hosted runner moved from SDK 10.0.302 to 10.0.400. Measured, the two
SDKs ship different NuGet.Frameworks:

  SDK 10.0.300 / 10.0.302 -> NuGet.Frameworks 7.6.0
  SDK 10.0.400            -> NuGet.Frameworks 7.9.0

_build.csproj pinned NuGet.Packaging 7.6.0, which puts NuGet.Frameworks 7.6.0
in the NUKE output directory, where it shadows the SDK's own copy. The loader
accepts an assembly newer than the reference but not older, so once MSBuild
started asking for 7.9.0.0 the app-local 7.6.0 no longer satisfied it. The same
commits passed 19 hours earlier on 10.0.302.

The reference is not used by the build itself - there are no NuGet.* usages
anywhere in build/*.cs. It exists only as a transitive vulnerability override,
added in f5dc29cdc, so bumping it preserves the original intent while matching
what the current SDK ships. Staying loadable on 10.0.3xx follows from the same
newer-than-reference rule that broke the old pin.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 23:25:33 +02:00
Sipke Schoorstra a618337923
docs(core): give FaultSignal handlers a working completion path
Review caught that the contract advertised something that cannot work. It
offered handlers three ways to terminalize the faulted activity - cancel,
complete, or reschedule - but CompleteActivityAsync returns immediately unless
the activity is Running, and throughout the handler it is still Faulted, since
recovery runs only after the handler returns. Completing inline did nothing at
all, silently, leaving the child Running.

Measured, same container, handler completing the faulted child:

  inline complete                    -> child Running,   no output, Running/Suspended
  TransitionTo(Running), complete    -> child Completed, "after",   Finished/Finished

So a supported path exists; it just needed writing down. Document it on
FaultSignal, note that it is not licence to call RecoverFromFault (which also
rewrites the fault counts), and note that cancelling and rescheduling need no
equivalent step. Cover it with an integration test asserting that completing the
child with a substitute result fires the container's completion callback and
resumes its sequencing.

Refs #7911

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 22:08:44 +02:00
Sipke Schoorstra d085b536f0
docs(core): document FaultSignal self-receipt and pin it with a test
Review raised that TrySendSignalAsync delivers to the faulting activity before
walking ancestors, so an activity that throws and also handles FaultSignal can
claim its own fault and suppress the incident strategy.

That is real, but it is the channel's existing dispatch, which #7911 chose
deliberately over a variant of it, and SignalContext.IsSelf exists so handlers
can discriminate. It also grants no capability: an activity that catches its own
exception never faults at all, ending Finished/Finished with zero incidents,
which is a cleaner suppression than self-handling (incident still recorded,
activity left Running, workflow suspended).

So dispatch is unchanged. What was missing is that none of this was written
down: the contract describes the handler as an enclosing container and never
mentioned self-receipt. Document it on FaultSignal, including how a handler
that wants ancestors-only semantics opts out, and add a test so the behavior is
pinned rather than incidental.

Refs #7911

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 03:04:49 +02:00
Sipke Schoorstra 13eb48e002
feat(core): let a container handle a child's fault via FaultSignal
A container activity had no way to learn that one of its children faulted.
ExceptionHandlingMiddleware caught the exception, called context.Fault(e) and
handed off to the workflow-global IIncidentStrategy; the container's completion
callback never fired, because the child never completed.

Add a seam on the ancestor-bubbling signal channel that already exists:

- FaultSignal(Exception, ActivityExecutionContext), beside CancelSignal. Its XML
  doc carries the contract, including why a handler must not call
  RecoverFromFault and why the CompleteActivityAsync sweep is a backstop rather
  than the mechanism.
- An internal bool-returning TrySendSignalAsync, since SignalContext
  .StopPropagationRequested is internal and SendSignalAsync reported nothing.
  SendSignalAsync keeps its public signature and delegates to it.
- ExceptionHandlingMiddleware sends the signal after faulting and, when an
  ancestor stops propagation, calls RecoverFromFault once and returns instead of
  raising an incident.

RecoverFromFault now transitions to Running only when the activity is still
Faulted. It is called after the handler runs, so the unconditional transition
would otherwise undo a handler that cancelled or completed the faulted child.
The counts are still reset unconditionally, and the one pre-existing caller is
unaffected.

Behavior is unchanged when nobody handles the signal: verified by running the
new unhandled-fault theory against the pre-change middleware, and by
IncidentStrategyTests and Primitives/FaultTests passing unmodified.

Refs #7911

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 01:11:25 +02:00
Sipke Schoorstra bd903f63dc
docs: refresh roadmap 2026-08-05 00:05:27 +02:00
Sipke Schoorstra 5b0c2d7359
Merge pull request #7902 from elsa-workflows/012-output-converters
Add extensible output converters
2026-07-31 13:30:06 +02:00
Sipke Schoorstra 5d7db9d057
Merge remote-tracking branch 'origin/main' into 012-output-converters 2026-07-31 13:29:06 +02:00
Sipke Schoorstra 0737def83d
Harden output converter contracts 2026-07-31 13:29:01 +02:00
Sipke Schoorstra d698e6b005
Add output converter support at binding boundaries 2026-07-31 04:10:48 +02:00
Sipke Schoorstra ec9acd4f3f
Fix tenant service mutation race (#7898)
Serialize tenant lifecycle mutations and keep synchronization available through shutdown.

Closes #7771.
2026-07-30 02:47:44 +02:00
Sipke Schoorstra 1000d29feb
docs: refresh roadmap 2026-07-29 00:08:31 +02:00
Sipke Schoorstra 04e58690ff
chore: apply safe dependency upgrades (#7896) 2026-07-26 21:42:27 +02:00
Sipke Schoorstra aef7f253c3
docs: refresh roadmap 2026-07-22 00:07:49 +02:00
Sipke Schoorstra 5be9fe08e9
Updated AGENTS.md 2026-07-15 00:08:42 +02:00
Sipke Schoorstra 74a476eb03
chore: make agent instructions feature-neutral
Merge validated instruction cleanup after all required checks passed.
2026-07-14 23:13:16 +02:00
Sipke Schoorstra 3736eca19b
chore: make agent instructions feature-neutral 2026-07-14 23:03:03 +02:00
Sipke Schoorstra a73ccfd2a3
chore: update patch dependencies (#7766)
* chore: update patch dependencies

* chore: align remaining net10 packages
2026-07-12 10:33:52 +02:00
Sipke Schoorstra 74b4778552
Merge pull request #7756 from MohitGuptaC/main
fix: correct Oracle identifier quoting and NVARCHAR2 type cast in GenerateOracleUpsert
2026-07-11 15:37:45 +02:00
Sipke Schoorstra 33181b2c9d
test: cover Oracle bulk upsert SQL generation
Exercise quoted Oracle identifiers, NVARCHAR2 casts, multi-row SQL, update/insert clauses, and parameter ordering. Reuse the provider SQL generation helper so identifier delimiting stays aligned with Oracle EF Core.
2026-07-11 14:35:36 +02:00
Sipke Schoorstra 4f89578572
Refresh roadmap from current Elsa evidence 2026-07-01 00:06:01 +02:00
Sipke Schoorstra c83f19920a
Merge pull request #7761 from elsa-workflows/codex/increase-ai-host-test-coverage
[codex] Increase AI host test coverage
2026-06-27 15:45:46 +02:00
Sipke Schoorstra 5336f9ea06
Increase AI host test coverage 2026-06-27 04:04:39 +02:00
MohitGuptaC 6b7296fa29
Fix Comments and Casting logic of NVARCHAR2 2026-06-24 10:24:05 +05:30
MohitGuptaC 82e069c265
fix: correct Oracle identifier quoting and NVARCHAR2 cast in GenerateOracleUpsert
Unquoted aliases in SELECT … FROM DUAL caused ORA-00904 because Oracle
uppercases bare identifiers. All aliases, ON condition, UPDATE SET, and
INSERT/VALUES column references are now double-quoted to match the
case-sensitive names EF Core migrations produce.

NVARCHAR2 columns additionally required an explicit CAST because ODP.NET
cannot infer bind parameter types from a FROM DUAL subquery and defaults
to VARCHAR2. CAST(:p AS NVARCHAR2(n)) with length extracted from the EF
column type string resolves the datatype mismatch.

Both fixes are required — neither alone produces working Oracle persistence.
All other providers are unchanged.

fixes Fixes #7755
2026-06-24 00:13:51 +05:30
Sipke Schoorstra 869aecfd7e
Merge pull request #7750 from elsa-workflows/sfmskywalker-fix-publishevent-payload-case
Fix PublishEvent payload assertion casing
2026-06-23 03:01:39 +02:00
Sipke Schoorstra 12a9b332bb
Merge remote-tracking branch 'origin/main' into sfmskywalker-fix-publishevent-payload-case
# Conflicts:
#	test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Primitives/Event/PublishEventTests.cs
2026-06-23 02:44:12 +02:00
Sipke Schoorstra b5f2036e95
Merge pull request #7751 from elsa-workflows/sfmskywalker-fix-publishevent-payload-assertion
Fix PublishEvent payload assertion casing
2026-06-23 02:41:36 +02:00
Sipke Schoorstra ef53cf39ba
Merge remote-tracking branch 'origin/main' into sfmskywalker-fix-publishevent-payload-case
# Conflicts:
#	test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Primitives/Event/PublishEventTests.cs
2026-06-23 02:26:39 +02:00
Sipke Schoorstra d5378d6ef9
Address payload assertion review feedback
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-23 02:22:54 +02:00
Sipke Schoorstra 66911bb77f
Address PublishEvent payload review feedback
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-23 02:22:15 +02:00
Sipke Schoorstra 883a184c2e
Merge pull request #7752 from elsa-workflows/sfmskywalker-fix-flaky-payload-test
Fix flaky PublishEvent payload assertion
2026-06-23 01:28:50 +02:00
Sipke Schoorstra 635c3ea42f
Address PR review feedback
Use LINQ for the case-insensitive payload property lookup and keep CShells package source mapping deterministic by mapping CShells packages only to nuget.org.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-22 00:44:36 +02:00
Sipke Schoorstra 2a5b716ba0
Allow NuGet.org for CShells packages
Map CShells package IDs to NuGet.org as well as the CShells Feedz source so solution restore can resolve published CShells packages when the Feedz source has no matching package.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-21 23:56:47 +02:00
Sipke Schoorstra b05eb3096b
Fix flaky publish event payload test
Make the PublishEvent payload assertion case-insensitive so it tolerates JsonPayloadSerializer camelCase output after a JSON round trip.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-21 23:18:33 +02:00
Sipke Schoorstra 5cc2a7c75a
Fix publish event payload assertion casing
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-21 23:18:28 +02:00
Sipke Schoorstra 571c1c7b2c Shorten configured application instance names
Configured stable application instance names that exceed the Azure Service Bus transport entity limit are now shortened deterministically instead of failing startup. The same configured value resolves to the same shortened name across restarts, preserving stable per-instance transport identity while supporting normal Kubernetes pod names.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-20 12:50:02 +02:00
Sipke Schoorstra 29d43dadbb
Update CShells and Elsa.PackageManifest.Generator to latest versions 2026-06-20 00:58:40 +02:00
Sipke Schoorstra 4d867a2941
Merge pull request #7744 from elsa-workflows/sfmskywalker-port-asb-stable-instance-main
Forward-port stable ASB application instance names to main
2026-06-20 00:30:52 +02:00
Sipke Schoorstra b08b10132c
address greptile review feedback (greploop iteration 1)
- Make validation constants internal and expose via InternalsVisibleTo so tests reference single source of truth
- Add empty-string guard to IsValidConfiguredInstanceName to prevent IndexOutOfRangeException
- Add ClusteringFeature_UsesConfiguredInstanceNameProvider test for Features.ClusteringFeature to match existing ShellFeatures coverage

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-20 00:13:33 +02:00
Sipke Schoorstra 55284aa1c1
Add stable application instance name configuration
Forward-port the opt-in stable application instance name support from PR #7734 so clustered deployments can reuse per-instance transport entities across restarts while preserving random names by default.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-20 00:04:15 +02:00
Sipke Schoorstra 8e20386a28
Merge pull request #7705 from elsa-workflows/codex/7579-tenant-agnostic-api-key
fix: use tenant-agnostic application lookup for API keys
2026-06-17 20:16:22 +02:00
Sipke Schoorstra 04d602fcd2
Merge pull request #7711 from elsa-workflows/codex/7708-notfoundactivity-guard
[codex] Guard missing NotFoundActivity descriptor during deserialization
2026-06-14 22:33:41 +02:00
Sipke Schoorstra 46cf0739e6
Merge remote-tracking branch 'origin/main' into codex/7708-notfoundactivity-guard
# Conflicts:
#	src/modules/Elsa.Workflows.Core/Serialization/Converters/ActivityJsonConverter.cs
2026-06-14 22:26:41 +02:00
Sipke Schoorstra 8f721e1ea2
Guard HTTP fault handling when workflow reload returns null (#7714)
* Guard HTTP fault handling when workflow reload returns null

* Add HTTP fault handler reload guard tests

* Address Greptile review feedback
2026-06-14 22:23:38 +02:00
Sipke Schoorstra 0d7c810688
address greptile review feedback 2026-06-14 19:07:15 +02:00
Sipke Schoorstra 48a087e71e
Restore RequestAborted after timed HTTP workflow failures (#7712)
* Fix RequestAborted restoration for timed HTTP workflows

* Add timeout restoration tests for HttpWorkflowsMiddleware
2026-06-14 19:02:23 +02:00
Sipke Schoorstra 9c24f5efe5
Dispose parsed activity JsonDocuments (#7713)
* Dispose parsed activity JsonDocuments

* Add ActivityJsonConverter disposal regression test

* Fix ActivityJsonConverter disposal regression test file

* address greptile test coverage feedback
2026-06-11 20:33:10 +02:00