Durable Promise Specification

API + state-transition table for durable promises — the persistent coordination primitive of Distributed Async Await.

Units of coordination

Promises are fundamental units of coordination. Distributed Async Await proposes Durable Promises — promises that persist in storage and enable coordination across process boundaries.

Within the Distributed Async Await specification, each execution — whether a function execution or an action taking place in the physical world — pairs to a promise.

Distributed Async Await requires that promise data objects are stored to disk, thus making the promises durable, giving them the name Durable Promises.

A promise (also called future, awaitable, or deferred) is a representation of a future value. A promise is either pending or completed — that is, resolved or rejected. A promise is pending while the value is not yet available; once completed, it signals success (resolved) or failure (rejected).

Promise lifecycle diagram

A promise is a coordination primitive. In a typical scenario, a downstream function execution creates a promise and awaits its completion. An upstream function execution either resolves or rejects the promise. On completion, the downstream execution resumes with the value of the promise.

API#

Durable Promise Application Programming Interface

Logically, the Application Programming Interface (API) is divided into two parts: the Downstream API and the Upstream API.

Promise API illustration

Downstream API#

  • Create

    A downstream component may create a promise.

    code
    Create(promise-id, idempotency-key, param, header, timeout, strict)
  • Cancel

    A downstream component can cancel an existing promise.

    code
    Cancel(promise-id, idempotency-key, value, header, strict)
  • Callback

    A downstream component can register a callback on an existing promise.

    code
    Callback(id, promise-id, root-promise-id, timeout, recv)

    A recv specifies the transport on which the callback will occur. Below is a non-exhaustive list of supported receivers.

    TypeDataShorthand
    poll{"group": "string", "id": "string"}poll://group:id
    http{"headers": {"string": "string"}, "url": "string"}http://example.com

Upstream API#

  • Resolve

    An upstream component can resolve an existing promise, signaling success.

    code
    Resolve(promise-id, idempotency-key, value, header, strict)
  • Reject

    An upstream component can reject a promise, signalling failure.

    code
    Reject(promise-id, idempotency-key, value, header, strict)

OpenAPI spec example#

code
openapi: 3.0.0
info:
  title: Durable Promise API
  version: x.x.x
  license:
    name: Apache 2.0
    url: https://opensource.org/license/apache-2-0

servers:
  - url: https://your_public_api_url
    description: <your_public_server_description>
  - url: http://localhost:<port>
    description: <your_local_server_description>

paths:
  /promises:
    get:
      tags: [Promises]
      summary: Search promises
      operationId: searchPromises
      parameters:
        - in: header
          name: request-id
          schema: { type: string }
        - name: id
          in: query
          schema: { type: string }
        - name: state
          in: query
          schema: { type: string, enum: [pending, resolved, rejected] }
        - name: tags
          in: query
          style: deepObject
          explode: true
          schema:
            type: object
            additionalProperties: { type: string }
        - name: limit
          in: query
          schema: { type: integer }
        - name: cursor
          in: query
          schema: { type: string }
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  promises:
                    type: array
                    items:
                      $ref: "#/components/schemas/Promise"
                  cursor:
                    type: string
    post:
      tags: [Promises]
      summary: Create promise
      operationId: createPromise
      parameters:
        - in: header
          name: request-id
          schema: { type: string }
        - in: header
          name: idempotency-key
          schema: { type: string }
        - in: header
          name: strict
          schema: { type: boolean }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [id, timeout]
              properties:
                id: { type: string }
                timeout: { type: integer, format: int64 }
                param: { $ref: "#/components/schemas/Value" }
                tags:
                  type: object
                  additionalProperties: { type: string }
      responses:
        200:
          description: OK
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Promise" }
        201:
          description: Created
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Promise" }
        400: { description: Invalid request }
        403: { description: Forbidden }
        409: { description: Promise already exists }

  /promises/{id}:
    get:
      tags: [Promises]
      summary: Read promise
      operationId: readPromise
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
        - in: header
          name: request-id
          schema: { type: string }
      responses:
        200:
          description: OK
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Promise" }
        400: { description: Invalid request }
        404: { description: Promise not found }

    patch:
      tags: [Promises]
      summary: Complete promise
      operationId: completePromise
      parameters:
        - in: path
          name: id
          required: true
          schema: { type: string }
        - in: header
          name: request-id
          schema: { type: string }
        - in: header
          name: idempotency-key
          schema: { type: string }
        - in: header
          name: strict
          schema: { type: boolean }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [state]
              properties:
                state:
                  type: string
                  enum: [RESOLVED, REJECTED, REJECTED_CANCELED]
                value: { $ref: "#/components/schemas/Value" }
      responses:
        200:
          description: OK
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Promise" }
        400: { description: Invalid request }
        403: { description: Forbidden }
        404: { description: Promise not found }

