# iris The iris over a [portal](https://project.uhhm.no/uhhm/portal) site. A content push is an incoming wormhole; nothing comes through until it checks out. ``` iris check --path questions # a local checkout iris check --repo https://project.uhhm.no/uhhm/questions iris --path questions # the same, for one-line CI ``` `check` loads a content repo exactly the way the running site does, validates it (every action lands on a page, every transition is one the state machine allows, every recorded bucket is read back somewhere), and then holds it to the business needs the repo declares in `needs.yaml`, when it has one: - a path of submissions gets each kind of visitor's answer into the bucket it names, within a submission and required-field budget; - the handling group holds a desk over that bucket, and every finished state is reachable through the buttons it (and any `also_moved_by` group) offers; no record strands on the way; - every stage the business named is a state of the machine. A need marked `planned` warns instead of failing. Exit status is the verdict, so a content repo's CI is one line. Beyond the verdict, `check` exports what a trainer needs to grade the wording: `--needs-tasks` writes the personas as typed choice tasks (`--skim` for headings only), `--needs-score` grades an engine's answers, and `--needs-sim` writes a resolved model of the whole site. `iris replay` runs simulated cases through the site's real aggregate engine on a throwaway JetStream and reports every bucket by state; `--report-only` takes the same scorecard from a live site's buckets. See [portal-trainer](https://project.uhhm.no/uhhm/portal-trainer) for what sits around those. ## Matching the site Every type iris reads is portal's own: portal is a library dependency pinned to a release tag in `Cargo.toml`, and `iris --version` says which. A content repo should run the iris that matches the portal release its site runs. Portal's own release tarball ships an `iris` binary built the same way, so a site that pins nothing extra has one at `/srv/app//current/iris`. ## Release Move the `Unreleased` lines in `CHANGELOG.md` under a heading for the version, bump `Cargo.toml`, commit, tag `v`, push. CI builds the binary and attaches it to the Gitea release as `iris`, with that section as the notes.