Skip to content

Commit 8a932ba

Browse files
Align SDK history event wire-format parity
Align SDK history event payload contract Sync the SDK's copied v2 history-event payload key table with workflow's current frozen wire-format rows, including parallel metadata and child lifecycle fields. Keep schedule audit rows classified as preserve-only and update PHP-shaped fixtures to exercise the expanded keys.
1 parent 7e88ecb commit 8a932ba

2 files changed

Lines changed: 171 additions & 0 deletions

File tree

tests/integration/polyglot_fixtures.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,16 @@
3636
"declared_entry_method",
3737
"declared_entry_mode",
3838
"declared_entry_declaring_class",
39+
"parent_workflow_instance_id",
40+
"parent_workflow_run_id",
41+
"parent_sequence",
42+
"workflow_link_id",
43+
"child_call_id",
44+
"retry_policy",
45+
"timeout_policy",
46+
"continued_from_run_id",
47+
"retry_attempt",
48+
"retry_of_child_workflow_run_id",
3949
],
4050
"ActivityCompleted": [
4151
"activity_execution_id",
@@ -47,12 +57,18 @@
4757
"result",
4858
"payload_codec",
4959
"activity",
60+
"parallel_group_id",
61+
"parallel_group_kind",
62+
"parallel_group_base_sequence",
63+
"parallel_group_size",
64+
"parallel_group_index",
5065
"parallel_group_path",
5166
],
5267
"TimerFired": [
5368
"timer_id",
5469
"sequence",
5570
"delay_seconds",
71+
"fire_at",
5672
"fired_at",
5773
"timer_kind",
5874
"condition_wait_id",
@@ -95,6 +111,9 @@
95111
"sequence",
96112
"timer_id",
97113
"timeout_seconds",
114+
"workflow_signal_id",
115+
"signal_name",
116+
"signal_wait_id",
98117
],
99118
"SideEffectRecorded": [
100119
"sequence",
@@ -116,9 +135,16 @@
116135
"child_workflow_run_id",
117136
"child_workflow_class",
118137
"child_workflow_type",
138+
"child_run_number",
119139
"parent_close_policy",
120140
"retry_policy",
121141
"timeout_policy",
142+
"parallel_group_id",
143+
"parallel_group_kind",
144+
"parallel_group_base_sequence",
145+
"parallel_group_size",
146+
"parallel_group_index",
147+
"parallel_group_path",
122148
],
123149
"ChildRunCompleted": [
124150
"sequence",
@@ -133,6 +159,11 @@
133159
"closed_reason",
134160
"closed_at",
135161
"output",
162+
"parallel_group_id",
163+
"parallel_group_kind",
164+
"parallel_group_base_sequence",
165+
"parallel_group_size",
166+
"parallel_group_index",
136167
"parallel_group_path",
137168
"result",
138169
"payload_codec",
@@ -171,6 +202,16 @@
171202
"declared_entry_method": "run",
172203
"declared_entry_mode": "generator",
173204
"declared_entry_declaring_class": "Tests\\Fixtures\\V2\\PolyglotWorkflow",
205+
"parent_workflow_instance_id": None,
206+
"parent_workflow_run_id": None,
207+
"parent_sequence": None,
208+
"workflow_link_id": None,
209+
"child_call_id": None,
210+
"retry_policy": None,
211+
"timeout_policy": None,
212+
"continued_from_run_id": None,
213+
"retry_attempt": None,
214+
"retry_of_child_workflow_run_id": None,
174215
},
175216
},
176217
{
@@ -185,6 +226,11 @@
185226
"result": serializer.encode({"activity": "ok"}, codec="json"),
186227
"payload_codec": "json",
187228
"activity": "tests.polyglot.activity",
229+
"parallel_group_id": "parallel-activity-1",
230+
"parallel_group_kind": "activity",
231+
"parallel_group_base_sequence": 1,
232+
"parallel_group_size": 2,
233+
"parallel_group_index": 0,
188234
"parallel_group_path": "0",
189235
},
190236
},
@@ -194,6 +240,7 @@
194240
"timer_id": "timer-1",
195241
"sequence": 2,
196242
"delay_seconds": 5,
243+
"fire_at": "2026-04-21T20:45:00Z",
197244
"fired_at": "2026-04-21T20:45:00Z",
198245
"timer_kind": "sleep",
199246
"condition_wait_id": None,
@@ -248,6 +295,9 @@
248295
"sequence": 4,
249296
"timer_id": None,
250297
"timeout_seconds": 30,
298+
"workflow_signal_id": None,
299+
"signal_name": None,
300+
"signal_wait_id": None,
251301
},
252302
},
253303
{
@@ -268,9 +318,16 @@
268318
"child_workflow_run_id": "child-run-1",
269319
"child_workflow_class": "Tests\\Fixtures\\V2\\ChildWorkflow",
270320
"child_workflow_type": "tests.polyglot.child",
321+
"child_run_number": 1,
271322
"parent_close_policy": "terminate",
272323
"retry_policy": {"max_attempts": 3, "backoff_seconds": [1, 2]},
273324
"timeout_policy": {"execution_timeout_seconds": 120},
325+
"parallel_group_id": None,
326+
"parallel_group_kind": None,
327+
"parallel_group_base_sequence": None,
328+
"parallel_group_size": None,
329+
"parallel_group_index": None,
330+
"parallel_group_path": None,
274331
},
275332
},
276333
{
@@ -288,6 +345,11 @@
288345
"closed_reason": "completed",
289346
"closed_at": "2026-04-21T20:46:00Z",
290347
"output": serializer.encode({"child": "ok"}, codec="json"),
348+
"parallel_group_id": None,
349+
"parallel_group_kind": None,
350+
"parallel_group_base_sequence": None,
351+
"parallel_group_size": None,
352+
"parallel_group_index": None,
291353
"parallel_group_path": None,
292354
"result": serializer.encode({"child": "ok"}, codec="json"),
293355
"payload_codec": "json",

tests/test_history_event_contract.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,16 @@
5353
"declared_entry_method",
5454
"declared_entry_mode",
5555
"declared_entry_declaring_class",
56+
"parent_workflow_instance_id",
57+
"parent_workflow_run_id",
58+
"parent_sequence",
59+
"workflow_link_id",
60+
"child_call_id",
61+
"retry_policy",
62+
"timeout_policy",
63+
"continued_from_run_id",
64+
"retry_attempt",
65+
"retry_of_child_workflow_run_id",
5666
),
5767
"WorkflowContinuedAsNew": (
5868
"sequence",
@@ -67,6 +77,12 @@
6777
"activity_type",
6878
"sequence",
6979
"activity",
80+
"parallel_group_id",
81+
"parallel_group_kind",
82+
"parallel_group_base_sequence",
83+
"parallel_group_size",
84+
"parallel_group_index",
85+
"parallel_group_path",
7086
),
7187
"ActivityStarted": (
7288
"activity_execution_id",
@@ -76,6 +92,11 @@
7692
"sequence",
7793
"attempt_number",
7894
"activity",
95+
"parallel_group_id",
96+
"parallel_group_kind",
97+
"parallel_group_base_sequence",
98+
"parallel_group_size",
99+
"parallel_group_index",
79100
"parallel_group_path",
80101
),
81102
"ActivityHeartbeatRecorded": (
@@ -112,6 +133,11 @@
112133
"code",
113134
"exception",
114135
"activity",
136+
"parallel_group_id",
137+
"parallel_group_kind",
138+
"parallel_group_base_sequence",
139+
"parallel_group_size",
140+
"parallel_group_index",
115141
"parallel_group_path",
116142
),
117143
"ActivityCompleted": (
@@ -124,6 +150,11 @@
124150
"result",
125151
"payload_codec",
126152
"activity",
153+
"parallel_group_id",
154+
"parallel_group_kind",
155+
"parallel_group_base_sequence",
156+
"parallel_group_size",
157+
"parallel_group_index",
127158
"parallel_group_path",
128159
),
129160
"ActivityFailed": (
@@ -142,6 +173,11 @@
142173
"code",
143174
"exception",
144175
"activity",
176+
"parallel_group_id",
177+
"parallel_group_kind",
178+
"parallel_group_base_sequence",
179+
"parallel_group_size",
180+
"parallel_group_index",
145181
"parallel_group_path",
146182
"structural_limit_kind",
147183
"structural_limit_value",
@@ -176,6 +212,11 @@
176212
"schedule_to_close_deadline_at",
177213
"heartbeat_deadline_at",
178214
"activity",
215+
"parallel_group_id",
216+
"parallel_group_kind",
217+
"parallel_group_base_sequence",
218+
"parallel_group_size",
219+
"parallel_group_index",
179220
"parallel_group_path",
180221
),
181222
"TimerScheduled": (
@@ -194,6 +235,7 @@
194235
"timer_id",
195236
"sequence",
196237
"delay_seconds",
238+
"fire_at",
197239
"fired_at",
198240
"timer_kind",
199241
"condition_wait_id",
@@ -294,6 +336,9 @@
294336
"sequence",
295337
"timer_id",
296338
"timeout_seconds",
339+
"workflow_signal_id",
340+
"signal_name",
341+
"signal_wait_id",
297342
),
298343
"ConditionWaitTimedOut": (
299344
"condition_wait_id",
@@ -322,9 +367,16 @@
322367
"child_workflow_run_id",
323368
"child_workflow_class",
324369
"child_workflow_type",
370+
"child_run_number",
325371
"parent_close_policy",
326372
"retry_policy",
327373
"timeout_policy",
374+
"parallel_group_id",
375+
"parallel_group_kind",
376+
"parallel_group_base_sequence",
377+
"parallel_group_size",
378+
"parallel_group_index",
379+
"parallel_group_path",
328380
),
329381
"ChildRunStarted": (
330382
"sequence",
@@ -335,12 +387,22 @@
335387
"child_workflow_class",
336388
"child_workflow_type",
337389
"child_run_number",
390+
"child_status",
338391
"retry_policy",
339392
"timeout_policy",
340393
"execution_timeout_seconds",
341394
"run_timeout_seconds",
342395
"execution_deadline_at",
343396
"run_deadline_at",
397+
"retry_attempt",
398+
"retry_of_child_workflow_run_id",
399+
"retry_backoff_seconds",
400+
"parallel_group_id",
401+
"parallel_group_kind",
402+
"parallel_group_base_sequence",
403+
"parallel_group_size",
404+
"parallel_group_index",
405+
"parallel_group_path",
344406
),
345407
"ChildRunCompleted": (
346408
"sequence",
@@ -355,6 +417,11 @@
355417
"closed_reason",
356418
"closed_at",
357419
"output",
420+
"parallel_group_id",
421+
"parallel_group_kind",
422+
"parallel_group_base_sequence",
423+
"parallel_group_size",
424+
"parallel_group_index",
358425
"parallel_group_path",
359426
),
360427
"ChildRunFailed": (
@@ -375,6 +442,12 @@
375442
"exception_class",
376443
"message",
377444
"exception",
445+
"code",
446+
"parallel_group_id",
447+
"parallel_group_kind",
448+
"parallel_group_base_sequence",
449+
"parallel_group_size",
450+
"parallel_group_index",
378451
"parallel_group_path",
379452
),
380453
"ChildRunCancelled": (
@@ -389,6 +462,15 @@
389462
"child_status",
390463
"closed_reason",
391464
"closed_at",
465+
"failure_id",
466+
"failure_category",
467+
"exception_class",
468+
"message",
469+
"parallel_group_id",
470+
"parallel_group_kind",
471+
"parallel_group_base_sequence",
472+
"parallel_group_size",
473+
"parallel_group_index",
392474
"parallel_group_path",
393475
),
394476
"ChildRunTerminated": (
@@ -403,6 +485,15 @@
403485
"child_status",
404486
"closed_reason",
405487
"closed_at",
488+
"failure_id",
489+
"failure_category",
490+
"exception_class",
491+
"message",
492+
"parallel_group_id",
493+
"parallel_group_kind",
494+
"parallel_group_base_sequence",
495+
"parallel_group_size",
496+
"parallel_group_index",
406497
"parallel_group_path",
407498
),
408499
"SearchAttributesUpserted": (
@@ -604,6 +695,18 @@
604695

605696
SDK_PRESERVED_ONLY_HISTORY_EVENTS = frozenset(DOCUMENTED_HISTORY_EVENT_PAYLOAD_KEYS) - SDK_INTERPRETED_HISTORY_EVENTS
606697

698+
SCHEDULE_HISTORY_EVENTS = frozenset(
699+
{
700+
"ScheduleCreated",
701+
"SchedulePaused",
702+
"ScheduleResumed",
703+
"ScheduleUpdated",
704+
"ScheduleTriggered",
705+
"ScheduleDeleted",
706+
"ScheduleTriggerSkipped",
707+
}
708+
)
709+
607710
SDK_TOLERATED_FIXTURE_EXTRA_KEYS = {
608711
"SignalReceived": frozenset({"arguments", "payload_codec"}),
609712
"UpdateApplied": frozenset({"payload_codec"}),
@@ -621,6 +724,12 @@ def test_every_documented_history_event_has_an_sdk_classification() -> None:
621724
) == SDK_INTERPRETED_HISTORY_EVENTS | SDK_PRESERVED_ONLY_HISTORY_EVENTS
622725

623726

727+
def test_schedule_history_events_are_preserved_only() -> None:
728+
assert set(DOCUMENTED_HISTORY_EVENT_PAYLOAD_KEYS) >= SCHEDULE_HISTORY_EVENTS
729+
assert SDK_PRESERVED_ONLY_HISTORY_EVENTS >= SCHEDULE_HISTORY_EVENTS
730+
assert SCHEDULE_HISTORY_EVENTS.isdisjoint(SDK_INTERPRETED_HISTORY_EVENTS)
731+
732+
624733
def test_php_history_fixture_key_expectations_match_documented_contract() -> None:
625734
for event_type, fixture_keys in PHP_HISTORY_EVENT_EXPECTED_KEYS.items():
626735
documented_keys = set(DOCUMENTED_HISTORY_EVENT_PAYLOAD_KEYS[event_type])

0 commit comments

Comments
 (0)