components:
  schemas:
    Promise:
      type: object
      required: [id, state, timeout, param, value, tags]
      properties:
        id: { type: string }
        state:
          type: string
          enum:
            [PENDING, RESOLVED, REJECTED, REJECTED_CANCELED, REJECTED_TIMEDOUT]
        timeout: { type: integer, format: int64 }
        param: { $ref: "#/components/schemas/Value" }
        value: { $ref: "#/components/schemas/Value" }
        tags:
          type: object
          additionalProperties: { type: string }
        idempotencyKeyForCreate: { type: string, readOnly: true }
        idempotencyKeyForComplete: { type: string, readOnly: true }
        createdOn: { type: integer, format: int64 }
        completedOn: { type: integer, format: int64 }

    Value:
      type: object
      properties:
        headers:
          type: object
          additionalProperties: { type: string }
        data: { type: string }

    Task:
      type: object
      required: [id, version, state]
      properties:
        id: { type: string }
        state:
          type: string
          enum: [pending, acquired, suspended, fulfilled]
        version: { type: integer }
        timeout: { type: integer, format: int64 }
        processId: { type: string }
        createdOn: { type: integer, format: int64 }
        completedOn: { type: integer, format: int64 }

A task and its associated promise share an identifier; they are paired but distinct. A task carries a version that increments on every transition back to pending (release, resume, lease expiry). All mutating task operations require the caller to present the current version — a mismatch returns conflict (status 409).

For the full task lifecycle, operations, and invariants, see Tasks.

State transitions#

