# evm.execution_steps

Immutable selected per-step PROGRAM lineage.

Canonical HTML: <https://determica.com/docs/tables/evm-execution-steps>

- Kind: Table
- Layer: program_execution
- Category: Simulation
- Tags: Program, Execution, Step, Public

## Contract and lifecycle

**Grain:** One declared program step per (execution_id, step_index), including skipped suffix steps.

**Lifecycle:** run publishes this immutable row set atomically with its owning run. Statement failure or caller rollback publishes no durable prefix; direct DML is unsupported because it can corrupt the documented invariants.

**Status and NULLs:** Interpret nullable payloads only through their owning status fields. Defensive poisoned and engine_error outcomes mean the engine refused to claim a trustworthy normal result; broad view nullability also covers owner alternatives and left-joined evidence.

### Join guidance

- Join evm.executions on execution_id for candidate and run context.
- Use attempt_id to deduplicate physical facts expanded across contextual owners.
- For program owners use step_index; for observation-call owners use observation_index and observation_key.

### Effect semantics

- Access flags describe attempted EVM access, not committed state change.
- Effect facts retain attempted evidence and final committed, reverted, discarded, or poisoned disposition.
- execution_state_deltas contains committed checkpoint transitions only; observation-call effects are excluded from execution_effect_summary.

## Columns

### Identity and ownership

Contextual keys and reusable identities that establish row ownership.

- `execution_id` (UUID; required; primary key) — Contextual execution id
- `attempt_id` (UUID; nullable) — Selected physical attempt for the contextual step

### Ordering and cardinality

Stable indexes and counts used to reconstruct deterministic order.

- `step_index` (UINTEGER; required; primary key) — Program step index

### Payload and evidence

Operation-specific inputs, outputs, and authenticated evidence.

- `step_kind` (VARCHAR; required) — Executable step kind
- `sender` (ADDRESS; required) — Requested caller
- `target` (ADDRESS; required) — Requested target
- `value` (UINT256; required) — Requested native value
- `calldata_selector` (BYTES4; nullable) — Requested selector
- `gas_price` (UINT256; required) — Requested gas price
- `access_list` (STRUCT(address ADDRESS, storage_keys BYTES32[])[]; required) — Canonical access list
- `gas_limit` (UBIGINT; nullable) — Transaction gas limit
- `intrinsic_gas` (UBIGINT; nullable) — Intrinsic transaction gas
- `refund_applied` (UBIGINT; nullable) — Applied gas refund
- `calldata_floor_gas` (UBIGINT; nullable) — Calldata floor gas
- `transaction_gas_estimate` (UBIGINT; nullable) — Receipt-equivalent gas estimate
- `skip_reason` (VARCHAR; nullable) — Stable prior-failure skip reason

### Status and disposition

Outcome vocabulary and NULL-controlling disposition fields.

- `status` (VARCHAR; required) — Step status
- `error_code` (VARCHAR; nullable) — Stable error code
- `transaction_gas_status` (VARCHAR; nullable) — Per-step gas completeness
- `execution_closure_status` (VARCHAR; required) — Step closure status

### Effects

Attempted and final effect facts or aggregates.

- `refund_counter` (BIGINT; nullable) — Raw refund counter

### Commitments

Hashes and roots authenticating specifications, facts, state, or results.

- `step_hash` (BYTES32; required) — Canonical step commitment
- `calldata_hash` (BYTES32; required) — Requested calldata hash
- `call_context_hash` (BYTES32; required) — Canonical call-context hash
- `access_list_root` (BYTES32; required) — Access-list root
- `blob_versioned_hashes` (BYTES32[]; required) — Requested blob-versioned hashes
- `blob_versioned_hashes_root` (BYTES32; required) — Blob-versioned-hash-list root
- `pre_checkpoint_state_identity_hash` (BYTES32; nullable) — Pre-step checkpoint
- `post_checkpoint_state_identity_hash` (BYTES32; nullable) — Post-step checkpoint
- `committed_state_delta_root` (BYTES32; nullable) — Committed step delta

## Linked joins

- `execution_id` → [evm.executions](/docs/tables/evm-executions.md) (`execution_id`) — Contextual execution that exposes this public row.

## Related public objects

- [evm.executions](/docs/tables/evm-executions.md) — upstream

## Verified queries

### Confirm fixture coverage

Confirm that this object has rows owned by the stable seven-candidate public fixture.

```sql
SELECT 'evm.execution_steps'::VARCHAR AS object_name, CASE WHEN count(*) > 0 THEN 'PASS' ELSE 'FAIL' END::VARCHAR AS status FROM evm."execution_steps" o JOIN evm.executions e USING (execution_id) WHERE e.candidate_key IN ('complete-effects', 'later-revert', 'ordered-logs', 'create', 'selfdestruct', 'blockhash', 'transient-access');
```

### Check candidate ownership

Diagnose whether this object remains linked to at least one stable fixture candidate through public keys.

```sql
SELECT 'evm.execution_steps'::VARCHAR AS object_name, CASE WHEN count(DISTINCT e.candidate_key) > 0 THEN 'PASS' ELSE 'FAIL' END::VARCHAR AS status FROM evm."execution_steps" o JOIN evm.executions e USING (execution_id) WHERE e.candidate_key IN ('complete-effects', 'later-revert', 'ordered-logs', 'create', 'selfdestruct', 'blockhash', 'transient-access');
```
