Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion TEST-SCENARIOS.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ geçerliliğini yitiren senaryo **silinmez**, `deprecated` işaretlenip sebebi y
| Senaryo | Test Edilen vNext Feature Seti | Neden Eklendi | Integration Test | Python Test | Durum |
|---|---|---|---|---|---|
| **error-boundary-lab** | Error boundary çözümlemesi: `CompiledBoundaryChain` Task→State→Global seviye baskınlığı · seviye içi sıra (`EffectivePriority` ASC → specificity DESC; default wildcard'ın 999'a düşmesi) · aksiyonlar abort/retry/rollback/notify/ignore/log · `TaskExecutionEngine` retry döngüsü (`1 + maxRetries`) ve tükenince `ResolveExcluding(Retry)` fallback'i · `BoundaryOutcomeHandler` → fault vs `RequestNextTransition` · `FinalizeTransitionStep`'in boundary transition'ı bitince incident'ı resolve etmesi · `InstanceIncidents` tablosu + denormalize `HasActiveIncident` · state function `incident` bloğu (link tabanlı, ResponseShapeVersion v9, ETag materyali) · `GET .../instances/{id}/incidents/active` (404 = açık arıza yok) · `GET .../instances/{id}/incidents` sayfalama · `metadata.incident` (state bloğuyla aynı şekil) · `POST .../retry` (400 `Instance:100027`, yeniden fault, veriyle kurtarma) · `queryRoles` kapısının incident geçmişine de uygulanması | vnext `feature/incident-table` (issue #865) incident'ları jsonb'den kendi tablosuna taşıdı ve iki yeni client yüzeyi ekledi; ayrıca error boundary bu repoda hiç senaryo olarak yoktu ve `POST .../retry` hiçbir testte çağrılmıyordu (2026-09-06) | `Tests/ErrorBoundaryLab` (6 sınıf, 31 test) | — (bilinçli: davranış/çözümleme senaryosu, eşzamanlılık iddiası yok) | ✅ **Aktif — 31/31 yeşil** (lokal runtime `feature/incident-table`, art arda iki koşu, ~1 dk 46 sn; ilk koşu 2026-09-06, üç davranışsal kusurun düzeltilmesinden sonra 2026-09-07'de yeniden) |
| **chain-busy** | Accept-time subflow chain reserve · Busy-as-mutex · `$self` shared transition vs `updateData` lifecycle sınırı · start `initial → initial` semantiği · cancel propagasyonu (in-process ↕ distributed) · scheduled transition re-arm | `updateData`-only self-target profil sınırını pinlemek — `target: $self` "hook'ları atla" demek değil (2026-08-17) | `Tests/ChainBusy` (5 sınıf) | `api-tests/chain-busy/chain-busy-behaviour-test.py`, `chain-busy-accept-test.py` | ✅ Aktif |
| **event-driven-lab** | Olay tetiklemeli start + `triggerType: 3` transition · Dapr Subscription route'u · CloudEvent açma · `IEventMapping` ile iş anahtarı korelasyonu · eşleşmeyen olayın ack'lenmesi | `POST .../instances/events` ucunun **hiç testi yoktu** (council `2026-09-11-route-trace-coverage`, adı konmuş boşluk); ayrıca `Event.Intake` span'i bu ucu ölçüyor ve testsiz route'a span gönderilmez (2026-09-13) | `Tests/EventDrivenLab` (1 sınıf) | — | ✅ Aktif |
| **chain-busy** | Accept-time subflow chain reserve **ve başarısız forward'da geri alınması (E31)** · Busy-as-mutex · `$self` shared transition vs `updateData` lifecycle sınırı · start `initial → initial` semantiği · cancel propagasyonu (in-process ↕ distributed) · scheduled transition re-arm | `updateData`-only self-target profil sınırını pinlemek — `target: $self` "hook'ları atla" demek değil (2026-08-17). **E31 (2026-09-12):** post-commit forward istemci hatasıyla düşünce rezervasyon salınmıyordu; üretimde 30 günde 51 mahsur instance (council `2026-09-08-parent-notification-mechanism`, P0) | `Tests/ChainBusy` (5 sınıf) | `api-tests/chain-busy/chain-busy-behaviour-test.py`, `chain-busy-accept-test.py` | ✅ Aktif |
| **script-race-lab** | Script engine: paylaşılan `AssemblyLoadContext`'te çift-derleme yarışı · `scripts.helpers` · subflow output mapping · parent kalıcı fault riski | `Script_XXXX already loaded` / `FileLoadException` yarışının fixture'ı; fix'siz runtime'da kaybedenler parent'ı kalıcı fault'lar (2026-08-18) | `Tests/ScriptRaceLab` | `api-tests/script-race-lab/race-load.py` (yük), `publish.py` | ✅ Aktif |
| **data-integrity-lab** | InstanceData v2: anında persist · lock altında kimlik · sıralı/paralel task yazımları · DataHash dedup (task + updateData) · versiyon satırı bütünlüğü | `feature/busy-as-mutex-locking` + InstanceData v2 geliştirmesini uçtan uca ölçmek (2026-08-13) | `Tests/DataIntegrityLab` | `api-tests/data-integrity-lab/integrity-lab-test.py` | ⚠️ Kısmen kırmızı — `run-parallel` konteynerli ortamda settle olmuyor (120s'te doğrulandı, hang) |
| **subflow-orchestration** | 3 seviyeli subflow (parent → child → grandchild) · `updateData`'nın auto transition'ı tetiklemesi · aktif subflow'lu parent'ta `updateData` data-only kısa devresi · parent `$self` shared transition · eşzamanlı updateData tutarlılığı | Platformun subflow referans akışı; `feature/busy-as-mutex-locking` F1/F1a/F8 fix'lerinin doğrulaması (2026-04-28) | `Tests/SubflowOrchestration` | `api-tests/subflow-orchestration/updatedata-concurrency-test.py` | ✅ Aktif |
Expand Down
16 changes: 16 additions & 0 deletions core/Tasks/event-driven-lab/event-lab-script-task.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"key": "event-lab-script-task",
"version": "1.0.0",
"domain": "core",
"flow": "sys-tasks",
"flowVersion": "1.0.0",
"tags": [
"integration-test",
"event-driven-lab",
"script-task"
],
"attributes": {
"type": "7",
"config": {}
}
}
104 changes: 104 additions & 0 deletions core/Workflows/event-driven-lab/build-event-driven-lab.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
#!/usr/bin/env python3
"""Regenerates event-driven-lab.json from the .csx sources in ./src.

Every mapping is embedded as base64 in `code` next to its `location`; edit the .csx files and
re-run this script — never hand-edit the base64 blobs.

python3 core/Workflows/event-driven-lab/build-event-driven-lab.py
"""

import base64
import json
from pathlib import Path

ROOT = Path(__file__).resolve().parent


def code(name):
raw = (ROOT / "src" / name).read_bytes()
return {"location": f"./src/{name}", "code": base64.b64encode(raw).decode()}


def label(text):
return [{"language": "en-US", "label": text}]


SCRIPT_TASK = {
"key": "event-lab-script-task",
"domain": "core",
"version": "1.0.0",
"flow": "sys-tasks",
}

workflow = {
"key": "event-driven-lab",
"flow": "sys-flows",
"flowVersion": "1.0.0",
"domain": "core",
# Publishing is version-immutable: the same version with different content is refused with
# Instance:100002. Every content change here needs a patch bump.
"version": "1.0.1",
"tags": ["integration-test", "event-driven-lab", "event", "pubsub", "tracing"],
"attributes": {
"type": "F",
"labels": label("Event Driven Lab"),
"functions": [],
"extensions": [],
# Workflow-level event mapping = the action=start subscription's entry point.
"event": {"mapping": code("StartEventMapping.csx")},
"startTransition": {
"key": "start-event-driven-lab",
"target": "awaiting-approval",
"triggerType": 0,
"versionStrategy": "Major",
"labels": label("Start Event Driven Lab"),
},
"states": [
{
"key": "awaiting-approval",
"stateType": 1,
"subType": 0,
"versionStrategy": "Major",
"labels": label("Awaiting Approval"),
"view": None,
"subFlow": None,
"onEntries": [],
"onExits": [],
"transitions": [
{
"key": "approve-by-event",
"target": "approved",
# 3 = Event. Only an event delivery may drive this transition.
"triggerType": 3,
"versionStrategy": "Minor",
"labels": label("Approve By Event"),
"event": {"mapping": code("ApproveEventMapping.csx")},
"onExecutionTasks": [
{
"order": 1,
"task": SCRIPT_TASK,
"mapping": code("RecordApprovalMapping.csx"),
}
],
}
],
},
{
"key": "approved",
"stateType": 3,
"subType": 1,
"versionStrategy": "Major",
"labels": label("Approved"),
"view": None,
"subFlow": None,
"onEntries": [],
"onExits": [],
"transitions": [],
},
],
},
}

out = ROOT / "event-driven-lab.json"
out.write_text(json.dumps(workflow, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
print(f"wrote {out}")
113 changes: 113 additions & 0 deletions core/Workflows/event-driven-lab/event-driven-lab.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
{
"key": "event-driven-lab",
"flow": "sys-flows",
"flowVersion": "1.0.0",
"domain": "core",
"version": "1.0.1",
"tags": [
"integration-test",
"event-driven-lab",
"event",
"pubsub",
"tracing"
],
"attributes": {
"type": "F",
"labels": [
{
"language": "en-US",
"label": "Event Driven Lab"
}
],
"functions": [],
"extensions": [],
"event": {
"mapping": {
"location": "./src/StartEventMapping.csx",
"code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIFdvcmtmbG93LWxldmVsIGV2ZW50IG1hcHBpbmc6IHR1cm5zIGEgcmF3IGJyb2tlciBtZXNzYWdlIGludG8gYSBuZXcgaW5zdGFuY2UuCi8vLyA8cGFyYT4KLy8vIFJlYWNoZWQgdGhyb3VnaCA8Yz5QT1NUIC4uLi9pbnN0YW5jZXMvZXZlbnRzP2FjdGlvbj1zdGFydDwvYz4sIHdoaWNoIGEgRGFwciBTdWJzY3JpcHRpb24gcm91dGVzCi8vLyB0byBmcm9tIHRoZSB0b3BpYy4gVGhlIHJ1bnRpbWUgaGFzIGFscmVhZHkgdW53cmFwcGVkIHRoZSBDbG91ZEV2ZW50IGVudmVsb3BlLCBzbwovLy8gPGM+Y29udGV4dC5FdmVudFBheWxvYWQ8L2M+IGlzIHRoZSBtZXNzYWdlIHRoZSBwdWJsaXNoZXIgYWN0dWFsbHkgc2VudC4KLy8vIDwvcGFyYT4KLy8vIDxwYXJhPgovLy8gPGM+SW5zdGFuY2VLZXk8L2M+IGlzIHRoZSBjb3JyZWxhdGlvbiBjb250cmFjdCBmb3IgZXZlcnl0aGluZyB0aGF0IGZvbGxvd3M6IHRoZSBhcHByb3ZlIGV2ZW50Ci8vLyBsYXRlciBmaW5kcyB0aGlzIGluc3RhbmNlIGJ5IGV4YWN0bHkgdGhpcyB2YWx1ZSwgc28gaXQgbXVzdCBjb21lIGZyb20gdGhlIHBheWxvYWQgYW5kIG5vdCBiZQovLy8gZ2VuZXJhdGVkIGhlcmUuCi8vLyA8L3BhcmE+Ci8vLyA8L3N1bW1hcnk+CnB1YmxpYyBjbGFzcyBTdGFydEV2ZW50TWFwcGluZyA6IElFdmVudE1hcHBpbmcKewogICAgcHVibGljIGFzeW5jIFRhc2s8RXZlbnRNYXBwaW5nUmVzdWx0PiBIYW5kbGVyKFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICB2YXIgcGF5bG9hZCA9IGNvbnRleHQuRXZlbnRQYXlsb2FkOwoKICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KG5ldyBFdmVudE1hcHBpbmdSZXN1bHQKICAgICAgICB7CiAgICAgICAgICAgIEluc3RhbmNlS2V5ID0gKHN0cmluZylwYXlsb2FkLm9yZGVySWQsCiAgICAgICAgICAgIEJvZHkgPSBuZXcKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3JkZXJJZCA9IChzdHJpbmcpcGF5bG9hZC5vcmRlcklkLAogICAgICAgICAgICAgICAgYW1vdW50ID0gcGF5bG9hZC5hbW91bnQsCiAgICAgICAgICAgICAgICAvLyBQcm92ZXMgdGhlIGluc3RhbmNlIHdhcyBjcmVhdGVkIGJ5IHRoZSBldmVudCBwYXRoIHJhdGhlciB0aGFuIGJ5IGFuIEhUVFAgc3RhcnQuCiAgICAgICAgICAgICAgICBzdGFydGVkQnkgPSAiZXZlbnQiLAogICAgICAgICAgICAgICAgYXBwcm92YWxzID0gMAogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9Cn0K"
}
},
"startTransition": {
"key": "start-event-driven-lab",
"target": "awaiting-approval",
"triggerType": 0,
"versionStrategy": "Major",
"labels": [
{
"language": "en-US",
"label": "Start Event Driven Lab"
}
]
},
"states": [
{
"key": "awaiting-approval",
"stateType": 1,
"subType": 0,
"versionStrategy": "Major",
"labels": [
{
"language": "en-US",
"label": "Awaiting Approval"
}
],
"view": null,
"subFlow": null,
"onEntries": [],
"onExits": [],
"transitions": [
{
"key": "approve-by-event",
"target": "approved",
"triggerType": 3,
"versionStrategy": "Minor",
"labels": [
{
"language": "en-US",
"label": "Approve By Event"
}
],
"event": {
"mapping": {
"location": "./src/ApproveEventMapping.csx",
"code": "dXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgQkJULldvcmtmbG93LlNjcmlwdGluZzsKCi8vLyA8c3VtbWFyeT4KLy8vIFRyYW5zaXRpb24tbGV2ZWwgZXZlbnQgbWFwcGluZyBmb3IgPGM+YXBwcm92ZS1ieS1ldmVudDwvYz4gKDxjPnRyaWdnZXJUeXBlOiAzPC9jPikuCi8vLyA8cGFyYT4KLy8vIENvcnJlbGF0ZXMgYnkgYnVzaW5lc3Mga2V5OiB0aGUgcnVudGltZSBsb29rcyB1cCB0aGUgQUNUSVZFIGluc3RhbmNlIHdob3NlIGtleSBlcXVhbHMKLy8vIDxjPkluc3RhbmNlS2V5PC9jPi4gTm8gbWF0Y2ggaXMgYSBub3JtYWwgYW5zd2VyIOKAlCB0aGUgZW5kcG9pbnQgYWNrcyBzbyB0aGUgYnJva2VyIGRvZXMgbm90Ci8vLyByZWRlbGl2ZXIgZm9yZXZlciDigJQgd2hpY2ggaXMgd2h5IHRoZSB0ZXN0IGFzc2VydHMgb24gdGhlIGluc3RhbmNlIHJhdGhlciB0aGFuIG9uIHRoZSByZXNwb25zZS4KLy8vIDwvcGFyYT4KLy8vIDwvc3VtbWFyeT4KcHVibGljIGNsYXNzIEFwcHJvdmVFdmVudE1hcHBpbmcgOiBJRXZlbnRNYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPEV2ZW50TWFwcGluZ1Jlc3VsdD4gSGFuZGxlcihTY3JpcHRDb250ZXh0IGNvbnRleHQpCiAgICB7CiAgICAgICAgdmFyIHBheWxvYWQgPSBjb250ZXh0LkV2ZW50UGF5bG9hZDsKCiAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbVJlc3VsdChuZXcgRXZlbnRNYXBwaW5nUmVzdWx0CiAgICAgICAgewogICAgICAgICAgICBJbnN0YW5jZUtleSA9IChzdHJpbmcpcGF5bG9hZC5vcmRlcklkLAogICAgICAgICAgICBCb2R5ID0gbmV3CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlY2lzaW9uID0gKHN0cmluZylwYXlsb2FkLmRlY2lzaW9uLAogICAgICAgICAgICAgICAgYXBwcm92ZWRCeSA9IChzdHJpbmcpcGF5bG9hZC5hcHByb3ZlZEJ5CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KfQo="
}
},
"onExecutionTasks": [
{
"order": 1,
"task": {
"key": "event-lab-script-task",
"domain": "core",
"version": "1.0.0",
"flow": "sys-tasks"
},
"mapping": {
"location": "./src/RecordApprovalMapping.csx",
"code": "dXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5EeW5hbWljOwp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBCQlQuV29ya2Zsb3cuRGVmaW5pdGlvbnM7CnVzaW5nIEJCVC5Xb3JrZmxvdy5TY3JpcHRpbmc7CgovLy8gPHN1bW1hcnk+Ci8vLyBXcml0ZXMgd2hhdCB0aGUgZXZlbnQgY2FycmllZCBpbnRvIGluc3RhbmNlIGRhdGEsIHNvIHRoZSB0ZXN0IGNhbiBhc3NlcnQgdGhhdCB0aGUgdHJhbnNpdGlvbiByYW4KLy8vIHdpdGggdGhlIG1hcHBlZCBib2R5IHJhdGhlciB0aGFuIG1lcmVseSB0aGF0IHRoZSBzdGF0ZSBtb3ZlZC4KLy8vIDwvc3VtbWFyeT4KcHVibGljIGNsYXNzIFJlY29yZEFwcHJvdmFsTWFwcGluZyA6IElNYXBwaW5nCnsKICAgIHB1YmxpYyBhc3luYyBUYXNrPFNjcmlwdFJlc3BvbnNlPiBJbnB1dEhhbmRsZXIoV29ya2Zsb3dUYXNrIHRhc2ssIFNjcmlwdENvbnRleHQgY29udGV4dCkKICAgIHsKICAgICAgICBkeW5hbWljIGJvZHkgPSBuZXcgRXhwYW5kb09iamVjdCgpOwogICAgICAgIGJvZHkuYXBwcm92YWxzID0gMTsKICAgICAgICBib2R5LmRlY2lzaW9uID0gY29udGV4dC5Cb2R5Py5kZWNpc2lvbjsKICAgICAgICBib2R5LmFwcHJvdmVkQnkgPSBjb250ZXh0LkJvZHk/LmFwcHJvdmVkQnk7CgogICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQobmV3IFNjcmlwdFJlc3BvbnNlIHsgRGF0YSA9IGJvZHkgfSk7CiAgICB9CgogICAgcHVibGljIGFzeW5jIFRhc2s8U2NyaXB0UmVzcG9uc2U+IE91dHB1dEhhbmRsZXIoU2NyaXB0Q29udGV4dCBjb250ZXh0KQogICAgICAgID0+IGF3YWl0IFRhc2suRnJvbVJlc3VsdChuZXcgU2NyaXB0UmVzcG9uc2UgeyBEYXRhID0gY29udGV4dC5Cb2R5IH0pOwp9Cg=="
}
}
]
}
]
},
{
"key": "approved",
"stateType": 3,
"subType": 1,
"versionStrategy": "Major",
"labels": [
{
"language": "en-US",
"label": "Approved"
}
],
"view": null,
"subFlow": null,
"onEntries": [],
"onExits": [],
"transitions": []
}
]
}
}
28 changes: 28 additions & 0 deletions core/Workflows/event-driven-lab/src/ApproveEventMapping.csx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System.Threading.Tasks;
using BBT.Workflow.Scripting;

/// <summary>
/// Transition-level event mapping for <c>approve-by-event</c> (<c>triggerType: 3</c>).
/// <para>
/// Correlates by business key: the runtime looks up the ACTIVE instance whose key equals
/// <c>InstanceKey</c>. No match is a normal answer — the endpoint acks so the broker does not
/// redeliver forever — which is why the test asserts on the instance rather than on the response.
/// </para>
/// </summary>
public class ApproveEventMapping : IEventMapping
{
public async Task<EventMappingResult> Handler(ScriptContext context)
{
var payload = context.EventPayload;

return await Task.FromResult(new EventMappingResult
{
InstanceKey = (string)payload.orderId,
Body = new
{
decision = (string)payload.decision,
approvedBy = (string)payload.approvedBy
}
});
}
}
25 changes: 25 additions & 0 deletions core/Workflows/event-driven-lab/src/RecordApprovalMapping.csx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System.Collections.Generic;
using System.Dynamic;
using System.Threading.Tasks;
using BBT.Workflow.Definitions;
using BBT.Workflow.Scripting;

/// <summary>
/// Writes what the event carried into instance data, so the test can assert that the transition ran
/// with the mapped body rather than merely that the state moved.
/// </summary>
public class RecordApprovalMapping : IMapping
{
public async Task<ScriptResponse> InputHandler(WorkflowTask task, ScriptContext context)
{
dynamic body = new ExpandoObject();
body.approvals = 1;
body.decision = context.Body?.decision;
body.approvedBy = context.Body?.approvedBy;

return await Task.FromResult(new ScriptResponse { Data = body });
}

public async Task<ScriptResponse> OutputHandler(ScriptContext context)
=> await Task.FromResult(new ScriptResponse { Data = context.Body });
}
36 changes: 36 additions & 0 deletions core/Workflows/event-driven-lab/src/StartEventMapping.csx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System.Threading.Tasks;
using BBT.Workflow.Scripting;

/// <summary>
/// Workflow-level event mapping: turns a raw broker message into a new instance.
/// <para>
/// Reached through <c>POST .../instances/events?action=start</c>, which a Dapr Subscription routes
/// to from the topic. The runtime has already unwrapped the CloudEvent envelope, so
/// <c>context.EventPayload</c> is the message the publisher actually sent.
/// </para>
/// <para>
/// <c>InstanceKey</c> is the correlation contract for everything that follows: the approve event
/// later finds this instance by exactly this value, so it must come from the payload and not be
/// generated here.
/// </para>
/// </summary>
public class StartEventMapping : IEventMapping
{
public async Task<EventMappingResult> Handler(ScriptContext context)
{
var payload = context.EventPayload;

return await Task.FromResult(new EventMappingResult
{
InstanceKey = (string)payload.orderId,
Body = new
{
orderId = (string)payload.orderId,
amount = payload.amount,
// Proves the instance was created by the event path rather than by an HTTP start.
startedBy = "event",
approvals = 0
}
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Routes the approval topic to the same endpoint with action=transition.
#
# transitionKey is required for action=transition and must name a transition whose triggerType is 3;
# anything else is answered 400 NotAnEventTransition. sync=true makes the delivery block until the
# pipeline reaches a rest point, which is what lets a test assert on the instance immediately after
# the publish is acknowledged instead of polling for an indeterminate window.
apiVersion: dapr.io/v1alpha1
kind: Subscription
metadata:
name: event-driven-lab-approve-subscription
spec:
topic: core.event-driven-lab.approve
route: "/api/v1/core/workflows/event-driven-lab/instances/events?action=transition&transitionKey=approve-by-event&sync=true"
pubsubname: vnext-pubsub
scopes:
- vnext-app
Loading
Loading