Current StateActionNext StateOutput
1InitCreate(id, -, T)Pending(id, -, -)OK
2InitCreate(id, -, F)Pending(id, -, -)OK
3InitCreate(id, ikc, T)Pending(id, ikc, -)OK
4InitCreate(id, ikc, F)Pending(id, ikc, -)OK
5InitResolve(id, -, T)InitKO, Already Init
6InitResolve(id, -, F)InitKO, Already Init
7InitResolve(id, iku, T)InitKO, Already Init
8InitResolve(id, iku, F)InitKO, Already Init
9InitReject(id, -, T)InitKO, Already Init
10InitReject(id, -, F)InitKO, Already Init
11InitReject(id, iku, T)InitKO, Already Init
12InitReject(id, iku, F)InitKO, Already Init
13InitCancel(id, -, T)InitKO, Already Init
14InitCancel(id, -, F)InitKO, Already Init
15InitCancel(id, iku, T)InitKO, Already Init
16InitCancel(id, iku, F)InitKO, Already Init
17Pending(id, -, -)Create(id, -, T)Pending(id, -, -)KO, Already Pending
18Pending(id, -, -)Create(id, -, F)Pending(id, -, -)KO, Already Pending
19Pending(id, -, -)Create(id, ikc, T)Pending(id, -, -)KO, Already Pending
20Pending(id, -, -)Create(id, ikc, F)Pending(id, -, -)KO, Already Pending
21Pending(id, -, -)Resolve(id, -, T)Resolved(id, -, -)OK
22Pending(id, -, -)Resolve(id, -, F)Resolved(id, -, -)OK
23Pending(id, -, -)Resolve(id, iku, T)Resolved(id, -, iku)OK
24Pending(id, -, -)Resolve(id, iku, F)Resolved(id, -, iku)OK
25Pending(id, -, -)Reject(id, -, T)Rejected(id, -, -)OK
26Pending(id, -, -)Reject(id, -, F)Rejected(id, -, -)OK
27Pending(id, -, -)Reject(id, iku, T)Rejected(id, -, iku)OK
28Pending(id, -, -)Reject(id, iku, F)Rejected(id, -, iku)OK
29Pending(id, -, -)Cancel(id, -, T)Canceled(id, -, -)OK
30Pending(id, -, -)Cancel(id, -, F)Canceled(id, -, -)OK
31Pending(id, -, -)Cancel(id, iku, T)Canceled(id, -, iku)OK
32Pending(id, -, -)Cancel(id, iku, F)Canceled(id, -, iku)OK
33Pending(id, ikc, -)Create(id, -, T)Pending(id, ikc, -)KO, Already Pending
34Pending(id, ikc, -)Create(id, -, F)Pending(id, ikc, -)KO, Already Pending
35Pending(id, ikc, -)Create(id, ikc, T)Pending(id, ikc, -)OK, Deduplicated
36Pending(id, ikc, -)Create(id, ikc, F)Pending(id, ikc, -)OK, Deduplicated
37Pending(id, ikc, -)Create(id, ikc*, T)Pending(id, ikc, -)KO, Already Pending
38Pending(id, ikc, -)Create(id, ikc*, F)Pending(id, ikc, -)KO, Already Pending
39Pending(id, ikc, -)Resolve(id, -, T)Resolved(id, ikc, -)OK
40Pending(id, ikc, -)Resolve(id, -, F)Resolved(id, ikc, -)OK
41Pending(id, ikc, -)Resolve(id, iku, T)Resolved(id, ikc, iku)OK
42Pending(id, ikc, -)Resolve(id, iku, F)Resolved(id, ikc, iku)OK
43Pending(id, ikc, -)Reject(id, -, T)Rejected(id, ikc, -)OK
44Pending(id, ikc, -)Reject(id, -, F)Rejected(id, ikc, -)OK
45Pending(id, ikc, -)Reject(id, iku, T)Rejected(id, ikc, iku)OK
46Pending(id, ikc, -)Reject(id, iku, F)Rejected(id, ikc, iku)OK
47Pending(id, ikc, -)Cancel(id, -, T)Canceled(id, ikc, -)OK
48Pending(id, ikc, -)Cancel(id, -, F)Canceled(id, ikc, -)OK
49Pending(id, ikc, -)Cancel(id, iku, T)Canceled(id, ikc, iku)OK
50Pending(id, ikc, -)Cancel(id, iku, F)Canceled(id, ikc, iku)OK
51Resolved(id, -, -)Create(id, -, T)Resolved(id, -, -)KO, Already Resolved
52Resolved(id, -, -)Create(id, -, F)Resolved(id, -, -)KO, Already Resolved
53Resolved(id, -, -)Create(id, ikc, T)Resolved(id, -, -)KO, Already Resolved
54Resolved(id, -, -)Create(id, ikc, F)Resolved(id, -, -)KO, Already Resolved
55Resolved(id, -, -)Resolve(id, -, T)Resolved(id, -, -)KO, Already Resolved
56Resolved(id, -, -)Resolve(id, -, F)Resolved(id, -, -)KO, Already Resolved
57Resolved(id, -, -)Resolve(id, iku, T)Resolved(id, -, -)KO, Already Resolved
58Resolved(id, -, -)Resolve(id, iku, F)Resolved(id, -, -)KO, Already Resolved
59Resolved(id, -, -)Reject(id, -, T)Resolved(id, -, -)KO, Already Resolved
60Resolved(id, -, -)Reject(id, -, F)Resolved(id, -, -)KO, Already Resolved
61Resolved(id, -, -)Reject(id, iku, T)Resolved(id, -, -)KO, Already Resolved
62Resolved(id, -, -)Reject(id, iku, F)Resolved(id, -, -)KO, Already Resolved
63Resolved(id, -, -)Cancel(id, -, T)Resolved(id, -, -)KO, Already Resolved
64Resolved(id, -, -)Cancel(id, -, F)Resolved(id, -, -)KO, Already Resolved
65Resolved(id, -, -)Cancel(id, iku, T)Resolved(id, -, -)KO, Already Resolved
66Resolved(id, -, -)Cancel(id, iku, F)Resolved(id, -, -)KO, Already Resolved
67Resolved(id, -, iku)Create(id, -, T)Resolved(id, -, iku)KO, Already Resolved
68Resolved(id, -, iku)Create(id, -, F)Resolved(id, -, iku)KO, Already Resolved
69Resolved(id, -, iku)Create(id, ikc, T)Resolved(id, -, iku)KO, Already Resolved
70Resolved(id, -, iku)Create(id, ikc, F)Resolved(id, -, iku)KO, Already Resolved
71Resolved(id, -, iku)Resolve(id, -, T)Resolved(id, -, iku)KO, Already Resolved
72Resolved(id, -, iku)Resolve(id, -, F)Resolved(id, -, iku)KO, Already Resolved
73Resolved(id, -, iku)Resolve(id, iku, T)Resolved(id, -, iku)OK, Deduplicated
74Resolved(id, -, iku)Resolve(id, iku, F)Resolved(id, -, iku)OK, Deduplicated
75Resolved(id, -, iku)Resolve(id, iku*, T)Resolved(id, -, iku)KO, Already Resolved
76Resolved(id, -, iku)Resolve(id, iku*, F)Resolved(id, -, iku)KO, Already Resolved
77Resolved(id, -, iku)Reject(id, -, T)Resolved(id, -, iku)KO, Already Resolved
78Resolved(id, -, iku)Reject(id, -, F)Resolved(id, -, iku)KO, Already Resolved
79Resolved(id, -, iku)Reject(id, iku, T)Resolved(id, -, iku)KO, Already Resolved
80Resolved(id, -, iku)Reject(id, iku, F)Resolved(id, -, iku)OK, Deduplicated
81Resolved(id, -, iku)Reject(id, iku*, T)Resolved(id, -, iku)KO, Already Resolved
82Resolved(id, -, iku)Reject(id, iku*, F)Resolved(id, -, iku)KO, Already Resolved
83Resolved(id, -, iku)Cancel(id, -, T)Resolved(id, -, iku)KO, Already Resolved
84Resolved(id, -, iku)Cancel(id, -, F)Resolved(id, -, iku)KO, Already Resolved
85Resolved(id, -, iku)Cancel(id, iku, T)Resolved(id, -, iku)KO, Already Resolved
86Resolved(id, -, iku)Cancel(id, iku, F)Resolved(id, -, iku)OK, Deduplicated
87Resolved(id, -, iku)Cancel(id, iku*, T)Resolved(id, -, iku)KO, Already Resolved
88Resolved(id, -, iku)Cancel(id, iku*, F)Resolved(id, -, iku)KO, Already Resolved
89Resolved(id, ikc, -)Create(id, -, T)Resolved(id, ikc, -)KO, Already Resolved
90Resolved(id, ikc, -)Create(id, -, F)Resolved(id, ikc, -)KO, Already Resolved
91Resolved(id, ikc, -)Create(id, ikc, T)Resolved(id, ikc, -)KO, Already Resolved
92Resolved(id, ikc, -)Create(id, ikc, F)Resolved(id, ikc, -)OK, Deduplicated
93Resolved(id, ikc, -)Create(id, ikc*, T)Resolved(id, ikc, -)KO, Already Resolved
94Resolved(id, ikc, -)Create(id, ikc*, F)Resolved(id, ikc, -)KO, Already Resolved
95Resolved(id, ikc, -)Resolve(id, -, T)Resolved(id, ikc, -)KO, Already Resolved
96Resolved(id, ikc, -)Resolve(id, -, F)Resolved(id, ikc, -)KO, Already Resolved
97Resolved(id, ikc, -)Resolve(id, iku, T)Resolved(id, ikc, -)KO, Already Resolved
98Resolved(id, ikc, -)Resolve(id, iku, F)Resolved(id, ikc, -)KO, Already Resolved
99Resolved(id, ikc, -)Reject(id, -, T)Resolved(id, ikc, -)KO, Already Resolved
100Resolved(id, ikc, -)Reject(id, -, F)Resolved(id, ikc, -)KO, Already Resolved
101Resolved(id, ikc, -)Reject(id, iku, T)Resolved(id, ikc, -)KO, Already Resolved
102Resolved(id, ikc, -)Reject(id, iku, F)Resolved(id, ikc, -)KO, Already Resolved
103Resolved(id, ikc, -)Cancel(id, -, T)Resolved(id, ikc, -)KO, Already Resolved
104Resolved(id, ikc, -)Cancel(id, -, F)Resolved(id, ikc, -)KO, Already Resolved
105Resolved(id, ikc, -)Cancel(id, iku, T)Resolved(id, ikc, -)KO, Already Resolved
106Resolved(id, ikc, -)Cancel(id, iku, F)Resolved(id, ikc, -)KO, Already Resolved
107Resolved(id, ikc, iku)Create(id, -, T)Resolved(id, ikc, iku)KO, Already Resolved
108Resolved(id, ikc, iku)Create(id, -, F)Resolved(id, ikc, iku)KO, Already Resolved
109Resolved(id, ikc, iku)Create(id, ikc, T)Resolved(id, ikc, iku)KO, Already Resolved
110Resolved(id, ikc, iku)Create(id, ikc, F)Resolved(id, ikc, iku)OK, Deduplicated
111Resolved(id, ikc, iku)Create(id, ikc*, T)Resolved(id, ikc, iku)KO, Already Resolved
112Resolved(id, ikc, iku)Create(id, ikc*, F)Resolved(id, ikc, iku)KO, Already Resolved
113Resolved(id, ikc, iku)Resolve(id, -, T)Resolved(id, ikc, iku)KO, Already Resolved
114Resolved(id, ikc, iku)Resolve(id, -, F)Resolved(id, ikc, iku)KO, Already Resolved
115Resolved(id, ikc, iku)Resolve(id, iku, T)Resolved(id, ikc, iku)OK, Deduplicated
116Resolved(id, ikc, iku)Resolve(id, iku, F)Resolved(id, ikc, iku)OK, Deduplicated
117Resolved(id, ikc, iku)Resolve(id, iku*, T)Resolved(id, ikc, iku)KO, Already Resolved
118Resolved(id, ikc, iku)Resolve(id, iku*, F)Resolved(id, ikc, iku)KO, Already Resolved
119Resolved(id, ikc, iku)Reject(id, -, T)Resolved(id, ikc, iku)KO, Already Resolved
120Resolved(id, ikc, iku)Reject(id, -, F)Resolved(id, ikc, iku)KO, Already Resolved
121Resolved(id, ikc, iku)Reject(id, iku, T)Resolved(id, ikc, iku)KO, Already Resolved
122Resolved(id, ikc, iku)Reject(id, iku, F)Resolved(id, ikc, iku)OK, Deduplicated
123Resolved(id, ikc, iku)Reject(id, iku*, T)Resolved(id, ikc, iku)KO, Already Resolved
124Resolved(id, ikc, iku)Reject(id, iku*, F)Resolved(id, ikc, iku)KO, Already Resolved
125Resolved(id, ikc, iku)Cancel(id, -, T)Resolved(id, ikc, iku)KO, Already Resolved
126Resolved(id, ikc, iku)Cancel(id, -, F)Resolved(id, ikc, iku)KO, Already Resolved
127Resolved(id, ikc, iku)Cancel(id, iku, T)Resolved(id, ikc, iku)KO, Already Resolved
128Resolved(id, ikc, iku)Cancel(id, iku, F)Resolved(id, ikc, iku)OK, Deduplicated
129Resolved(id, ikc, iku)Cancel(id, iku*, T)Resolved(id, ikc, iku)KO, Already Resolved
130Resolved(id, ikc, iku)Cancel(id, iku*, F)Resolved(id, ikc, iku)KO, Already Resolved
131Rejected(id, -, -)Create(id, -, T)Rejected(id, -, -)KO, Already Rejected
132Rejected(id, -, -)Create(id, -, F)Rejected(id, -, -)KO, Already Rejected
133Rejected(id, -, -)Create(id, ikc, T)Rejected(id, -, -)KO, Already Rejected
134Rejected(id, -, -)Create(id, ikc, F)Rejected(id, -, -)KO, Already Rejected
135Rejected(id, -, -)Resolve(id, -, T)Rejected(id, -, -)KO, Already Rejected
136Rejected(id, -, -)Resolve(id, -, F)Rejected(id, -, -)KO, Already Rejected
137Rejected(id, -, -)Resolve(id, iku, T)Rejected(id, -, -)KO, Already Rejected
138Rejected(id, -, -)Resolve(id, iku, F)Rejected(id, -, -)KO, Already Rejected
139Rejected(id, -, -)Reject(id, -, T)Rejected(id, -, -)KO, Already Rejected
140Rejected(id, -, -)Reject(id, -, F)Rejected(id, -, -)KO, Already Rejected
141Rejected(id, -, -)Reject(id, iku, T)Rejected(id, -, -)KO, Already Rejected
142Rejected(id, -, -)Reject(id, iku, F)Rejected(id, -, -)KO, Already Rejected
143Rejected(id, -, -)Cancel(id, -, T)Rejected(id, -, -)KO, Already Rejected
144Rejected(id, -, -)Cancel(id, -, F)Rejected(id, -, -)KO, Already Rejected
145Rejected(id, -, -)Cancel(id, iku, T)Rejected(id, -, -)KO, Already Rejected
146Rejected(id, -, -)Cancel(id, iku, F)Rejected(id, -, -)KO, Already Rejected
147Rejected(id, -, iku)Create(id, -, T)Rejected(id, -, iku)KO, Already Rejected
148Rejected(id, -, iku)Create(id, -, F)Rejected(id, -, iku)KO, Already Rejected
149Rejected(id, -, iku)Create(id, ikc, T)Rejected(id, -, iku)KO, Already Rejected
150Rejected(id, -, iku)Create(id, ikc, F)Rejected(id, -, iku)KO, Already Rejected
151Rejected(id, -, iku)Resolve(id, -, T)Rejected(id, -, iku)KO, Already Rejected
152Rejected(id, -, iku)Resolve(id, -, F)Rejected(id, -, iku)KO, Already Rejected
153Rejected(id, -, iku)Resolve(id, iku, T)Rejected(id, -, iku)KO, Already Rejected
154Rejected(id, -, iku)Resolve(id, iku, F)Rejected(id, -, iku)OK, Deduplicated
155Rejected(id, -, iku)Resolve(id, iku*, T)Rejected(id, -, iku)KO, Already Rejected
156Rejected(id, -, iku)Resolve(id, iku*, F)Rejected(id, -, iku)KO, Already Rejected
157Rejected(id, -, iku)Reject(id, -, T)Rejected(id, -, iku)KO, Already Rejected
158Rejected(id, -, iku)Reject(id, -, F)Rejected(id, -, iku)KO, Already Rejected
159Rejected(id, -, iku)Reject(id, iku, T)Rejected(id, -, iku)OK, Deduplicated
160Rejected(id, -, iku)Reject(id, iku, F)Rejected(id, -, iku)OK, Deduplicated
161Rejected(id, -, iku)Reject(id, iku*, T)Rejected(id, -, iku)KO, Already Rejected
162Rejected(id, -, iku)Reject(id, iku*, F)Rejected(id, -, iku)KO, Already Rejected
163Rejected(id, -, iku)Cancel(id, -, T)Rejected(id, -, iku)KO, Already Rejected
164Rejected(id, -, iku)Cancel(id, -, F)Rejected(id, -, iku)KO, Already Rejected
165Rejected(id, -, iku)Cancel(id, iku, T)Rejected(id, -, iku)KO, Already Rejected
166Rejected(id, -, iku)Cancel(id, iku, F)Rejected(id, -, iku)OK, Deduplicated
167Rejected(id, -, iku)Cancel(id, iku*, T)Rejected(id, -, iku)KO, Already Rejected
168Rejected(id, -, iku)Cancel(id, iku*, F)Rejected(id, -, iku)KO, Already Rejected
169Rejected(id, ikc, -)Create(id, -, T)Rejected(id, ikc, -)KO, Already Rejected
170Rejected(id, ikc, -)Create(id, -, F)Rejected(id, ikc, -)KO, Already Rejected
171Rejected(id, ikc, -)Create(id, ikc, T)Rejected(id, ikc, -)KO, Already Rejected
172Rejected(id, ikc, -)Create(id, ikc, F)Rejected(id, ikc, -)OK, Deduplicated
173Rejected(id, ikc, -)Create(id, ikc*, T)Rejected(id, ikc, -)KO, Already Rejected
174Rejected(id, ikc, -)Create(id, ikc*, F)Rejected(id, ikc, -)KO, Already Rejected
175Rejected(id, ikc, -)Resolve(id, -, T)Rejected(id, ikc, -)KO, Already Rejected
176Rejected(id, ikc, -)Resolve(id, -, F)Rejected(id, ikc, -)KO, Already Rejected
177Rejected(id, ikc, -)Resolve(id, iku, T)Rejected(id, ikc, -)KO, Already Rejected
178Rejected(id, ikc, -)Resolve(id, iku, F)Rejected(id, ikc, -)KO, Already Rejected
179Rejected(id, ikc, -)Reject(id, -, T)Rejected(id, ikc, -)KO, Already Rejected
180Rejected(id, ikc, -)Reject(id, -, F)Rejected(id, ikc, -)KO, Already Rejected
181Rejected(id, ikc, -)Reject(id, iku, T)Rejected(id, ikc, -)KO, Already Rejected
182Rejected(id, ikc, -)Reject(id, iku, F)Rejected(id, ikc, -)KO, Already Rejected
183Rejected(id, ikc, -)Cancel(id, -, T)Rejected(id, ikc, -)KO, Already Rejected
184Rejected(id, ikc, -)Cancel(id, -, F)Rejected(id, ikc, -)KO, Already Rejected
185Rejected(id, ikc, -)Cancel(id, iku, T)Rejected(id, ikc, -)KO, Already Rejected
186Rejected(id, ikc, -)Cancel(id, iku, F)Rejected(id, ikc, -)KO, Already Rejected
187Rejected(id, ikc, iku)Create(id, -, T)Rejected(id, ikc, iku)KO, Already Rejected
188Rejected(id, ikc, iku)Create(id, -, F)Rejected(id, ikc, iku)KO, Already Rejected
189Rejected(id, ikc, iku)Create(id, ikc, T)Rejected(id, ikc, iku)KO, Already Rejected
190Rejected(id, ikc, iku)Create(id, ikc, F)Rejected(id, ikc, iku)OK, Deduplicated
191Rejected(id, ikc, iku)Create(id, ikc*, T)Rejected(id, ikc, iku)KO, Already Rejected
192Rejected(id, ikc, iku)Create(id, ikc*, F)Rejected(id, ikc, iku)KO, Already Rejected
193Rejected(id, ikc, iku)Resolve(id, -, T)Rejected(id, ikc, iku)KO, Already Rejected
194Rejected(id, ikc, iku)Resolve(id, -, F)Rejected(id, ikc, iku)KO, Already Rejected
195Rejected(id, ikc, iku)Resolve(id, iku, T)Rejected(id, ikc, iku)KO, Already Rejected
196Rejected(id, ikc, iku)Resolve(id, iku, F)Rejected(id, ikc, iku)OK, Deduplicated
197Rejected(id, ikc, iku)Resolve(id, iku*, T)Rejected(id, ikc, iku)KO, Already Rejected
198Rejected(id, ikc, iku)Resolve(id, iku*, F)Rejected(id, ikc, iku)KO, Already Rejected
199Rejected(id, ikc, iku)Reject(id, -, T)Rejected(id, ikc, iku)KO, Already Rejected
200Rejected(id, ikc, iku)Reject(id, -, F)Rejected(id, ikc, iku)KO, Already Rejected
201Rejected(id, ikc, iku)Reject(id, iku, T)Rejected(id, ikc, iku)OK, Deduplicated
202Rejected(id, ikc, iku)Reject(id, iku, F)Rejected(id, ikc, iku)OK, Deduplicated
203Rejected(id, ikc, iku)Reject(id, iku*, T)Rejected(id, ikc, iku)KO, Already Rejected
204Rejected(id, ikc, iku)Reject(id, iku*, F)Rejected(id, ikc, iku)KO, Already Rejected
205Rejected(id, ikc, iku)Cancel(id, -, T)Rejected(id, ikc, iku)KO, Already Rejected
206Rejected(id, ikc, iku)Cancel(id, -, F)Rejected(id, ikc, iku)KO, Already Rejected
207Rejected(id, ikc, iku)Cancel(id, iku, T)Rejected(id, ikc, iku)KO, Already Rejected
208Rejected(id, ikc, iku)Cancel(id, iku, F)Rejected(id, ikc, iku)OK, Deduplicated
209Rejected(id, ikc, iku)Cancel(id, iku*, T)Rejected(id, ikc, iku)KO, Already Rejected
210Rejected(id, ikc, iku)Cancel(id, iku*, F)Rejected(id, ikc, iku)KO, Already Rejected
211Canceled(id, -, -)Create(id, -, T)Canceled(id, -, -)KO, Already Canceled
212Canceled(id, -, -)Create(id, -, F)Canceled(id, -, -)KO, Already Canceled
213Canceled(id, -, -)Create(id, ikc, T)Canceled(id, -, -)KO, Already Canceled
214Canceled(id, -, -)Create(id, ikc, F)Canceled(id, -, -)KO, Already Canceled
215Canceled(id, -, -)Resolve(id, -, T)Canceled(id, -, -)KO, Already Canceled
216Canceled(id, -, -)Resolve(id, -, F)Canceled(id, -, -)KO, Already Canceled
217Canceled(id, -, -)Resolve(id, iku, T)Canceled(id, -, -)KO, Already Canceled
218Canceled(id, -, -)Resolve(id, iku, F)Canceled(id, -, -)KO, Already Canceled
219Canceled(id, -, -)Reject(id, -, T)Canceled(id, -, -)KO, Already Canceled
220Canceled(id, -, -)Reject(id, -, F)Canceled(id, -, -)KO, Already Canceled
221Canceled(id, -, -)Reject(id, iku, T)Canceled(id, -, -)KO, Already Canceled
222Canceled(id, -, -)Reject(id, iku, F)Canceled(id, -, -)KO, Already Canceled
223Canceled(id, -, -)Cancel(id, -, T)Canceled(id, -, -)KO, Already Canceled
224Canceled(id, -, -)Cancel(id, -, F)Canceled(id, -, -)KO, Already Canceled
225Canceled(id, -, -)Cancel(id, iku, T)Canceled(id, -, -)KO, Already Canceled
226Canceled(id, -, -)Cancel(id, iku, F)Canceled(id, -, -)KO, Already Canceled
227Canceled(id, -, iku)Create(id, -, T)Canceled(id, -, iku)KO, Already Canceled
228Canceled(id, -, iku)Create(id, -, F)Canceled(id, -, iku)KO, Already Canceled
229Canceled(id, -, iku)Create(id, ikc, T)Canceled(id, -, iku)KO, Already Canceled
230Canceled(id, -, iku)Create(id, ikc, F)Canceled(id, -, iku)KO, Already Canceled
231Canceled(id, -, iku)Resolve(id, -, T)Canceled(id, -, iku)KO, Already Canceled
232Canceled(id, -, iku)Resolve(id, -, F)Canceled(id, -, iku)KO, Already Canceled
233Canceled(id, -, iku)Resolve(id, iku, T)Canceled(id, -, iku)KO, Already Canceled
234Canceled(id, -, iku)Resolve(id, iku, F)Canceled(id, -, iku)OK, Deduplicated
235Canceled(id, -, iku)Resolve(id, iku*, T)Canceled(id, -, iku)KO, Already Canceled
236Canceled(id, -, iku)Resolve(id, iku*, F)Canceled(id, -, iku)KO, Already Canceled
237Canceled(id, -, iku)Reject(id, -, T)Canceled(id, -, iku)KO, Already Canceled
238Canceled(id, -, iku)Reject(id, -, F)Canceled(id, -, iku)KO, Already Canceled
239Canceled(id, -, iku)Reject(id, iku, T)Canceled(id, -, iku)KO, Already Canceled
240Canceled(id, -, iku)Reject(id, iku, F)Canceled(id, -, iku)OK, Deduplicated
241Canceled(id, -, iku)Reject(id, iku*, T)Canceled(id, -, iku)KO, Already Canceled
242Canceled(id, -, iku)Reject(id, iku*, F)Canceled(id, -, iku)KO, Already Canceled
243Canceled(id, -, iku)Cancel(id, -, T)Canceled(id, -, iku)KO, Already Canceled
244Canceled(id, -, iku)Cancel(id, -, F)Canceled(id, -, iku)KO, Already Canceled
245Canceled(id, -, iku)Cancel(id, iku, T)Canceled(id, -, iku)OK, Deduplicated
246Canceled(id, -, iku)Cancel(id, iku, F)Canceled(id, -, iku)OK, Deduplicated
247Canceled(id, -, iku)Cancel(id, iku*, T)Canceled(id, -, iku)KO, Already Canceled
248Canceled(id, -, iku)Cancel(id, iku*, F)Canceled(id, -, iku)KO, Already Canceled
249Canceled(id, ikc, -)Create(id, -, T)Canceled(id, ikc, -)KO, Already Canceled
250Canceled(id, ikc, -)Create(id, -, F)Canceled(id, ikc, -)KO, Already Canceled
251Canceled(id, ikc, -)Create(id, ikc, T)Canceled(id, ikc, -)KO, Already Canceled
252Canceled(id, ikc, -)Create(id, ikc, F)Canceled(id, ikc, -)OK, Deduplicated
253Canceled(id, ikc, -)Create(id, ikc*, T)Canceled(id, ikc, -)KO, Already Canceled
254Canceled(id, ikc, -)Create(id, ikc*, F)Canceled(id, ikc, -)KO, Already Canceled
255Canceled(id, ikc, -)Resolve(id, -, T)Canceled(id, ikc, -)KO, Already Canceled
256Canceled(id, ikc, -)Resolve(id, -, F)Canceled(id, ikc, -)KO, Already Canceled
257Canceled(id, ikc, -)Resolve(id, iku, T)Canceled(id, ikc, -)KO, Already Canceled
258Canceled(id, ikc, -)Resolve(id, iku, F)Canceled(id, ikc, -)KO, Already Canceled
259Canceled(id, ikc, -)Reject(id, -, T)Canceled(id, ikc, -)KO, Already Canceled
260Canceled(id, ikc, -)Reject(id, -, F)Canceled(id, ikc, -)KO, Already Canceled
261Canceled(id, ikc, -)Reject(id, iku, T)Canceled(id, ikc, -)KO, Already Canceled
262Canceled(id, ikc, -)Reject(id, iku, F)Canceled(id, ikc, -)KO, Already Canceled
263Canceled(id, ikc, -)Cancel(id, -, T)Canceled(id, ikc, -)KO, Already Canceled
264Canceled(id, ikc, -)Cancel(id, -, F)Canceled(id, ikc, -)KO, Already Canceled
265Canceled(id, ikc, -)Cancel(id, iku, T)Canceled(id, ikc, -)KO, Already Canceled
266Canceled(id, ikc, -)Cancel(id, iku, F)Canceled(id, ikc, -)KO, Already Canceled
267Canceled(id, ikc, iku)Create(id, -, T)Canceled(id, ikc, iku)KO, Already Canceled
268Canceled(id, ikc, iku)Create(id, -, F)Canceled(id, ikc, iku)KO, Already Canceled
269Canceled(id, ikc, iku)Create(id, ikc, T)Canceled(id, ikc, iku)KO, Already Canceled
270Canceled(id, ikc, iku)Create(id, ikc, F)Canceled(id, ikc, iku)OK, Deduplicated
271Canceled(id, ikc, iku)Create(id, ikc*, T)Canceled(id, ikc, iku)KO, Already Canceled
272Canceled(id, ikc, iku)Create(id, ikc*, F)Canceled(id, ikc, iku)KO, Already Canceled
273Canceled(id, ikc, iku)Resolve(id, -, T)Canceled(id, ikc, iku)KO, Already Canceled
274Canceled(id, ikc, iku)Resolve(id, -, F)Canceled(id, ikc, iku)KO, Already Canceled
275Canceled(id, ikc, iku)Resolve(id, iku, T)Canceled(id, ikc, iku)KO, Already Canceled
276Canceled(id, ikc, iku)Resolve(id, iku, F)Canceled(id, ikc, iku)OK, Deduplicated
277Canceled(id, ikc, iku)Resolve(id, iku*, T)Canceled(id, ikc, iku)KO, Already Canceled
278Canceled(id, ikc, iku)Resolve(id, iku*, F)Canceled(id, ikc, iku)KO, Already Canceled
279Canceled(id, ikc, iku)Reject(id, -, T)Canceled(id, ikc, iku)KO, Already Canceled
280Canceled(id, ikc, iku)Reject(id, -, F)Canceled(id, ikc, iku)KO, Already Canceled
281Canceled(id, ikc, iku)Reject(id, iku, T)Canceled(id, ikc, iku)OK, Deduplicated
282Canceled(id, ikc, iku)Reject(id, iku, F)Canceled(id, ikc, iku)OK, Deduplicated
283Canceled(id, ikc, iku)Reject(id, iku*, T)Canceled(id, ikc, iku)KO, Already Canceled
284Canceled(id, ikc, iku)Reject(id, iku*, F)Canceled(id, ikc, iku)KO, Already Canceled
285Canceled(id, ikc, iku)Cancel(id, -, T)Canceled(id, ikc, iku)KO, Already Canceled
286Canceled(id, ikc, iku)Cancel(id, -, F)Canceled(id, ikc, iku)KO, Already Canceled
287Canceled(id, ikc, iku)Cancel(id, iku, T)Canceled(id, ikc, iku)OK, Deduplicated
288Canceled(id, ikc, iku)Cancel(id, iku, F)Canceled(id, ikc, iku)OK, Deduplicated
289Canceled(id, ikc, iku)Cancel(id, iku*, T)Canceled(id, ikc, iku)KO, Already Canceled
290Canceled(id, ikc, iku)Cancel(id, iku*, F)Canceled(id, ikc, iku)KO, Already Canceled
291Timedout(id, -, -)Create(id, -, T)Timedout(id, -, -)KO, Already Timedout
292Timedout(id, -, -)Create(id, -, F)Timedout(id, -, -)KO, Already Timedout
293Timedout(id, -, -)Create(id, ikc, T)Timedout(id, -, -)KO, Already Timedout
294Timedout(id, -, -)Create(id, ikc, F)Timedout(id, -, -)KO, Already Timedout
295Timedout(id, -, -)Resolve(id, -, T)Timedout(id, -, -)KO, Already Timedout
296Timedout(id, -, -)Resolve(id, -, F)Timedout(id, -, -)OK, Deduplicated
297Timedout(id, -, -)Resolve(id, iku, T)Timedout(id, -, -)KO, Already Timedout
298Timedout(id, -, -)Resolve(id, iku, F)Timedout(id, -, -)OK, Deduplicated
299Timedout(id, -, -)Reject(id, -, T)Timedout(id, -, -)KO, Already Timedout
300Timedout(id, -, -)Reject(id, -, F)Timedout(id, -, -)OK, Deduplicated
301Timedout(id, -, -)Reject(id, iku, T)Timedout(id, -, -)KO, Already Timedout
302Timedout(id, -, -)Reject(id, iku, F)Timedout(id, -, -)OK, Deduplicated
303Timedout(id, -, -)Cancel(id, -, T)Timedout(id, -, -)KO, Already Timedout
304Timedout(id, -, -)Cancel(id, -, F)Timedout(id, -, -)OK, Deduplicated
305Timedout(id, -, -)Cancel(id, iku, T)Timedout(id, -, -)KO, Already Timedout
306Timedout(id, -, -)Cancel(id, iku, F)Timedout(id, -, -)OK, Deduplicated
307Timedout(id, ikc, -)Create(id, -, T)Timedout(id, ikc, -)KO, Already Timedout
308Timedout(id, ikc, -)Create(id, -, F)Timedout(id, ikc, -)KO, Already Timedout
309Timedout(id, ikc, -)Create(id, ikc, T)Timedout(id, ikc, -)KO, Already Timedout
310Timedout(id, ikc, -)Create(id, ikc, F)Timedout(id, ikc, -)OK, Deduplicated
311Timedout(id, ikc, -)Create(id, ikc*, T)Timedout(id, ikc, -)KO, Already Timedout
312Timedout(id, ikc, -)Create(id, ikc*, F)Timedout(id, ikc, -)KO, Already Timedout
313Timedout(id, ikc, -)Resolve(id, -, T)Timedout(id, ikc, -)KO, Already Timedout
314Timedout(id, ikc, -)Resolve(id, -, F)Timedout(id, ikc, -)OK, Deduplicated
315Timedout(id, ikc, -)Resolve(id, iku, T)Timedout(id, ikc, -)KO, Already Timedout
316Timedout(id, ikc, -)Resolve(id, iku, F)Timedout(id, ikc, -)OK, Deduplicated
317Timedout(id, ikc, -)Reject(id, -, T)Timedout(id, ikc, -)KO, Already Timedout
318Timedout(id, ikc, -)Reject(id, -, F)Timedout(id, ikc, -)OK, Deduplicated
319Timedout(id, ikc, -)Reject(id, iku, T)Timedout(id, ikc, -)KO, Already Timedout
320Timedout(id, ikc, -)Reject(id, iku, F)Timedout(id, ikc, -)OK, Deduplicated
321Timedout(id, ikc, -)Cancel(id, -, T)Timedout(id, ikc, -)KO, Already Timedout
322Timedout(id, ikc, -)Cancel(id, -, F)Timedout(id, ikc, -)OK, Deduplicated
323Timedout(id, ikc, -)Cancel(id, iku, T)Timedout(id, ikc, -)KO, Already Timedout
324Timedout(id, ikc, -)Cancel(id, iku, F)Timedout(id, ikc, -)OK, Deduplicated