Record a Cairn run in Plune
Cairn explores a running app and writes what it found to disk: cases,
evidence, a report.json per run. It knows nothing about Plune, and that is deliberate — a Cairn
user who has never heard of Plune should not find its URL, its token or its payload shape wired
into their tool.
plune ingest is the thing that carries one run across.
plune ingestThat reads the newest run under ./runs and sends it. Name the directory to send a specific one:
plune ingest runs/2026-09-09T10-22-31ZWhat arrives
Section titled “What arrives”Three counters account for every case in the run:
Ingested Cairn run → run_a1b2c3 12 result(s) attached to existing cases 7 case(s) proposed — review them in Plune to accept 3 skipped (already queued, already rejected, repeated, or never executed)- Attached — Cairn re-ran something Plune already has a case for, so the outcome joins that case’s history.
- Proposed — Cairn found something new. It is now in the review queue, waiting for a person.
- Skipped — the case was already queued, was refused before, repeated inside this run, or never actually executed.
Step by step
Section titled “Step by step”-
Save a token once.
Terminal window plune loginThe token is checked against the API before it is saved, so a wrong one fails here rather than two commands later. See Sync runs to the platform.
-
Let Cairn explore.
Terminal window cairn design --url https://app.example.com/page --session myappCairn writes the run to
runs/<id>/. Anything that produces areport.jsonworks —cairn design,cairn explore,cairn api. -
Carry it across.
Terminal window plune ingestOr name the directory when the newest one is not the one you mean.
-
Review what it proposed. Open the review queue in Plune and accept or refuse each case. Only what you accept becomes a test case.
When it refuses
Section titled “When it refuses”Every refusal names the fix and uploads nothing. Exit 2 is something to fix here and now; exit 1
may work on a retry.
| Message | What happened |
|---|---|
No Cairn run found under runs | There is nothing to send from the default directory. Name the run: plune ingest <dir>. |
No Cairn run found in <dir> — expected a report.json | Usually a mistyped path. A run directory holds a report.json. |
This run predates versioned Cairn artifacts | Re-run it with Cairn 0.7.0 or newer, which stamps the format so it can be read safely. |
Unsupported Cairn artifact version N | Cairn is ahead of the CLI — npm install -g @plune-ai/cli@latest. |
That Cairn run did not finish, so its cases are incomplete | The run failed partway and its artifact is a fragment. Re-run it. |
Cannot attach results safely: the operation "X" appears more than once | Evidence carries no case identity to tell two identical operations apart, so nothing was uploaded rather than attached to the wrong case. |
Not logged in / Your API token was rejected (401) | Run plune login with a fresh token. |