### Task 7 (Quick win): `claw-forge ui --host` defaulting to loopback

**Root cause (verified):** `ui_cli.py:324` hardcodes `uvicorn.run(static_app, host="0.0.0.0", …)` with no option. The UI proxy injects the bearer token server-side (`ui_cli.py:257-261`), so a bound-to-all-interfaces UI hands any LAN peer authenticated access to mutating routes. CLAUDE.md says "keep it localhost-bound"; the code offers no way. (The *state service* default stays `0.0.0.0` — the shared-box workflow depends on it; this changes only the token-injecting UI proxy.)

**Files:**
- Modify: `claw_forge/ui_cli.py` (add `--host` option to `ui`, thread to `uvicorn.run`)
- Test: `tests/test_ui_cli_host.py` (create) — assert the Typer option exists and defaults to `127.0.0.1`.

- [ ] **Step 1: Write the failing test**

```python
# tests/test_ui_cli_host.py
import inspect
from claw_forge import ui_cli


def test_ui_has_host_option_defaulting_to_loopback():
    sig = inspect.signature(ui_cli.ui)
    assert "host" in sig.parameters
    default = sig.parameters["host"].default
    # Typer OptionInfo carries the default value
    assert getattr(default, "default", default) == "127.0.0.1"
```

- [ ] **Step 2: Run test to verify it fails**

Run: `uv run pytest tests/test_ui_cli_host.py -v`
Expected: FAIL — no `host` parameter.

- [ ] **Step 3: Add the option and thread it through**

In `claw_forge/ui_cli.py`, add to the `ui(...)` signature (after `state_port`, ~line 51):

```python
    host: str = typer.Option(
        "127.0.0.1",
        "--host",
        help="Interface to bind the UI server to (default loopback; the UI "
             "proxy holds the state token, so avoid 0.0.0.0 on shared hosts)",
    ),
```

Change the prod-serve line (currently `ui_cli.py:324`) to:

```python
        uvicorn.run(static_app, host=host, port=port, log_level="warning")
```

Keep the `# noqa: S104` only if `host` can still be `0.0.0.0`; since the default is now loopback and `0.0.0.0` is an explicit opt-in, replace the blanket noqa with a targeted one or drop it — run ruff to see which it wants.

- [ ] **Step 4: Run the tests to verify they pass**

Run: `uv run pytest tests/test_ui_cli_host.py -v`
Expected: PASS.

- [ ] **Step 5: Lint + commit**

Run: `uv run ruff check claw_forge/ tests/`
```bash
git add claw_forge/ui_cli.py tests/test_ui_cli_host.py
git commit -m "fix(ui): add --host defaulting to 127.0.0.1 (token-injecting proxy shouldn't bind 0.0.0.0)"
```

---

