Skip to content

Conversation

@jkachmar
Copy link
Contributor

@jkachmar jkachmar commented Nov 21, 2025

description

this reproduces signal delivery ordering behavior we observed in production code, where signalWithStart followed by signal in short succession does not necessarily guarantee in-order modification of StateVars.

signals are, however, processed in-order: if the signal handler gets the time at which it is processed with Workflow.now and uses that as a priority ordering key then things look the way that we expect them to.


6c0e06b fails with the same thing we saw in prod:

failure
Failures:

  test/IntegrationSpec.hs:1511:45:
  1) Integration, Regression tests, signalWithStart, processes signals in order of delivery
       expected: [1,2]
        but got: [2,1]

  To rerun use: --match "/Integration/Regression tests/signalWithStart/processes signals in order of delivery/"

Randomized with seed 1851790929

Finished in 2.1476 seconds
1 example, 1 failure

...but 2946fc5 succeeds when it uses a priority queue to insert according to received timestamp:

success
Finished in 2.1433 seconds
1 example, 0 failures
Test suite temporal-sdk-tests: PASS

@jkachmar jkachmar force-pushed the jkachmar/repro-signal-delivery branch from a137ce0 to 2946fc5 Compare November 21, 2025 19:02
@github-actions
Copy link

📊 Code Coverage Report

Current PR Coverage

Overall Coverage: 🟠 57.9%

  • 10148 / 17523 expressions covered

Overall Summary

Category Coverage
Top-level definitions 791/2607 🔴 30.3%
Alternatives 27/57 🟠 47.4%
Expressions 9082/14434 🟡 62.9%
Local definitions 228/368 🟡 62.0%
Other 20/57 🔴 35.1%

Coverage by Module

Module Coverage Top-level Alternatives Expressions Local
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.TH.Internal 🔴 0.0% 0/15 🔴 0.0% 0/2 🔴 0.0% 0/135 🔴 0.0% 0/2 🔴 0.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.TH 🔴 8.2% 1/21 🔴 4.8% 0/16 🔴 0.0% 41/460 🔴 8.9% 3/36 🔴 8.3%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.SearchAttributes 🔴 15.6% 12/101 🔴 11.9% N/A 19/92 🔴 20.7% 0/6 🔴 0.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Common 🔴 15.9% 49/637 🔴 7.7% 1/1 🟢 100.0% 78/170 🟠 45.9% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Data.EvalRecord 🔴 21.0% 12/71 🔴 16.9% N/A 68/308 🔴 22.1% 2/12 🔴 16.7%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Worker.Types 🔴 25.0% 9/35 🔴 25.7% N/A 9/37 🔴 24.3% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Client.TestService 🔴 32.0% 7/16 🟠 43.8% 1/1 🟢 100.0% 43/139 🔴 30.9% 3/12 🔴 25.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Activity.Definition 🔴 35.1% 22/57 🔴 38.6% N/A 24/74 🔴 32.4% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Payload 🔴 35.4% 38/125 🔴 30.4% 0/5 🔴 0.0% 162/438 🔴 37.0% 2/4 🟠 50.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Update 🟠 40.0% 1/3 🔴 33.3% N/A 1/2 🟠 50.0% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Signal 🟠 40.0% 1/3 🔴 33.3% N/A 1/2 🟠 50.0% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Query 🟠 40.0% 1/3 🔴 33.3% N/A 1/2 🟠 50.0% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.TH.Classes 🟠 40.0% 10/27 🔴 37.0% N/A 28/68 🟠 41.2% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Definition 🟠 41.7% 8/20 🟠 40.0% N/A 32/76 🟠 42.1% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Activity.Types 🟠 45.0% 9/21 🟠 42.9% N/A 9/19 🟠 47.4% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Types 🟠 45.3% 49/179 🔴 27.4% N/A 81/108 🟡 75.0% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Bundle 🟠 45.5% 9/25 🔴 36.0% N/A 91/199 🟠 45.7% 10/18 🟠 55.6%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Unsafe.Handle 🟠 49.4% 5/8 🟡 62.5% N/A 72/148 🟠 48.6% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Coroutine 🟠 49.7% 12/23 🟠 52.2% N/A 65/132 🟠 49.2% 3/6 🟠 50.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.WorkflowInstance 🟠 50.0% 1/1 🟢 100.0% N/A 1/3 🔴 33.3% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.EphemeralServer 🟠 50.0% 4/13 🔴 30.8% N/A 64/122 🟠 52.5% 0/1 🔴 0.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Common.Async 🟠 50.0% 1/2 🟠 50.0% N/A 10/20 🟠 50.0% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Exception 🟠 52.0% 84/291 🔴 28.9% 2/3 🟡 66.7% 301/455 🟡 66.2% 5/5 🟢 100.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Testing.MockActivityEnvironment 🟠 52.9% 7/14 🟠 50.0% N/A 43/85 🟠 50.6% 5/5 🟢 100.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Operator 🟠 55.6% 3/12 🔴 25.0% 1/1 🟢 100.0% 53/92 🟠 57.6% 2/2 🟢 100.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow 🟠 58.2% 38/104 🔴 36.5% 2/3 🟡 66.7% 1237/2085 🟠 59.3% 31/56 🟠 55.4%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Worker 🟠 59.1% 42/111 🔴 37.8% 1/1 🟢 100.0% 601/997 🟡 60.3% 34/39 🟢 87.2%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Internal.Monad 🟡 61.3% 136/254 🟠 53.5% 1/3 🔴 33.3% 621/976 🟡 63.6% 2/3 🟡 66.7%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Client.Types 🟡 65.5% 49/104 🟠 47.1% N/A 124/159 🟡 78.0% 0/1 🔴 0.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Interceptor 🟡 67.6% 15/33 🟠 45.5% N/A 56/72 🟡 77.8% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Activity 🟡 69.8% 3/6 🟠 50.0% N/A 84/120 🟡 70.0% 3/3 🟢 100.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Duration 🟡 70.9% 27/64 🟠 42.2% 6/7 🟢 85.7% 213/274 🟡 77.7% 6/9 🟡 66.7%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.WorkflowInstance 🟡 71.2% 18/22 🟢 81.8% 2/2 🟢 100.0% 1258/1767 🟡 71.2% 29/42 🟡 69.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Client 🟡 73.8% 34/78 🟠 43.6% 5/7 🟡 71.4% 1459/1945 🟡 75.0% 26/33 🟡 78.8%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Contrib.OpenTelemetry 🟡 73.8% 3/7 🟠 42.9% N/A 518/700 🟡 74.0% 12/15 🟢 80.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Internal.Instance 🟡 74.7% 6/8 🟡 75.0% N/A 124/166 🟡 74.7% 6/8 🟡 75.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Activity.Worker 🟡 75.2% 23/36 🟡 63.9% N/A 420/555 🟡 75.7% 10/11 🟢 90.9%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Common.Logging 🟢 81.0% 11/14 🟡 78.6% 1/1 🟢 100.0% 87/106 🟢 82.1% 3/4 🟡 75.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Testing.Assertions 🟢 81.1% 6/11 🟠 54.5% N/A 24/26 🟢 92.3% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Worker 🟢 84.7% 15/22 🟡 68.2% 1/1 🟢 100.0% 630/740 🟢 85.1% 22/26 🟢 84.6%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Eval 🟢 91.1% 4/4 🟢 100.0% 3/3 🟢 100.0% 300/329 🟢 91.2% 9/9 🟢 100.0%
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.SearchAttributes.Internal 🟢 93.3% 5/5 🟢 100.0% N/A 23/25 🟢 92.0% N/A
temporal-sdk-2025.10.1.0-1Z3JA5xgPm11LgTcvQWo9A/Temporal.Workflow.Unsafe 🟢 100.0% 1/1 🟢 100.0% N/A 6/6 🟢 100.0% N/A

