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

# Validate and read results

> Check the evidence, then interpret the generated tables and report.

## Repeat validation

Use the campaign or exact engine directory that the app prints:

```sh theme={null}
lattora validate "/absolute/path/to/retained/campaign" --plain
```

Require exit 0 and **PASS**.
The validator checks hashes, case identities, canonical inputs, placements, feasibility,
budgets, metrics and numerical analysis. Hashes alone do not prove physical correctness.
Keep the full campaign and its exact JAR.

Only independently validated **COMPLETE** engine datasets are eligible evidence.
Installed runs record release verification separately. Their local tests remain `NOT_RUN`.
A process exit code or displayed summary does not replace dataset validation.

## Find the report

Open the `run_directory` recorded in `runner.json`.
For Stress, inspect the recorded production and calibration engine paths separately.

| Profile | Analysis in its engine directory |
| - | - |
| Smoke | None; four-case pipeline check |
| Explore | `analysis/scenario_summary.csv`, `analysis/report.md` |
| Research | Explore files plus `pairwise_primary.csv`, `runtime_secondary.csv`, `sensitivity_summary.csv` under `analysis/` |
| Stress | `analysis/summary.csv` for each phase |

The engine creates these files. Python independently recomputes numerical tables from raw evidence.
Report prose is hash-checked and required to be nonempty. It is not numerical authority.

Explore has five paired replications per scenario/algorithm.
Stress uses the selected production replication count.
Means and sample SD are descriptive; SD is unavailable when n \< 2.
Raw SLA is a proportion and allocation time is ns. Results displays percent and ms.
See [all output files](/reference/key-output-files).

For Research, read `eligible`, `decision`, `reason`, `p_holm` and interval columns together.
Empty intervals are unavailable, not zero bounds.
`NO_CLAIM` can be the correct result. Read [claim gates](/concepts/research-protocol#claim-decisions).

## Understand validation limits

Artifact hashes establish identity, not producer authenticity.
Validators do not independently replay every optimizer trajectory.
Stress scalar traces check order, budgets and eligible-best consistency.
Coherent changes to discarded-candidate scalars can remain undetected.

Check model, objective, schema, workload identities, algorithms, budgets and environment before comparing campaigns.
Preserve pairing. Do not combine incomplete fragments or silently drop failures.

<Accordion title="Validate an engine directory with source Python">
  From the matching [source checkout](/guides/building-from-source), run the appropriate validator with Python 3.11+:

  ```sh theme={null}
  python3 -B scripts/statistics_validator.py "/absolute/path/to/frozen/engine-run"
  python3 -B scripts/stress_validator.py "/absolute/path/to/stress/engine-run"
  ```

  Frozen validation accepts schema 2; Stress validation accepts schema 1.
  Use `lattora validate` for an outer campaign. Keep raw and frozen analysis files unchanged.
</Accordion>

Advanced Python plots, derived reports and optional LLM narration remain
[planned in #18](https://github.com/puneet-chandna/Lattora/issues/18).
There is no `lattora analyze` command in 2.1.0.
[Frozen validator](https://github.com/puneet-chandna/Lattora/blob/v2.1.0/scripts/statistics_validator.py) ·
[Stress validator](https://github.com/puneet-chandna/Lattora/blob/v2.1.0/scripts/stress_validator.py).


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