Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ci-evidence.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"release tag, commit, clean tree, artifact pins and Policy tag history (tools/build_release.py)",
"immutable release bundles and checksums",
"release notes",
"draft prerelease",
"draft release, marked pre-release for every tag outside vMAJOR.MINOR.PATCH",
"bundle attestation"
],
"profiles": {
Expand Down
18 changes: 14 additions & 4 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
# run again when the evidence is reused; a refusal fails the release, and the fresh route is the
# operator's choice. A tag the gate does not admit (a release candidate, a policy-v tag) reuses
# nothing: the release job runs the whole suite itself, as before. The tag, milestone, Policy,
# bundle, notes, prerelease and attestation steps of the release job stay fresh either way.
# bundle, notes, draft and attestation steps of the release job stay fresh either way.
evidence:
name: CI evidence at the tag
runs-on: ubuntu-latest
Expand All @@ -28,9 +28,11 @@ jobs:
# Reading this repository's workflow runs, jobs and artifacts.
actions: read
# true only when the gate exited 0 and its decision record says reuse; anything else, an empty
# value included, makes the release job run the whole suite.
# value included, makes the release job run the whole suite. route is the tag grammar alone
# (evidence for vMAJOR.MINOR.PATCH, fresh otherwise); the draft step reads it, not the evidence.
outputs:
reuse: ${{ steps.reused.outputs.reuse }}
route: ${{ steps.route.outputs.route }}
steps:
# The gate's tag grammar: vMAJOR.MINOR.PATCH in ASCII digits, no leading zeroes, nothing after.
- name: Choose reuse or the whole suite at the tag
Expand Down Expand Up @@ -191,18 +193,26 @@ jobs:
--commit "${GITHUB_SHA}"
--output dist

- name: Create draft prerelease
# A plain vMAJOR.MINOR.PATCH tag is drafted as a release the maintainer publishes. Every other
# tag (a release candidate, a policy-v tag), and any route value but evidence, is drafted as a
# pre-release.
- name: Create draft release
shell: bash
run: |
prerelease=(--prerelease)
if [[ "${RELEASE_ROUTE}" == "evidence" ]]; then
prerelease=()
fi
gh release create "${GITHUB_REF_NAME}" \
dist/* \
--draft \
--prerelease \
"${prerelease[@]}" \
--verify-tag \
--title "Judgment Pack Specification ${GITHUB_REF_NAME}" \
--notes-file "releases/${GITHUB_REF_NAME}.md"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_ROUTE: ${{ needs.evidence.outputs.route }}

- name: Attest release bundles
uses: actions/attest@f7c74d28b9d84cb8768d0b8ca14a4bac6ef463e6 # v4.2.0
Expand Down
237 changes: 131 additions & 106 deletions CHANGELOG.md

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions VERSIONING.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ tooling can read the renamed manifest status. The unsuffixed `v0.3.0` tag is the
companion's `policy-v<releaseVersion>-draft.N` route remains independent and is not replaced by this
Core convention.

Across the project, `vX.Y.Z-rc.N` is a candidate of the complete milestone that graduates to
`vX.Y.Z` with no change to its normative artifacts (schemas, corpus, Core and companion rules);
text and tooling that named the candidate distribution are updated to name the release, and the
release's notes list those changes. `vX.Y.Z-alpha.N`, used by the implementations and never by this
repository's Core route, is a scoped cut for a named consumer that never graduates.

That first candidate is a distribution of the proposed exact `specVersion` `0.3.0` artifacts;
`0.3.0-rc.1` is its distribution identity, not a pack version selector. Its closed mapping at
`releases/v0.3.0-rc.1.json` is required by the builder. Both manifests remain maturity `draft`:
Expand Down
85 changes: 4 additions & 81 deletions docs/releases/v0.3.0.md
Original file line number Diff line number Diff line change
@@ -1,83 +1,6 @@
# v0.3.0

`0.3.0`, tagged `v0.3.0`, is the first Core release whose `specVersion` has no `-draft` suffix.
The released `0.2.0-draft` identifier and its tag keep their names. Before the release, one
`v0.3.0-rc.1` GitHub pre-release gives adopters about a week to verify that their tooling reads the
manifest maturity `status` as `draft` rather than the retired `research-preview` value.

## Included work

- Core escalation routes from RFC 0025: an exclusive single target or bounded conditional routes,
with routed handoff provenance and complete retained reasons.
- The `base` and `extended` document ceiling profiles from RFC 0026, including reader negotiation
and explicit refusal of an unsupported profile.
- The non-normative rule-overlap check and its closed `JPS-RULES-OVERLAP` diagnostic.
- RFC 0020's bulk amendment: contributing-rule output records, disposition summaries, reproducible
seeded samples, drift comparison, and the closed workflow schema and hand-written fixture that
verify those records.
- RFC 0020's later-sibling rule, limited to instances admitted for acquisition so an admission
failure retains its own finding.
- Dialect data-quality conversions, reconciliation, typed research-result states, lineage,
versioned source profiles, resolved settings, and byte-retaining replay contracts.
- RFC 0022's alignment with the landed composition decisions for subgraph bounds, routed handoff
provenance, dialect-owned remapping, and cross-installation packaging.

## Versioning and maturity

Pre-`1.0.0` Core releases may be incompatible when their notes record the change and give a
`specVersion` migration note. Conformance manifest `status` is now the independent maturity ladder
`draft`, `candidate`, and `release`; `0.3.0` remains `draft`. The `release` maturity is reserved for
the `1.0.0` standards claim after the governance acceptance evidence is met and recorded. Production
use does not by itself establish that claim.

The Policy companion remains on its independent `policy-v1.0.0-draft.N` route until that format's
first release and is not renamed by the Core scheme change.

RFC 0024 and the Policy companion's record land in the release if merged before the tag.

## Migration note

Packs targeting this release declare exact `specVersion` `0.3.0`. Reader and writer compatibility
is not inferred from a shared `0.x` prefix: historical readers reject this selector, and `0.3.0`
profiles and routed escalations require corresponding reader support. Writers targeting
`0.2.0-draft` must obey its historical schema, which admits neither `profile` nor escalation `routes`.
Multiple-version readers dispatch on the complete selector; they do not apply current rules to old
selectors or rewrite old documents on read.

Carrier admission is tighter: Unicode escapes in the UTF-16 surrogate range must form well-formed
surrogate pairs.
For example, a lone `\uD800` title escape accepted by the published `0.2.0-draft` carrier and
structural schema is malformed in `0.3.0`. A version-only edit cannot repair those bytes. The author
must provide the intended scalar or valid surrogate pair; automatic replacement would lose meaning.

Selector-only migration is sufficient only for documents that already meet the current carrier,
structural and semantic requirements. Revalidate profile/ceiling support and escalation shapes;
otherwise review and edit the content deliberately. No general automatic migration or unchanged
conformance-verdict promise is made. Re-declaration also selects the exact new evaluator semantics
and corpus, not inherited evaluator conformance. The Runtime must vendor the exact resulting
artifacts beside historical releases and retain exact-selector dispatch; it must not overwrite the
existing `0.2.0-draft` artifacts.

## Preserved historical schema identities

Historical resources come from immutable source tags, not mutable pre-repin `main`:
`v0.1.0-draft` is commit `80958f50c851e9809cb8036a23622391cf437c99`, and `v0.2.0-draft` is
commit `0f30fd7b2c3fd7792249c8f3c5335b9e697a2c7a`. The two `0.1.0-draft` resources retain the
already documented neutral-domain `$id` substitution and no other byte change, as recorded in the
[0.2.0-draft preservation note](../../releases/v0.2.0-draft.md#what-preserved-means-for-the-010-draft-schemas).
The three `0.2.0-draft` resources are byte-identical to their original tagged forms, including
`research-preview` maturity and the original structural rules. Their historical identities remain
published; new maturity values and profile/routes rules apply only to the current resources.

| Preserved file | Original tagged SHA-256 | Preserved SHA-256 |
| --- | --- | --- |
| `schema/judgment-pack-core-0.1.0-draft.schema.json` | `81f6986edc8d2bbf6f49c28a9bbec4f9054f7c72cab5a5028130e01d2e7274d8` | `c65c559db33d19d2f327858635266fca7fcc049fb75083a7a8d47517e27224fc` |
| `schema/conformance-manifest-0.1.0-draft.schema.json` | `fa3f55f53712253551d6374ff3f06621e936b56c04dabd399703bbb05285c740` | `f073bde8f6f2189edd0334c81c03fecfacf8fae2bd49305a788c75550dcbc2c5` |
| `schema/judgment-pack-core-0.2.0-draft.schema.json` | `847910902fa202d9fb3a97062071b532f11649031c9dad32490bf191dca5b3b5` | `847910902fa202d9fb3a97062071b532f11649031c9dad32490bf191dca5b3b5` |
| `schema/conformance-manifest-0.2.0-draft.schema.json` | `e531a1a89f188dc12ff682263fdd6a0022bcfb6977dfeb642dd05fcbec5e0723` | `e531a1a89f188dc12ff682263fdd6a0022bcfb6977dfeb642dd05fcbec5e0723` |
| `schema/conformance-evaluation-manifest-0.2.0-draft.schema.json` | `142c30a33c7272cff5e85522b95d36316d2e195565bc5bef6c04a999e0da51f6` | `142c30a33c7272cff5e85522b95d36316d2e195565bc5bef6c04a999e0da51f6` |

The evaluation manifest schema remains at
`https://judgmentpack.org/schema/0.2.0-draft/conformance/evaluation/manifest.schema.json`;
the historical Core and document-manifest `$id` paths also remain served. The Core bundles carry
all five preserved resources. Separately pinned Policy consumer bytes and format digests are unchanged.
The `0.3.0` release notes are now the immutable [`releases/v0.3.0.md`](../../releases/v0.3.0.md):
the two release candidates, the included work, the selected retained-column leaf, versioning and
maturity, the migration note, the preserved historical schema identities, what the release pins,
and the checks run for it.
Loading
Loading