# Independent Branch Expiry

Safety T1 and Fraud T1 expire atomically and recover in parallel because neither is an ancestor.

- Workflow: `IndependentExpiry@1@1`
- Static graph: 7 nodes, 13 edges
- Timeline: 5 ticks

## Static graph context

- **TEST:** `safety_t1` → `fraud_t1` → `safety_t2` → `fraud_t2`

## Tick 1: Start workflow

**Workflow status:** `WAITING`<br>
**Active/current:** `start`<br>
**Input event:** `start`

### Edge evaluation

**Evaluated**

- _No evaluated-edge detail recorded._

**Traversed**

- _No edge traversed in this tick._

### Review requests

| Activation | Task | Idempotency key |
|---|---|---|
| _none_ | — | — |

### Join state

- `join` (ALL): 0/2 arrivals; **waiting**

### Activation history

| Seq | Node | Activation | Status | Result / task |
|---:|---|---:|---|---|
| 1 | `start` | 1 | WAITING | — |

## Tick 2: Complete start

**Workflow status:** `WAITING`<br>
**Active/current:** `fraud\_t1`, `safety\_t1`<br>
**Input event:** `complete\_latest`

### Edge evaluation

**Evaluated**

- `e1`: `start` → `safety\_t1`
- `e3`: `start` → `fraud\_t1`

**Traversed**

- `e1`: `start` → `safety\_t1`
- `e3`: `start` → `fraud\_t1`

### Review requests

| Activation | Task | Idempotency key |
|---|---|---|
| `fraud\_t1#1` | review:scenario:independent\_branch\_expiry/fraud\_t1/1 | `scenario:independent\_branch\_expiry/fraud\_t1/1` |
| `safety\_t1#1` | review:scenario:independent\_branch\_expiry/safety\_t1/1 | `scenario:independent\_branch\_expiry/safety\_t1/1` |

### Join state

- `join` (ALL): 0/2 arrivals; **waiting**

### Activation history

| Seq | Node | Activation | Status | Result / task |
|---:|---|---:|---|---|
| 1 | `start` | 1 | COMPLETE | start-result |
| 3 | `safety\_t1` | 1 | WAITING | review:scenario:independent\_branch\_expiry/safety\_t1/1 |
| 5 | `fraud\_t1` | 1 | WAITING | review:scenario:independent\_branch\_expiry/fraud\_t1/1 |

## Tick 3: Complete safety\_t1

**Workflow status:** `WAITING`<br>
**Active/current:** `fraud\_t1`, `safety\_t2`<br>
**Input event:** `complete\_latest`

### Edge evaluation

**Evaluated**

- `e2`: `safety\_t1` → `safety\_t2`

**Traversed**

- `e2`: `safety\_t1` → `safety\_t2`

### Review requests

| Activation | Task | Idempotency key |
|---|---|---|
| `safety\_t2#1` | review:scenario:independent\_branch\_expiry/safety\_t2/1 | `scenario:independent\_branch\_expiry/safety\_t2/1` |

### Join state

- `join` (ALL): 0/2 arrivals; **waiting**

### Activation history

| Seq | Node | Activation | Status | Result / task |
|---:|---|---:|---|---|
| 1 | `start` | 1 | COMPLETE | start-result |
| 3 | `safety\_t1` | 1 | COMPLETE | safety-result |
| 5 | `fraud\_t1` | 1 | WAITING | review:scenario:independent\_branch\_expiry/fraud\_t1/1 |
| 7 | `safety\_t2` | 1 | WAITING | review:scenario:independent\_branch\_expiry/safety\_t2/1 |

## Tick 4: Complete fraud\_t1

**Workflow status:** `WAITING`<br>
**Active/current:** `fraud\_t2`, `safety\_t2`<br>
**Input event:** `complete\_latest`

### Edge evaluation

**Evaluated**

- `e4`: `fraud\_t1` → `fraud\_t2`

**Traversed**

- `e4`: `fraud\_t1` → `fraud\_t2`

### Review requests

| Activation | Task | Idempotency key |
|---|---|---|
| `fraud\_t2#1` | review:scenario:independent\_branch\_expiry/fraud\_t2/1 | `scenario:independent\_branch\_expiry/fraud\_t2/1` |

### Join state

- `join` (ALL): 0/2 arrivals; **waiting**

### Activation history

| Seq | Node | Activation | Status | Result / task |
|---:|---|---:|---|---|
| 1 | `start` | 1 | COMPLETE | start-result |
| 3 | `safety\_t1` | 1 | COMPLETE | safety-result |
| 5 | `fraud\_t1` | 1 | COMPLETE | fraud-result |
| 7 | `safety\_t2` | 1 | WAITING | review:scenario:independent\_branch\_expiry/safety\_t2/1 |
| 9 | `fraud\_t2` | 1 | WAITING | review:scenario:independent\_branch\_expiry/fraud\_t2/1 |

## Tick 5: Expire safety\_t1, fraud\_t1

**Workflow status:** `WAITING`<br>
**Active/current:** `fraud\_t1`, `fraud\_t2`, `safety\_t1`, `safety\_t2`<br>
**Input event:** `expire`

### Edge evaluation

**Evaluated**

- `e10`: `safety\_t2` → `safety\_t1`
- `e11`: `approved` → `fraud\_t1`
- `e12`: `fraud\_t2` → `fraud\_t1`
- `e13`: `join` → `fraud\_t1`
- `e8`: `approved` → `safety\_t1`
- `e9`: `join` → `safety\_t1`

**Traversed**

- `e12`: `fraud\_t2` → `fraud\_t1`
- `e10`: `safety\_t2` → `safety\_t1`

### Review requests

| Activation | Task | Idempotency key |
|---|---|---|
| `fraud\_t1#2` | review:scenario:independent\_branch\_expiry/fraud\_t1/2 | `scenario:independent\_branch\_expiry/fraud\_t1/2` |
| `safety\_t1#2` | review:scenario:independent\_branch\_expiry/safety\_t1/2 | `scenario:independent\_branch\_expiry/safety\_t1/2` |

### Join state

- `join` (ALL): 0/2 arrivals; **waiting**

### Activation history

| Seq | Node | Activation | Status | Result / task |
|---:|---|---:|---|---|
| 1 | `start` | 1 | COMPLETE | start-result |
| 3 | `safety\_t1` | 1 | INVALID | safety-result |
| 5 | `fraud\_t1` | 1 | INVALID | fraud-result |
| 7 | `safety\_t2` | 1 | WAITING | review:scenario:independent\_branch\_expiry/safety\_t2/1 |
| 9 | `fraud\_t2` | 1 | WAITING | review:scenario:independent\_branch\_expiry/fraud\_t2/1 |
| 11 | `fraud\_t1` | 2 | WAITING | review:scenario:independent\_branch\_expiry/fraud\_t1/2 |
| 13 | `safety\_t1` | 2 | WAITING | review:scenario:independent\_branch\_expiry/safety\_t1/2 |
