> ## Documentation Index
> Fetch the complete documentation index at: https://docs.veecle.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Check every pull request on a virtual board

> Fail a pipeline when the virtual board's captured UART is missing what you expect.

You want a pull request to fail when the firmware's captured UART is missing what you expect.

## What you'll do

<Steps>
  <Step title="Create a personal access token">
    On [API Keys](/platform/api-keys), create a personal access token and give it a name. Chiplab shows the token once. Copy it into a CI secret. The job sends it as a bearer token, `CHIPLAB_API_KEY`.
  </Step>

  <Step title="Start from the GitHub Actions template">
    The examples repository ships [`.github/workflows/claude-chiplab-smoke.yml`](https://github.com/veecle/chiplab/blob/main/.github/workflows/claude-chiplab-smoke.yml). It runs when someone comments `/smoke-test` on a pull request, builds `examples/bare-metal/stm32f4-discovery`, and checks the captured UART. Treat it as a template: the trigger, the agent, and the example path are yours to change.
  </Step>

  <Step title="Run on the virtual board">
    The job calls `ask` for the current boards, tools, and gotchas, produces an ELF, uploads it, and runs it on the target board with the UART the firmware writes. It then waits and downloads `stdout`.
  </Step>

  <Step title="Fail when the expected output is missing">
    Fail the pipeline unless `stdout` contains what you expect. The public examples expect `Hello world!`.
  </Step>
</Steps>

Details of the token, the workflow, and the check are on [CI/CD](/tools/ci).

## Ask your agent

```text theme={null}
Check this firmware on every pull request. Run it on the STM32F4 Discovery, capture usart2, and fail the job if Hello world! is missing.
```

## What you get back

The job downloads `stdout` and fails the pipeline unless that output contains what you expect. The public examples expect `Hello world!`.

## Next

<CardGroup cols={2}>
  <Card title="CI/CD" icon="code-branch" href="/tools/ci">Run the same tools from a pipeline with a personal access token.</Card>
  <Card title="run" icon="play" href="/tools/run">Execute an ELF on a virtual board and read the UART.</Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.