
# Log Peristiwa Alur Kerja

Log peristiwa alur kerja mencatat jejak untuk setiap batas alur kerja yang persisten. Setiap peristiwa jejak dapat mencakup input langkah, output, status publik sebelum langkah, status publik setelah langkah, konteks runtime, referensi artefak, potongan streaming, waktu, dan detail error.

## Data yang dicatat

| Peristiwa | Waktu | Data yang direkam |
|---|---|---|
| `step_started` | Sebelum handler langkah dijalankan | ID tugas, antrean, percobaan, nama langkah, jenis langkah, input, dan status sebelum eksekusi |
| `step_completed` | Setelah handler langkah berhasil | Input, output, status sebelum, status setelah, konteks, artefak, potongan, dan durasi |
| `step_failed` | Saat handler langkah melempar error | Input, status sebelum, status setelah jika tersedia, konteks, kelas error, pesan error, jejak, dan durasi |
| `step_branch_completed` | Saat satu cabang paralel berhasil | Input cabang, output, status sebelum, status setelah, konteks, dan durasi |
| `step_item_completed` | Saat satu item for-each berhasil | Input item, output, status sebelum, status setelah, metadata item, konteks, dan durasi |
| `workflow_waiting` | Saat langkah wait menangguhkan proses | Jenis wait, target wait, mode wait, kunci hasil, metadata pencocokan, dan status selama menunggu |
| `workflow_resumed` | Saat langkah wait terpenuhi | Payload untuk melanjutkan, status sebelum dilanjutkan, dan status setelah dilanjutkan |
| `workflow_replayed` | Saat ekspor dibuat ulang | Metadata alur kerja sumber dan status replay |

## Membuat kueri linimasa

```php
$events = Queuety::workflow_timeline( $workflow_id );

foreach ( $events as $event ) {
    echo $event['step_index'] . ' ' . $event['event'] . ' ' . $event['handler'] . "\n";

    if ( 'step_completed' === $event['event'] ) {
        $input        = $event['input'];
        $output       = $event['output'];
        $state_before = $event['state_before'];
        $state_after  = $event['state_after'];
    }

    if ( 'step_failed' === $event['event'] ) {
        echo 'Error: ' . $event['error']['message'] . "\n";
    }
}
```

Setiap baris peristiwa berisi:

- `id`
- `workflow_id`
- `job_id`
- `parent_event_id`
- `step_index`
- `step_name`
- `step_type`
- `handler`
- `event`
- `queue`
- `attempt`
- `input`
- `output`
- `state_before`
- `state_after`
- `context`
- `artifacts`
- `chunks`
- `error`
- `duration_ms`
- `created_at`

## Bundel jejak ternormalisasi

Gunakan `workflow_trace()` saat membuat debugger UI:

```php
$trace = Queuety::workflow_trace( $workflow_id );
```

Bundel jejak mencakup:

- `workflow`
- `steps`
- `events`
- `jobs`
- `logs`
- `artifacts`
- `chunks`
- `signals`
- `wait_dependencies`

`steps` mengelompokkan peristiwa berdasarkan indeks langkah dan menyertakan peristiwa penting terbaru untuk setiap langkah.

## Pencarian status langkah

```php
$state = Queuety::workflow_state_at( $workflow_id, $step_index );
```

Ini mengembalikan `state_after` publik dari peristiwa terbaru yang selesai atau dilanjutkan untuk langkah tersebut, atau `null` jika tidak ada status yang dicatat.

## Metadata jejak runtime

Handler dapat menambahkan detail jejak tingkat aplikasi saat berjalan:

```php
Queuety::trace_input( [ 'resolved' => $resolved_input ] );
Queuety::trace_context( [ 'ability' => 'content/load-post' ] );
Queuety::trace_output( [ 'post' => $post ] );
```

Handler langkah juga dapat mengembalikan metadata jejak khusus:

```php
return [
    'result' => 'done',
    '_queuety_trace' => [
        'input' => [ 'resolved' => $resolved_input ],
        'context' => [ 'node_id' => 'loadPost' ],
        'artifacts' => [
            [ 'key' => 'brief', 'kind' => 'markdown' ],
        ],
    ],
];
```

Kunci `_queuety_trace` disimpan di log peristiwa dan tidak digabungkan ke status alur kerja.

## CLI

Tampilkan linimasa sebagai tabel:

```bash
wp queuety workflow timeline 42
```

Tampilkan status setelah langkah:

```bash
wp queuety workflow state-at 42 0
```

## Retensi

Log peristiwa terus bertambah seiring waktu. Gunakan `prune()` untuk menghapus peristiwa jejak lama:

```php
$deleted = Queuety::workflow_events()->prune( 30 );
```
