Firmware builds

Workflow .github/workflows/firmware.yml in a repository that contains westwind-pipelines (the repository itself, or a fork). The web application dispatches it with workflow_dispatch:

pipeline_b64 (required)

The westwind.yaml contents, base64 encoded.

request_id (required)

A UUID chosen by the caller. The run is named westwind <request_id> so the caller can find it with the workflow runs API.

board (optional)

Overrides target.board.

The run uploads one artifact, westwind-<request_id>, containing the build outputs and manifest.json:

{
  "westwind": 1,
  "pipeline": "face-detect",
  "board": "arduino_uno_q/stm32u585xx",
  "zephyr": "0235217d2893",
  "executorch": "v1.5.1",
  "created": "2026-11-09T18:00:00Z",
  "flash": { "method": "esptool", "chip": "esp32", "offset": "0x1000" },
  "files": [
    { "name": "zephyr.bin", "role": "image", "bytes": 393904, "sha256": "..." },
    { "name": "zephyr.elf", "role": "debug", "bytes": 4991628, "sha256": "..." }
  ],
  "model": { "name": "blazeface", "pte_bytes": 230112, "max_abs_diff": 3.1e-06 },
  "memory": { "flash_bytes": 412000, "ram_bytes": 301000 }
}

flash is copied from the board's catalog entry. role is one of image, uf2, hex, signed, debug, model, report.