v0.8.2
[0.8.2] - 2026-09-05
The truth patch. Nothing the evaluator does changes in this release; what the surfaces around it say does, and each correction ships with the lock that stops it recurring. Nineteen surfaces stated something untrue — a flag that does not exist, an endpoint that does not exist, a judge score called calibrated while its measurement is pending, four era stamps, a hosted tier that is not being built, latencies nobody measured, a package that is not published, a roadmap describing shipped work as planned, three different recipes for one fail-closed gate, compare pages with wrong counts, a playground that showed a rule that never ran as a pass — and the evaluator-of-evaluators runtime was weaker than its docs: the release workflow told readers to verify signatures it never verified itself, the signature bundles carried a suffix the OpenSSF Scorecard ignores, and the judge measurement went green when it could not run. Every one of those is corrected below, with five new scanner patterns, a docs-contract test, a release-workflow consistency test, one rendered source for the two skill files, and the truthbase carrying two new keys.
Fixed
- The evaluator-of-evaluators runtime does what its docs say.
proof-judge.ymlfails red when no provider key is configured instead of skipping and reporting green (dispatch-only, so no pull request is affected; the judge is user-keyed, andnpm run proof:judgeon a checkout with your own key is the other path). The release workflow'sverify-releasejob now runscosign verify-blobon both SBOM bundles under the workflow's signing identity — the notes had told readers to run it while no job ever did, and presence of a bundle is not a signature that verifies. The bundles are named*.sigstore.jsoninstead of*.cosign.bundle: same Sigstore bundle bytes, but OpenSSF Scorecard's Signed-Releases check only counts suffixes it recognises, so every signed release had scored 0 there.SECURITY-EXPOSURE.md's hono row said1.19.13 installeda month after the MCP SDK bump had put 2.1.0 in the tree and closed the advisory; the row is corrected and the security-exposure gate now checks every "installed" claim in the record againstpackage-lock.json.SECURITY.mdstates the review posture (one maintainer; the required checks and CodeQL are the review; no second human reviewer today). Lock:tests/release-workflow-consistency.test.tspins the bundle suffix at the sign, notes, upload and verify sites, the presence of the verify-blob step, and the fail-loud branch in both keyed workflows. - The playground no longer shows a rule that did not run as a pass. The vendored rule library now mirrors the server's
skipped/skipReason: a rule with nothing to judge (no input, no cost, no tool calls, an output too brief for topic analysis) renders as skipped with the reason, is excluded from the "x of y judged rules pass" tally and from the score, and never counts as a pass. The category picker's rule counts render from the vendored registry instead of hand-typed numbers (they said 4/3/4/2 against a 15-rule roster).tests/playground-parity.test.tsnow asserts skip parity with the installed server instead of counting a server skip as a pass, with fixed cases that omit each context so every skip path is exercised. - The two skill files are one rendered source.
skills/iris-eval/SKILL.md(the npm package) andclaude-plugin/skills/agent-eval/SKILL.md(the plugin marketplace) had been mirrored by hand with an "edit both together" comment and had drifted — three sections and a config row in one and not the other. Both now render fromskills/iris-eval/SKILL.template.mdthroughscripts/claims/render-llms.mjs(counts and template names from the truthbase; the front matter, one install-context paragraph and the example-link base are the only per-target facts), andnpm run llms:checkfails CI when either drifts. - The docs contract. A new test (
tests/docs-contract.test.ts) extracts what the code defines — the CLI flagssrc/index.tsparses, the/api/v1routes the dashboard router registers, theiris://resources the MCP server registers, theIRIS_*variablessrc/reads, the rule roster — and asserts every mention on a prose surface (README,docs/, both skill files,server.json,smithery.yaml, the tool descriptions) names something that exists; the reverse holds for environment variables, soserver.jsonnow lists every variable the server reads (IRIS_TRANSPORT,IRIS_HOST,IRIS_ALLOWED_ORIGINS,IRIS_DASHBOARD_HOST,IRIS_OTEL_HEADERS,IRIS_OTEL_SERVICE_NAME,IRIS_OTEL_TIMEOUT_MSwere missing). Each extractor guards its own regex with a floor, so a pattern that stops matching fails instead of passing vacuously. - Surfaces that stated something untrue, corrected together with the lock that stops each from recurring. No evaluator behaviour changes. In the MCP tool descriptions an agent reads instead of the README:
delete_tracenamed a--retention-daysflag that does not exist (retention isretention.daysinconfig.json);get_tracespointed at a dashboard event-stream endpoint that does not exist;evaluate_with_llm_judgecalled its score "calibrated" while its measurement is pending (the description now says so and links the proof page); four descriptions dated themselves "v0.4" and four described a "Cloud tier" that is not being built; three descriptions and the judge docs quoted latencies nobody measured ("~5-50ms", "<5ms", "~50ms", "1-10 seconds").server.jsonnow listsIRIS_PORT,IRIS_OTEL_ENDPOINTandIRIS_CITATION_DOMAINS, which the server reads.examples/README.mdsaid the LangChain package ships; it is unpublished and the note now says so and points at HTTP ingest.docs/roadmap.mddescribed shipped work (the proof page, the trajectory rules, HTTP ingest) as planned; every item is now marked shipped or not shipped. The README,docs/custom-rules.md,docs/api-reference.mdanddocs/architecture.mdgave three different recipes for a fail-closed gate; they now give one (a non-emptycritical_skippedis unknown, not clean) and present the default veto set as a default, not a constant. Six compare pages said "4 custom-rule types" against eight, one said "13 deterministic rules" against fifteen, and eight quoted "(<1 ms)"; the counts now render from the truthbase (evalRules.customRuleTypeCountis a new key, read from theCustomRuleTypeunion) and the latency claims are gone. Two learn pages (Output Quality Score, Self-Calibrating Eval) now state precisely what Iris computes and does not. Locks: five new scanner patterns (custom-rule-type-count,latency-claim-without-measurement,retired-cloud-tier,era-stamp-in-tool-description, and "N deterministic rules" as a spelling of the rule count), the measurement-claim pattern extended to the tool descriptions, and a drift test anchoring the custom-rule-type count to the runtime switch.
Supply-chain transparency
- SBOMs:
iris-npm-sbom.spdx.json+iris-docker-sbom.spdx.json(attached below). Both are SPDX 2.3 JSON, cover direct + transitive dependencies. - SBOM signatures: each SBOM has a companion
.sigstore.json(Sigstore bundle — signature + cert + Rekor entry) attached to this release. The release workflow runs this exact verification itself before it reports success. Verify with:cosign verify-blob \ --bundle iris-npm-sbom.spdx.json.sigstore.json \ --certificate-identity-regexp='https://github.com/iris-eval/mcp-server' \ --certificate-oidc-issuer='https://token.actions.githubusercontent.com' \ iris-npm-sbom.spdx.json - npm provenance: published with
--provenance(verifiable vianpm audit signaturesor on the package page). - Docker signature: image signed with cosign keyless (Sigstore). Verify with:
cosign verify ghcr.io/iris-eval/mcp-server:v0.8.2 \ --certificate-identity-regexp='https://github.com/iris-eval/mcp-server' \ --certificate-oidc-issuer='https://token.actions.githubusercontent.com' - Build attestation: both the npm SBOM and Docker image manifest carry GitHub-signed build-provenance attestations. Inspect with
gh attestation verifyorcosign verify-attestation.
What's Changed
- docs(claims): the untrue surfaces, corrected with their locks (truth patch 2, part 1) by @irparent in #431
- fix(claims): one rendered source for the skill files, the docs contract, and a playground that skips (truth patch 2, part 2) by @irparent in #432
- ci(release): verify-release verifies the SBOM signatures; bundles named for Scorecard; proof-judge fails loudly without a key (truth patch 2, part 3) by @irparent in #433
- chore(release): v0.8.2 — the truth patch by @irparent in #434
Full Changelog: v0.8.1...v0.8.2