From 2a995c0c4595b2d1dda229eefccc0d84bc2f723b Mon Sep 17 00:00:00 2001 From: Frank Chen <65260095+zhongkechen@users.noreply.github.com> Date: Tue, 6 Oct 2026 15:34:31 -0700 Subject: [PATCH] Revert "refactor(plugin)!: create one plugin instance per invocation (#721)" This reverts commit 6af308f9b69d0e65dd24312b07c627f2a8623b49. --- .github/workflows/ai-pr-review-address.yml | 5 +- .github/workflows/conformance-tests.yml | 3 +- .github/workflows/e2e-tests.yml | 22 - .github/workflows/otel-conformance-tests.yml | 9 +- AGENTS.md | 1 - README.md | 1 - conformance-tests-otel/README.md | 53 -- .../otel/Otel21CompletedStepReplay.java | 20 - .../otel/Otel22UserFunctionContext.java | 96 -- .../otel/Otel23CallbackFunctionContext.java | 109 --- .../otel/Otel24InvocationRetryStatus.java | 28 - .../otel/OtelConformanceHandler.java | 10 +- conformance-tests-otel/template.yaml | 92 -- conformance-tests/pom.xml | 2 +- .../java/plugin/PluginAttemptHooksRetry.java | 2 +- .../java/plugin/PluginErrorIsolation.java | 2 +- .../plugin/PluginExternalUpdateOnInvoke.java | 4 +- .../java/plugin/PluginFaultyAndHealthy.java | 2 +- .../plugin/PluginFirstInvocationFlag.java | 2 +- .../plugin/PluginInvocationLifecycle.java | 2 +- .../java/plugin/PluginMultiplePlugins.java | 4 +- .../plugin/PluginNestedParentLinkage.java | 4 +- .../java/plugin/PluginOperationChange.java | 2 +- .../java/plugin/PluginOperationLifecycle.java | 2 +- .../plugin/PluginParallelBranchHooks.java | 4 +- .../main/java/plugin/PluginReplayFlags.java | 4 +- .../java/plugin/PluginRetryExhaustion.java | 2 +- .../plugin/PluginSuspensionInvocationEnd.java | 4 +- .../java/plugin/PluginTerminalFailure.java | 2 +- .../java/plugin/PluginTerminalPayloads.java | 2 +- .../java/plugin/PluginWaitOperationHooks.java | 4 +- .../java/plugin/PluginWaitReplayFlag.java | 4 +- coverage-report/pom.xml | 2 +- docs/advanced/configuration.md | 18 +- docs/migration-2.x-to-3.x.md | 433 --------- examples/pom.xml | 2 +- .../examples/general/PluginExample.java | 2 +- insight-plugin/README.md | 25 +- insight-plugin/pom.xml | 2 +- .../lambda/durable/insight/ContentConfig.java | 4 +- .../durable/insight/ExportScheduler.java | 900 ++---------------- .../durable/insight/InsightExporter.java | 29 +- .../lambda/durable/insight/InsightPlugin.java | 458 --------- .../durable/insight/InsightSettings.java | 59 -- .../amazon/lambda/durable/insight/Json.java | 6 - .../durable/insight/WorkflowInsight.java | 447 +++++++-- .../durable/insight/exporters/LazyClient.java | 2 - .../durable/insight/internal/FatalErrors.java | 51 - .../ConcurrentExecutionsExportTest.java | 409 -------- .../durable/insight/ErrorPrivacyGateTest.java | 14 +- .../lambda/durable/insight/Executions.java | 77 -- .../ExportSchedulerFanOutReentryTest.java | 199 ---- .../ExportSchedulerFlushCoalescingTest.java | 311 ------ ...ExportSchedulerFlushSerializationTest.java | 434 --------- .../ExportSchedulerReentrantFlushTest.java | 131 --- .../durable/insight/ExportSchedulerTest.java | 122 +-- .../insight/ExporterIsolationTest.java | 19 +- .../durable/insight/InputSnapshotTest.java | 25 +- .../insight/InsightFatalBoundaryTest.java | 237 ----- .../insight/InsightFatalFailureTest.java | 172 ---- .../durable/insight/JsonJavaTimeTest.java | 11 +- .../insight/MutableNumberIsolationTest.java | 13 +- .../insight/OperationErrorIdentityTest.java | 15 +- .../insight/OperationOrderingTest.java | 11 +- .../PluginThrowableContainmentTest.java | 109 +-- .../insight/RecordSupersessionTest.java | 282 ------ .../insight/StateCleanupLifecycleTest.java | 236 +---- .../insight/TransformContractTest.java | 32 +- .../insight/UnrecoverableErrorUnwrapTest.java | 26 +- .../WorkflowInsightFlushCadenceTest.java | 230 ----- .../insight/WorkflowInsightHookTest.java | 95 +- .../insight/WorkflowInsightPluginTest.java | 4 +- .../insight/exporters/LazyClientTest.java | 14 - otel-plugin/README.md | 141 +-- otel-plugin/pom.xml | 2 +- .../lambda/durable/otel/ContextExtractor.java | 19 +- .../lambda/durable/otel/DurableSampler.java | 2 +- .../durable/otel/DurableSamplingDecision.java | 39 +- .../durable/otel/ExecutionOtelPlugin.java | 361 +++---- .../otel/ExecutionOtelPluginProvider.java | 20 +- .../durable/otel/ExecutionTraceContext.java | 5 +- .../durable/otel/InvocationOtelPlugin.java | 359 +++---- .../otel/InvocationOtelPluginProvider.java | 20 +- .../lambda/durable/otel/OtelPluginConfig.java | 6 +- .../durable/otel/OtelPluginEnvironment.java | 104 -- .../durable/otel/OtelPluginSupport.java | 38 +- .../lambda/durable/otel/SpanAttributes.java | 2 - .../durable/otel/XRayContextExtractor.java | 40 +- .../PluginLayerCompatibilityProbe.java | 76 -- .../src/test/compatibility/run_matrix.py | 76 -- .../durable/OtelViewRegistrationTest.java | 199 ---- .../lambda/durable/otel/DelayedFlush.java | 57 -- .../durable/otel/DurableSamplerTest.java | 40 +- ...urableSamplingDecisionClassLoaderTest.java | 5 +- .../ExecutionOtelPluginIntegrationTest.java | 10 +- .../durable/otel/ExecutionOtelPluginTest.java | 179 ++-- .../durable/otel/ExecutionRootTest.java | 362 ------- .../otel/HandlerContextIntegrationTest.java | 268 ------ .../otel/HandlerMdcIntegrationTest.java | 185 ---- .../otel/HandlerScopeFinalizationTest.java | 456 --------- .../otel/InvocationEndCleanupTest.java | 76 -- .../durable/otel/InvocationHeaderTest.java | 171 ---- .../InvocationInfoHeaderIntegrationTest.java | 153 --- .../otel/InvocationMdcCleanupTest.java | 122 --- .../InvocationOtelPluginIntegrationTest.java | 23 +- .../otel/InvocationOtelPluginTest.java | 274 +++--- .../lambda/durable/otel/Invocations.java | 27 - .../otel/LegacyEndThreadProbeTest.java | 188 ---- .../otel/LegacySubclassMigrationTest.java | 81 -- .../durable/otel/MdcSpanEnricherTest.java | 44 +- .../otel/OtelPluginFactoryConfigTest.java | 63 -- .../durable/otel/PluginStartupOrderTest.java | 64 -- .../otel/RootStartProcessorIsolationTest.java | 187 ---- .../RuntimeHeaderFailureIntegrationTest.java | 140 --- .../otel/UserFunctionStartCleanupTest.java | 145 --- .../otel/XRayContextExtractorTest.java | 89 -- .../XRayExtractorBinaryCompatibilityTest.java | 85 -- pom.xml | 2 +- sdk-integration-tests/pom.xml | 2 +- ...DelayedCheckpointFatalIntegrationTest.java | 138 --- ...ndlerScopeFinalizationIntegrationTest.java | 192 ---- ...cationEndFatalDispatchIntegrationTest.java | 190 ---- .../InvocationFailureCompatibilityTest.java | 97 -- .../OperationHookFatalIntegrationTest.java | 314 ------ .../OperationWorkerFailureRegressionTest.java | 313 ------ .../PluginFatalDispatchIntegrationTest.java | 251 ----- .../PluginFatalQueuedCheckpointTest.java | 142 --- .../lambda/durable/PluginIntegrationTest.java | 241 +---- sdk-testing/pom.xml | 2 +- .../testing/LocalDurableTestRunner.java | 11 +- .../TestingSdkCompatibilityProbe.java | 17 - .../ConfigurationCopyCompatibilityTest.java | 46 - .../testing/LocalDurableTestRunnerTest.java | 3 +- sdk/pom.xml | 2 +- .../amazon/lambda/durable/DurableConfig.java | 70 +- .../lambda/durable/DynamicPluginLoader.java | 193 +--- .../execution/ApiRequestDelayedBatcher.java | 86 +- .../durable/execution/CheckpointManager.java | 66 +- .../durable/execution/DurableExecutor.java | 290 +----- .../durable/execution/ExecutionManager.java | 152 +-- .../durable/execution/RuntimeTraceHeader.java | 68 -- .../operation/BaseDurableOperation.java | 40 +- .../operation/ChildContextOperation.java | 1 - .../durable/operation/StepOperation.java | 1 - .../operation/WaitForConditionOperation.java | 1 - .../plugin/DurableExecutionPlugin.java | 11 +- .../plugin/DurableExecutionPluginFactory.java | 41 - .../DurableExecutionPluginProvider.java | 36 +- .../lambda/durable/plugin/HandlerScoped.java | 30 - .../lambda/durable/plugin/InvocationInfo.java | 30 +- .../lambda/durable/plugin/PluginRunner.java | 348 +------ .../lambda/durable/util/ExceptionHelper.java | 17 - .../lambda/durable/DurableConfigTest.java | 60 +- .../DynamicPluginLoaderStaleProviderTest.java | 561 ----------- .../durable/DynamicPluginLoaderTest.java | 267 +++--- .../ApiRequestDelayedBatcherTest.java | 120 --- .../execution/DurableExecutionTest.java | 57 +- .../execution/ExecutionManagerTest.java | 64 +- .../FatalInvocationBoundaryTest.java | 294 ------ .../execution/HandlerScopeHandoffTest.java | 100 -- .../PluginFatalCheckpointAbortTest.java | 158 --- .../execution/RuntimeTraceHeaderTest.java | 256 ----- .../BaseDurableOperationPluginTest.java | 21 +- .../durable/plugin/HandlerScopeTest.java | 253 ----- .../InvocationInfoCompatibilityTest.java | 189 ---- .../LegacyHandlerScopeCompatibilityTest.java | 87 -- .../durable/plugin/PluginRunnerTest.java | 660 +------------ .../plugin/UserFunctionStartFailureTest.java | 129 --- .../util/AsyncFailureUnwrappingTest.java | 36 - 169 files changed, 1763 insertions(+), 16167 deletions(-) delete mode 100644 conformance-tests-otel/README.md delete mode 100644 conformance-tests-otel/src/main/java/software/amazon/lambda/durable/conformance/otel/Otel21CompletedStepReplay.java delete mode 100644 conformance-tests-otel/src/main/java/software/amazon/lambda/durable/conformance/otel/Otel22UserFunctionContext.java delete mode 100644 conformance-tests-otel/src/main/java/software/amazon/lambda/durable/conformance/otel/Otel23CallbackFunctionContext.java delete mode 100644 conformance-tests-otel/src/main/java/software/amazon/lambda/durable/conformance/otel/Otel24InvocationRetryStatus.java delete mode 100644 docs/migration-2.x-to-3.x.md delete mode 100644 insight-plugin/src/main/java/software/amazon/lambda/durable/insight/InsightPlugin.java delete mode 100644 insight-plugin/src/main/java/software/amazon/lambda/durable/insight/InsightSettings.java delete mode 100644 insight-plugin/src/main/java/software/amazon/lambda/durable/insight/internal/FatalErrors.java delete mode 100644 insight-plugin/src/test/java/software/amazon/lambda/durable/insight/ConcurrentExecutionsExportTest.java delete mode 100644 insight-plugin/src/test/java/software/amazon/lambda/durable/insight/Executions.java delete mode 100644 insight-plugin/src/test/java/software/amazon/lambda/durable/insight/ExportSchedulerFanOutReentryTest.java delete mode 100644 insight-plugin/src/test/java/software/amazon/lambda/durable/insight/ExportSchedulerFlushCoalescingTest.java delete mode 100644 insight-plugin/src/test/java/software/amazon/lambda/durable/insight/ExportSchedulerFlushSerializationTest.java delete mode 100644 insight-plugin/src/test/java/software/amazon/lambda/durable/insight/ExportSchedulerReentrantFlushTest.java delete mode 100644 insight-plugin/src/test/java/software/amazon/lambda/durable/insight/InsightFatalBoundaryTest.java delete mode 100644 insight-plugin/src/test/java/software/amazon/lambda/durable/insight/InsightFatalFailureTest.java delete mode 100644 insight-plugin/src/test/java/software/amazon/lambda/durable/insight/RecordSupersessionTest.java delete mode 100644 insight-plugin/src/test/java/software/amazon/lambda/durable/insight/WorkflowInsightFlushCadenceTest.java delete mode 100644 otel-plugin/src/main/java/software/amazon/lambda/durable/otel/OtelPluginEnvironment.java delete mode 100644 otel-plugin/src/test/compatibility/PluginLayerCompatibilityProbe.java delete mode 100644 otel-plugin/src/test/compatibility/run_matrix.py delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/OtelViewRegistrationTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/DelayedFlush.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/ExecutionRootTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/HandlerContextIntegrationTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/HandlerMdcIntegrationTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/HandlerScopeFinalizationTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/InvocationEndCleanupTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/InvocationHeaderTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/InvocationInfoHeaderIntegrationTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/InvocationMdcCleanupTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/Invocations.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/LegacyEndThreadProbeTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/LegacySubclassMigrationTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/OtelPluginFactoryConfigTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/PluginStartupOrderTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/RootStartProcessorIsolationTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/RuntimeHeaderFailureIntegrationTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/UserFunctionStartCleanupTest.java delete mode 100644 otel-plugin/src/test/java/software/amazon/lambda/durable/otel/XRayExtractorBinaryCompatibilityTest.java delete mode 100644 sdk-integration-tests/src/test/java/software/amazon/lambda/durable/DelayedCheckpointFatalIntegrationTest.java delete mode 100644 sdk-integration-tests/src/test/java/software/amazon/lambda/durable/HandlerScopeFinalizationIntegrationTest.java delete mode 100644 sdk-integration-tests/src/test/java/software/amazon/lambda/durable/InvocationEndFatalDispatchIntegrationTest.java delete mode 100644 sdk-integration-tests/src/test/java/software/amazon/lambda/durable/InvocationFailureCompatibilityTest.java delete mode 100644 sdk-integration-tests/src/test/java/software/amazon/lambda/durable/OperationHookFatalIntegrationTest.java delete mode 100644 sdk-integration-tests/src/test/java/software/amazon/lambda/durable/OperationWorkerFailureRegressionTest.java delete mode 100644 sdk-integration-tests/src/test/java/software/amazon/lambda/durable/PluginFatalDispatchIntegrationTest.java delete mode 100644 sdk-integration-tests/src/test/java/software/amazon/lambda/durable/PluginFatalQueuedCheckpointTest.java delete mode 100644 sdk-testing/src/test/compatibility/TestingSdkCompatibilityProbe.java delete mode 100644 sdk-testing/src/test/java/software/amazon/lambda/durable/testing/ConfigurationCopyCompatibilityTest.java delete mode 100644 sdk/src/main/java/software/amazon/lambda/durable/execution/RuntimeTraceHeader.java delete mode 100644 sdk/src/main/java/software/amazon/lambda/durable/plugin/DurableExecutionPluginFactory.java delete mode 100644 sdk/src/main/java/software/amazon/lambda/durable/plugin/HandlerScoped.java delete mode 100644 sdk/src/test/java/software/amazon/lambda/durable/DynamicPluginLoaderStaleProviderTest.java delete mode 100644 sdk/src/test/java/software/amazon/lambda/durable/execution/FatalInvocationBoundaryTest.java delete mode 100644 sdk/src/test/java/software/amazon/lambda/durable/execution/HandlerScopeHandoffTest.java delete mode 100644 sdk/src/test/java/software/amazon/lambda/durable/execution/PluginFatalCheckpointAbortTest.java delete mode 100644 sdk/src/test/java/software/amazon/lambda/durable/execution/RuntimeTraceHeaderTest.java delete mode 100644 sdk/src/test/java/software/amazon/lambda/durable/plugin/HandlerScopeTest.java delete mode 100644 sdk/src/test/java/software/amazon/lambda/durable/plugin/InvocationInfoCompatibilityTest.java delete mode 100644 sdk/src/test/java/software/amazon/lambda/durable/plugin/LegacyHandlerScopeCompatibilityTest.java delete mode 100644 sdk/src/test/java/software/amazon/lambda/durable/plugin/UserFunctionStartFailureTest.java delete mode 100644 sdk/src/test/java/software/amazon/lambda/durable/util/AsyncFailureUnwrappingTest.java diff --git a/.github/workflows/ai-pr-review-address.yml b/.github/workflows/ai-pr-review-address.yml index 5bd13defb..2b6e25d79 100644 --- a/.github/workflows/ai-pr-review-address.yml +++ b/.github/workflows/ai-pr-review-address.yml @@ -23,10 +23,7 @@ jobs: contents: read issues: read pull-requests: read - uses: aws/aws-durable-execution-ci/.github/workflows/ai-work-item-resolver.yml@d6b017da14385908951d23e26c790b28a4e5f9f0 - with: - work-scope: review - upload-work-items: true + uses: aws/aws-durable-execution-ci/.github/workflows/ai-pr-review-address.yml@d6b017da14385908951d23e26c790b28a4e5f9f0 address: if: >- diff --git a/.github/workflows/conformance-tests.yml b/.github/workflows/conformance-tests.yml index 357fa8f97..06baa03f5 100644 --- a/.github/workflows/conformance-tests.yml +++ b/.github/workflows/conformance-tests.yml @@ -21,11 +21,10 @@ on: concurrency: # Runs share fixed per-suite stack names, so serialize the whole workflow - # with multiple pending runs to avoid concurrent CloudFormation updates on the + # (queue, don't cancel) to avoid concurrent CloudFormation updates on the # same stack -- mirrors e2e-tests.yml. group: conformance-tests cancel-in-progress: false - queue: max permissions: contents: read diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 36f1341e3..e57070144 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -24,10 +24,8 @@ on: - 'pom.xml' concurrency: - # Shared stacks require serial deployment; preserve waiting runs from other PRs. group: e2e-tests cancel-in-progress: false - queue: max # permission can be added at job level or workflow level permissions: @@ -150,26 +148,6 @@ jobs: if [[ "$invariant_violated" == true ]]; then exit 1 fi - - name: Collect Lambda errors after failed E2E tests - if: failure() && env.E2E_LOG_START_TIME_MS != '' - env: - E2E_STACK_NAME: Java${{ matrix.java }}-JavaSDKCloudBasedIntegrationTestStack - run: | - set -euo pipefail - log_groups=$(aws cloudformation list-stack-resources \ - --stack-name "$E2E_STACK_NAME" \ - --query "StackResourceSummaries[?ResourceType=='AWS::Logs::LogGroup'].PhysicalResourceId" \ - --output text) - for log_group in $log_groups; do - echo "::group::Lambda errors: $log_group" - aws logs filter-log-events \ - --log-group-name "$log_group" \ - --start-time "$E2E_LOG_START_TIME_MS" \ - --filter-pattern '%ERROR|Error|Exception|timed.out|Invalid.suspension|not.active|already.registered%' \ - --limit 100 --no-paginate \ - --query 'events[].message' --output text - echo "::endgroup::" - done - name: Publish test case summary if: always() env: diff --git a/.github/workflows/otel-conformance-tests.yml b/.github/workflows/otel-conformance-tests.yml index f77472cd0..68b3bc3f2 100644 --- a/.github/workflows/otel-conformance-tests.yml +++ b/.github/workflows/otel-conformance-tests.yml @@ -53,11 +53,6 @@ on: permissions: {} -concurrency: - group: otel-conformance-tests - cancel-in-progress: false - queue: max - jobs: opentelemetry: # 1. Run for non-PR events, such as scheduled runs and manual invocations @@ -67,13 +62,13 @@ jobs: actions: write contents: read id-token: write - uses: aws/aws-durable-execution-conformance-tests/.github/workflows/opentelemetry-orchestrator.yml@98b802cdb172614f98e217f7464784d47b9bb484 + uses: aws/aws-durable-execution-conformance-tests/.github/workflows/opentelemetry-orchestrator.yml@43872f8d5dd917fe3ee6d01a6c953c1ff67c5fe4 with: language: java resource_prefix: j sdk_repository: aws/aws-durable-execution-sdk-java sdk_ref: ${{ github.event.pull_request.head.sha || github.sha }} - conformance_test_ref: ${{ inputs.conformance_test_ref || '98b802cdb172614f98e217f7464784d47b9bb484' }} + conformance_test_ref: ${{ inputs.conformance_test_ref || '02d6dca971a38c13d94d6233d12f687e55b2a572' }} checkout_sdk: true # Build the handlers from this repo's checked-out module instead of the conformance repo's # bundled examples/java. Path is relative to the conformance workspace where the SDK is diff --git a/AGENTS.md b/AGENTS.md index 6cc0114c9..7894488db 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -335,7 +335,6 @@ Run `mvn spotless:apply` after Java changes. Then run the narrowest relevant tes - [Error Handling](docs/advanced/error-handling.md) - [Logging](docs/advanced/logging.md) - [Migration from 1.x to 2.x](docs/migration-1.x-to-2.x.md) -- [Migration from 2.x to 3.x](docs/migration-2.x-to-3.x.md) ### Official AWS SDKs diff --git a/README.md b/README.md index c7e14c3d3..8b3184c63 100644 --- a/README.md +++ b/README.md @@ -119,7 +119,6 @@ See [Deploy Lambda durable functions with Infrastructure as Code](https://docs.a - [Error Handling](docs/advanced/error-handling.md) - SDK exceptions for handling failures - [Logging](docs/advanced/logging.md) - How to use DurableLogger - [Migrating from 1.x to 2.x](docs/migration-1.x-to-2.x.md) - Upgrade guide for breaking changes since `v1.2.1` -- [Migrating from 2.x to 3.x](docs/migration-2.x-to-3.x.md) - Upgrade guide for the factory-only, per-invocation plugin contract - [Release Process](RELEASE.md) - Prepare and publish Maven releases - [Testing](docs/advanced/testing.md) - Utilities for local development and cloud-based integration testing diff --git a/conformance-tests-otel/README.md b/conformance-tests-otel/README.md deleted file mode 100644 index 7f4c31312..000000000 --- a/conformance-tests-otel/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# Java OpenTelemetry conformance handlers - -The shared conformance repository owns the requirements and validators. This -module supplies public-API handlers and SAM resources for both tracing views. -Existing cases 1–20 and their resources are unchanged by the additions below. - -| Case | Scenario | Behavior | -| --- | --- | --- | -| 21 | `completed-step-replay` | Complete a step, suspend on a one-second durable wait, then complete another step. The first step body is skipped on replay. | -| 22 | `user-function-context` | Probe handler entry/restoration/resume, step, child, concurrent parallel branches and map iterations, and their nested steps. | -| 23 | `callback-function-context` | Probe step retry attempts, condition checks, callback submission, a wrapped retry helper's body and strategy, and a virtual child after the asynchronous work finishes. | -| 24 | `invocation-retry-status` | Throw the public retryable execution exception after a checkpointed step, then recover on replay. | - -Cases 22 and 23 require a valid active `SpanContext` and create/end ordinary -`conformance.