🟢 ≥80% 🟡 ≥60% 🟠 ≥40% 🔴 <40%


📈 Coverage Comparison vs. Main

Coverage increased by .1% (57.8% → 57.9%)

Main Branch Coverage (for comparison)

Overall Coverage: 🟠 57.8%

  • 10135 / 17523 expressions covered

Overall Summary

Category Coverage
Top-level definitions 790/2607 🔴 30.3%
Alternatives 27/57 🟠 47.4%
Expressions 9070/14434 🟡 62.8%
Local definitions 228/368 🟡 62.0%
Other 20/57 🔴 35.1%

Coverage by Module

Module Coverage Top-level Alternatives Expressions Local
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.TH.Internal 🔴 0.0% 0/15 🔴 0.0% 0/2 🔴 0.0% 0/135 🔴 0.0% 0/2 🔴 0.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.TH 🔴 8.2% 1/21 🔴 4.8% 0/16 🔴 0.0% 41/460 🔴 8.9% 3/36 🔴 8.3%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.SearchAttributes 🔴 15.6% 12/101 🔴 11.9% N/A 19/92 🔴 20.7% 0/6 🔴 0.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Common 🔴 15.9% 49/637 🔴 7.7% 1/1 🟢 100.0% 78/170 🟠 45.9% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Data.EvalRecord 🔴 21.0% 12/71 🔴 16.9% N/A 68/308 🔴 22.1% 2/12 🔴 16.7%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Worker.Types 🔴 25.0% 9/35 🔴 25.7% N/A 9/37 🔴 24.3% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Client.TestService 🔴 32.0% 7/16 🟠 43.8% 1/1 🟢 100.0% 43/139 🔴 30.9% 3/12 🔴 25.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Activity.Definition 🔴 35.1% 22/57 🔴 38.6% N/A 24/74 🔴 32.4% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Payload 🔴 35.4% 38/125 🔴 30.4% 0/5 🔴 0.0% 162/438 🔴 37.0% 2/4 🟠 50.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Update 🟠 40.0% 1/3 🔴 33.3% N/A 1/2 🟠 50.0% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Signal 🟠 40.0% 1/3 🔴 33.3% N/A 1/2 🟠 50.0% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Query 🟠 40.0% 1/3 🔴 33.3% N/A 1/2 🟠 50.0% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.TH.Classes 🟠 40.0% 10/27 🔴 37.0% N/A 28/68 🟠 41.2% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Definition 🟠 41.7% 8/20 🟠 40.0% N/A 32/76 🟠 42.1% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Activity.Types 🟠 45.0% 9/21 🟠 42.9% N/A 9/19 🟠 47.4% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Types 🟠 45.3% 49/179 🔴 27.4% N/A 81/108 🟡 75.0% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Bundle 🟠 45.5% 9/25 🔴 36.0% N/A 91/199 🟠 45.7% 10/18 🟠 55.6%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Unsafe.Handle 🟠 49.4% 5/8 🟡 62.5% N/A 72/148 🟠 48.6% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Coroutine 🟠 49.7% 12/23 🟠 52.2% N/A 65/132 🟠 49.2% 3/6 🟠 50.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.WorkflowInstance 🟠 50.0% 1/1 🟢 100.0% N/A 1/3 🔴 33.3% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.EphemeralServer 🟠 50.0% 4/13 🔴 30.8% N/A 64/122 🟠 52.5% 0/1 🔴 0.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Common.Async 🟠 50.0% 1/2 🟠 50.0% N/A 10/20 🟠 50.0% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Exception 🟠 52.0% 84/291 🔴 28.9% 2/3 🟡 66.7% 301/455 🟡 66.2% 5/5 🟢 100.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Testing.MockActivityEnvironment 🟠 52.9% 7/14 🟠 50.0% N/A 43/85 🟠 50.6% 5/5 🟢 100.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Operator 🟠 55.6% 3/12 🔴 25.0% 1/1 🟢 100.0% 53/92 🟠 57.6% 2/2 🟢 100.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow 🟠 58.2% 38/104 🔴 36.5% 2/3 🟡 66.7% 1237/2085 🟠 59.3% 31/56 🟠 55.4%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Worker 🟠 59.1% 42/111 🔴 37.8% 1/1 🟢 100.0% 601/997 🟡 60.3% 34/39 🟢 87.2%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Internal.Monad 🟡 60.6% 135/254 🟠 53.1% 1/3 🔴 33.3% 613/976 🟡 62.8% 2/3 🟡 66.7%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Client.Types 🟡 65.5% 49/104 🟠 47.1% N/A 124/159 🟡 78.0% 0/1 🔴 0.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Interceptor 🟡 67.6% 15/33 🟠 45.5% N/A 56/72 🟡 77.8% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Activity 🟡 69.8% 3/6 🟠 50.0% N/A 84/120 🟡 70.0% 3/3 🟢 100.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Duration 🟡 70.9% 27/64 🟠 42.2% 6/7 🟢 85.7% 213/274 🟡 77.7% 6/9 🟡 66.7%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.WorkflowInstance 🟡 71.2% 18/22 🟢 81.8% 2/2 🟢 100.0% 1258/1767 🟡 71.2% 29/42 🟡 69.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Client 🟡 73.6% 34/78 🟠 43.6% 5/7 🟡 71.4% 1455/1945 🟡 74.8% 26/33 🟡 78.8%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Contrib.OpenTelemetry 🟡 73.8% 3/7 🟠 42.9% N/A 518/700 🟡 74.0% 12/15 🟢 80.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Internal.Instance 🟡 74.7% 6/8 🟡 75.0% N/A 124/166 🟡 74.7% 6/8 🟡 75.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Activity.Worker 🟡 75.2% 23/36 🟡 63.9% N/A 420/555 🟡 75.7% 10/11 🟢 90.9%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Common.Logging 🟢 81.0% 11/14 🟡 78.6% 1/1 🟢 100.0% 87/106 🟢 82.1% 3/4 🟡 75.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Testing.Assertions 🟢 81.1% 6/11 🟠 54.5% N/A 24/26 🟢 92.3% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Worker 🟢 84.7% 15/22 🟡 68.2% 1/1 🟢 100.0% 630/740 🟢 85.1% 22/26 🟢 84.6%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Eval 🟢 91.1% 4/4 🟢 100.0% 3/3 🟢 100.0% 300/329 🟢 91.2% 9/9 🟢 100.0%
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.SearchAttributes.Internal 🟢 93.3% 5/5 🟢 100.0% N/A 23/25 🟢 92.0% N/A
temporal-sdk-2025.10.1.0-KbLX5CyBDl95aLVKKsIYt0/Temporal.Workflow.Unsafe 🟢 100.0% 1/1 🟢 100.0% N/A 6/6 🟢 100.0% N/A

🟢 ≥80% 🟡 ≥60% 🟠 ≥40% 🔴 <40%

signalWithArgs
1

-- liftIO $ threadDelay 1_000
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the test succeeds if this line is uncommented, so it looks like there is some sort of window of time affecting how state var changes get sequenced

Comment on lines +64 to +65
t <- now
readStateVar var >>= \s -> writeStateVar var (MinPQueue.insert t i s)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the fact that this works implies that things are getting processed in-order, so it looks like statevar operations are messed up.

fwiw i also tried this with modifyStateVar & it reproduced the issue which means it's not a read *> write sequence issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants