Skip to main content
The Runner schedules selected Experiments and Evals as one Invocation. It executes work in the current process, shows progress, and writes business facts to the Record when the directory becomes quiescent.

Invocation, Run, and Attempt

An Invocation has one invocationId. Each selected Experiment creates a Run, whose expected slots define the denominator for that run. Each slot has at most one Member:
  • executed: The Runner executed this slot’s Attempt.
  • carried: The planner automatically adopted an existing Attempt.
  • accepted: An operator explicitly adopted an existing Attempt.
Every Member refers to an Attempt. An Attempt keeps its own origin, the Run and slot that actually executed it. A carried or accepted Member does not copy its Verdict, Usage, events, or other business values.

Plan before execution

Use niceeval exp --dry before a run. It reads the channels needed for planning from a quiescent Record and lists why each slot will execute or be adopted.
Carry happens only when the terminal Verdict, input identity, timeout, and --rerun conditions all allow it. Identity is an opaque value with a domain; values compare only when the domains match. The target Run’s niceeval.actions channel records the reason, eligibility, and input information. The Runner starts the Attempts that need execution only after planning. See Rerun and Carry Results for details.

Feedback from the current process

Progress, active Attempts, and short diagnostics exist only for the current process. The terminal can render them, and --json writes the same machine-readable feedback.
exp --json emits NDJSON. Progress and diagnostic records describe the current Invocation; they are not a Record decoding format. Exactly one final record is a lightweight InvocationReceipt:
The receipt identifies this Invocation, its Runs, timing, and completion only. To inspect Verdicts, Usage, diagnostics, or report aggregates, reread the quiescent Record using its runIds.

Reporter

A Reporter connects only to the current Invocation. It can send information already known to the process to an external system, and --junit writes a file for a CI platform to consume. Neither output owns the Record. The quiescent Record’s named channels retain the recorded Verdict, Usage, assertions, and diagnostics. A later step projects an AnalysisSample from the receipt’s runIds, then uses show, view, or view --out to inspect complete results.

Inspect after the run

After the Runner ends, inspect a historical result with an explicit Run selection:
Without a locator or --run, show and view read every slot whose identity still matches the current project. A locator or --run reads named historical facts. The internal host forms a pure AnalysisSample, projects the facts declared by the Report, and produces a fixed ReportExecution. Published Runs are immutable; another view creates a new selection and execution.

Completion status

The process exit status reflects the Verdicts, execution errors, and Invocation completion known to the Runner. CI can use that status as its gate. A machine caller can read the final receipt, then use runIds to select what to show or export. Input errors that prevent an Invocation from being created have no receipt. Correct the command, Experiment, or selection condition before trying again.