Release Policy
The gate is a predicate over claims. The build is a separate, expensive function of a tree. Conflating them is what makes a green check mean “some machine you don’t control ran something.” Keeping them apart is what lets a party with no compute reach the same verdict as one with a build farm (R3).
Shape
Release of artifact digest D from tree T under policy P holds when all
of the following are true at evaluation time:
- No falsified premise. No claim in the transitive
dependsOnclosure rooted atT’s claim set has statusfalsified. - Bounded residue. Claims with status
unevaluatedare withinP’s allowance, and each excess is covered by aresidue-acceptancerecord signed by a keyPnames. - Origin floor. Claims that
Pdesignates load-bearing haveorigin.kind = harness-observed. Agent-asserted claims may inform, butPshould not let them alone carry a release. - Builder agreement. K independent producers have signed statements with
subject
Dfor treeT, each meetingP’shermeticityfloor.
Condition 4 is where “true artifact” actually lives, and it is the expensive one. Available — E2 passed (same-triple divergences all cheap-to-fix; K-of-N agreement is per target triple).
Evaluation is live, not frozen
The artifact carries a pointer to (T, P), not a verdict. Consumers
re-evaluate. If a load-bearing claim is falsified after release, the artifact’s
status changes with no byte moving and no re-signing — the property from
README that justifies the project. T is an elench tree OID
(ADR-0001), not a git commit. The git projection (ADR-0002) is not
consulted at evaluation time.
This is certificate-revocation shaped and inherits its problems: consumers who never re-check are unprotected, and there is no push path. Do not pretend otherwise in the docs.
Artifact format
The artifact is serialized as JSON and validated against
schema/artifact.schema.json. Fields:
version— format version (current:"0.1"). Consumers SHOULD reject unknown major versions.tree— elench tree OID (64 hex chars).policy— policy name under which the artifact was released.digest— SHA-256 digest of the artifact (binary, container image).released_at— Unix epoch seconds. NOT a verdict.description— optional human-readable description.
No verdict field. No pass/fail. The artifact is a pointer; the consumer re-evaluates.
Deliberately not specified
- What K should be. Depends on how many independent builders exist, which is an organisational fact, not a design one.
- Cross-party reconciliation. Two evaluators with different
Preaching different verdicts is correct behaviour, not a bug. Out of scope. - Emergency override. Every real system grows one. Specifying it now would be guessing; leaving it unspecified means it will be added badly under pressure. Flagged, not resolved.