# pre-0002: deployments/steps/core.py printed_messages list O(W²) warning deduplication

**Severity:** LOW
**CWE:** CWE-407 (Algorithmic Complexity — linear membership test in hot loop)
**Target:** Prefect (PrefectHQ/prefect)
**Files:**
- `src/prefect/deployments/steps/core.py:191-202` — `run_steps()`: printed_messages list deduplication

## Description

`run_steps()` deduplicates deprecation warnings using a plain list inside a for-loop:

```python
printed_messages = []
for warning in w:                            # O(W) outer loop
    message = str(warning.message)
    if message not in printed_messages:      # O(W) linear scan — O(W²) total
        ...print...
        printed_messages.append(message)
```

With W warnings per step, deduplication cost is O(W²). In practice W is small
(deployment step warnings are bounded by deprecation notices), but the fix is
trivial: use a `set` for O(1) membership.

## Complexity Before

`message not in printed_messages` (list): **O(W)**
Total: **O(W²)**

## Complexity After

`message not in printed_set` (set): **O(1)** average
Total: **O(W)**

## Patch

See `patch/pre-0002-steps-core-printed-messages-list.patch`

## Reproduction

```
cd defects/prefect/unit && javac -d . PrefectTest.java && java -ea unit.PrefectTest
```
