# Smoke / helper scripts

This directory includes a few operator-facing smoke runners that exercise real tools instead of mocks.

## ego-browser smoke runners

### Form smoke

```bash
./scripts/ego_browser_form_smoke.sh
# or override the value
./scripts/ego_browser_form_smoke.sh SmokeValue42
```

What it does:
- creates a tiny local form page
- serves it over `http.server`
- opens it with `ego-browser`
- fills the text field
- reads the field value and status text back from the page

Expected output is JSON containing:
- `title: "Hermes Ego Browser Form Smoke"`
- `value`
- `status`
- a local loopback `url`

### Screenshot smoke

```bash
./scripts/ego_browser_screenshot_smoke.sh
```

What it does:
- runs a real `hermes chat` browser task against `https://www.google.com/`
- verifies the run loads the `ego-browser` skill
- verifies it does **not** load the generic `software-development:screenshot` skill
- extracts the screenshot path from verbose output
- OCRs the saved screenshot and confirms expected page text is present

Expected output is JSON containing:
- `title: "Google"`
- `url` beginning with `https://www.google.com/`
- `capture_method: "browser_vision-via-hermes-chat"`
- `screenshot_path`
- `ocr_text`

If you want the script to keep a machine-readable copy of the JSON result for CI or
artifact upload, set:

```bash
EGO_BROWSER_SCREENSHOT_RESULT_JSON=/tmp/ego-browser-screenshot-result.json \
  ./scripts/ego_browser_screenshot_smoke.sh
```

## Opt-in pytest wrapper

There is an opt-in pytest wrapper at:

```bash
tests/tools/test_ego_browser_smoke_scripts.py
```

Run the form smoke test through pytest with:

```bash
RUN_EGO_BROWSER_SMOKE=1 python -m pytest tests/tools/test_ego_browser_smoke_scripts.py -q
```

That run executes the form smoke and skips the screenshot smoke unless you explicitly opt in:

```bash
RUN_EGO_BROWSER_SMOKE=1 RUN_EGO_BROWSER_SCREENSHOT_SMOKE=1 \
  python -m pytest tests/tools/test_ego_browser_smoke_scripts.py -q
```

Why the extra flag?
- the screenshot smoke shells into a full `hermes chat` session
- that path is slower and more environment-sensitive than the direct form smoke
- we keep it opt-in so normal targeted runs stay stable and low-noise

## Manual CI workflow

There is also an opt-in GitHub Actions workflow:

```text
.github/workflows/ego-browser-smoke.yml
```

It is intentionally `workflow_dispatch` only and expects a self-hosted macOS runner
that already has:

- `ego-browser`
- `tesseract`
- Python 3 available for `uv sync`

Use it when you want a real CI-hosted smoke pass without forcing browser-smoke noise
into the default PR lanes. When screenshot smoke is enabled there, the workflow also
uploads the captured screenshot plus the parsed JSON result as an artifact, and writes
the screenshot path / OCR summary into the Actions job summary.
