Release Readiness#
Release readiness is Flow's local-file-first contract for one question: should this release proceed or hold? It defines lane policy and a normalized result shape. It does not replace ServiceNow, Jira, PagerDuty, deployment systems, freeze calendars, or your release manager — it records why the decision was what it was, with the evidence attached.
Lanes and policy#
A release readiness policy (schemas/release-readiness-policy.schema.json) describes:
- open lane ids such as
change-approval,deployment-window, andfreeze-state - the
surface.claimeach lane requires - open risk classes such as
mediumorhigh - which lanes are required for each risk class
Lane and risk-class ids are open vocabularies — name the lanes your org actually has.
Adapters: provider records become evidence#
Fixture adapters map provider-shaped local JSON into Flow evidence — real claims, not opaque approval booleans. Each adapter emits kind: "surface.claim" evidence with claim.type, claim.subject, claim.status, producer, authority_traces, plus copied external_links and native_refs so the result still points at the systems of record:
import {
changeManagementFixtureAdapter,
deploymentWindowFixtureAdapter,
freezeStateFixtureAdapter,
evaluateReleaseReadiness
} from "@kontourai/flow";
const evidence = [
...changeManagementFixtureAdapter(changeRecord, { subject: "kai-2026.06" }),
...deploymentWindowFixtureAdapter(deploymentState, { subject: "kai-2026.06" }),
...freezeStateFixtureAdapter(freezeState, { subject: "kai-2026.06" })
];
const result = evaluateReleaseReadiness(policy, {
subject: "kai-2026.06",
riskClass: "high",
evidence
});
console.log(result.decision); // "pass" | "hold"
Required lanes pass only when their claim satisfies the policy. Missing, pending, rejected, stale, untrusted, or authority-gap evidence returns decision: "hold". The normalized result (schemas/release-readiness-result.schema.json) records the decision, risk class, required lanes, per-lane outcomes, evidence refs, external_links, and native_refs for later report rendering.
A complete working scenario — policy, provider records, and the equivalent Flow Definition expectation — ships with the package in examples/scenarios/release-readiness/.
Version release reports#
The Version Release Report combines everything known about a versioned release into one deterministic artifact: changeset, Flow-shaped verification evidence, a release readiness result, accepted exceptions, accepted risks, native_refs, and external_links.
flow version-release-report examples/scenarios/version-release-report/complete.json --format markdown
flow version-release-report examples/scenarios/version-release-report/missing-required-evidence.json --format json
Missing required verification evidence or required release lanes become explicit gaps and force decision: "hold" — never a summarized "ready." Key sections from the real output (bundled missing-evidence fixture):
# Version Release Report: kai-2026.06
- Decision: hold
- Summary: kai-2026.06 release held for missing evidence
## Release Evidence
- change-approval: pass required - Required change record approval satisfied
- deployment-window: not_verified required - Deployment window is open not satisfied
- freeze-state: pass required - Release freeze is clear satisfied
## Gaps
- verification_evidence ev.verify.schemas: required verification evidence ev.verify.schemas is missing
Embed the same projection from the library:
import {
projectVersionReleaseReport,
renderVersionReleaseReportMarkdown
} from "@kontourai/flow";
const report = projectVersionReleaseReport(fixtureJson);
console.log(renderVersionReleaseReportMarkdown(report));
The projected shape is described by schemas/version-release-report.schema.json. Provider-native ids and URLs are preserved as data; Flow does not call hosted release portals or invent provider-specific semantics for this artifact.