# SteamCMD Install Logging & Buffering Fix Design

## Goal
Improve live feedback during the `install` operation by adding step markers to `SteamInstaller` and fixing Python subprocess buffering so output streams immediately instead of blocking until process exit or large chunks accumulate.

## Root Cause
When the user triggers an `install`, two things cause significant UI delays:
1. **Double Buffering:** `l4d2web` executes `l4d2ctl` via a subprocess pipe, and `l4d2ctl` executes `steamcmd` via another pipe. Python defaults to block-buffering `sys.stdout` when writing to a pipe. In `run_command` (both host and web versions), `print(line, file=sys.stdout)` uses `flush=False` by default. This causes Python to hold up to 8KB of log lines before sending them to the UI, causing massive "all at once" delays.
2. **Missing Markers:** `SteamInstaller` was not updated to use the new `_emit_step` helper, so it provides no high-level contextual steps about what `steamcmd` is currently attempting (e.g. windows vs linux payloads).

## Approach

### 1. Fix Python Subprocess Buffering
We will add `flush=True` to the pass-through `print` calls in our command runners. This forces Python to immediately push each line down the pipe to the UI.

- Modify `l4d2host/process.py`:
  - Update `print(line, file=sys.stderr)` to `print(line, file=sys.stderr, flush=True)` in `emit_stderr_message`.
  - Update `print(line, file=output_stream)` to `print(line, file=output_stream, flush=True)` in `pump`.
- Modify `l4d2web/services/host_commands.py`:
  - Apply the exact same `flush=True` fixes.

### 2. Add Step Markers to `SteamInstaller`
We will import `_emit_step` into `l4d2host/steam_install.py` and emit progress markers before executing the respective SteamCMD downloads.

- Before the linux download: `Step: downloading linux platform payload...`
- Before the windows download: `Step: downloading windows platform payload...`
- After the loop: `Step: installation complete.`

## Safety
These changes do not alter `steamcmd`'s execution arguments or paths. The `flush=True` change only affects how quickly Python pushes strings through standard standard IO pipes, strictly improving SSE user experience.
