Doc · 02 / Usage
How a developer uses it
One command. Two before it. Everything visible on disk. No hosted service.
Workflow · 04 steps
Install, init, check, read
Install
Pure Python. No services, no account.
Init
30-second interactive setup. Asks four questions and writes kelvin.yaml.
Check
Runs perturbations, invokes your pipeline once per perturbation, prints the report.
Read
Self-contained HTML for per-case drill-down. Commit it to a PR.
Flag — --only <case> runs on a single case. No other flags.
kelvin init · 04 questions
The four-question setup
Everything Kelvin needs to understand your pipeline.
- Q1
Shell command
Shell command to invoke your pipeline (with {input} and {output} placeholders).
- Q2
Cases location
Where your cases live.
- Q3
Decision field
Name of the decision field in your pipeline's output JSON.
- Q4
Governing types
Which unit types are governing (used for swap perturbations).
Contract
kelvin.yaml
Four keys. Written by kelvin init. Edit by hand if needed.
run: python -m envelop.assess --input {input} --output {output} # how Kelvin invokes your pipeline
cases: ./ventures # where your markdown case files live
decision_field: recommendation # the JSON field Kelvin compares
governing_types: [gate_rule] # types that should change the answer when swapped
seed: 0 # deterministic perturbation choices
Pipeline contract
Language-agnostic. Framework-agnostic.
Works for any pipeline invocable as a command. Kelvin invokes it once per perturbation.
Inputs · placeholders
{input}— path to a perturbed markdown file Kelvin writes before the call.{output}— path where the pipeline must write a JSON file before exiting.
Failure semantics
- Output JSON must contain the field named in
decision_field. - Non-zero exit code or missing output file = perturbation fails. Logged and shown in the report; scoring continues with remaining perturbations.
Input format
One markdown file per case
## Section headers declare typed units. The header text becomes the unit type, normalized (lowercased, whitespace → underscore). Content before the first header is treated as untyped preamble and never perturbed.
Preamble text. Optional. Never perturbed.
## Interview
First customer interview content...
## Interview
Second customer interview content...
## Gate Rule
Stage-gate criterion content...
## Budget Assumption
Budget figures and reasoning...Filename
ventures/acme.md → case name acme.
Repeated headers
Two ## Interview headers produce two units of type interview.
Normalization
## interview, ## INTERVIEW, ## Interview all collapse to interview. Use consistent header text for units of the same type.