From 310407af3a9867065f76703f3b8ba4a1324daf42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=B5nis=20Ormisson?= Date: Fri, 21 Aug 2026 20:29:34 +0300 Subject: [PATCH 1/3] release: prepare specification v0.4.0 --- CHANGELOG.md | 14 +++++++++--- README.md | 6 ++--- ROADMAP.md | 10 +++++++-- docs/spss-syntax-frontend-profile-0.3.md | 8 +++---- src/openstatspec_specification/artifacts.py | 25 ++++++++++++++++----- tests/test_contract_artifacts.py | 2 +- 6 files changed, 46 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eabca06..2228578 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,14 +2,22 @@ ## Unreleased -- SPSS Syntax Frontend 0.3 is a release candidate, not a published stable - claim. +Future changes will be listed here. + +## v0.4.0 - 2026-08-21 + +OpenStatSpec `v0.4.0` publishes SPSS Syntax Frontend 0.3 as a stable optional +profile. The release tag is the immutable specification identity for this +release. + - Added comments, existing-variable `TO`, grouped supported forms, predicate aliases and bounded `NOT`, open recode ranges, and additive value labels. - Frontend 0.3 emits only immutable Plan 0.1/0.2 objects and adds no SQL binding operation. - Repository validation now covers all Plan/Frontend/Binding schemas, - manifests, references, and hashes. + manifests, references, inherited cases, and canonical hashes. +- Adapter claims remain downstream and separately gated; this release does not + assert PHP or Python implementation conformance. ## v0.3.0 - 2026-08-12 diff --git a/README.md b/README.md index c93888e..0edc9e1 100644 --- a/README.md +++ b/README.md @@ -51,9 +51,9 @@ creates no derived dataset, data copy, or OpenStatSpec undo layer; Dolt-specific history and commits remain Dolt's. MySQL, MariaDB, and Dolt require a new target to be provisioned separately before an in-place transformation apply. -The release-candidate [SPSS Syntax Frontend Profile 0.3](docs/spss-syntax-frontend-profile-0.3.md) -adds syntax-only expansion over the released Plan 0.1/0.2 contracts and is not -published stable yet. +The released [SPSS Syntax Frontend Profile 0.3](docs/spss-syntax-frontend-profile-0.3.md) +was published in OpenStatSpec `v0.4.0`. It adds syntax-only expansion over the +released Plan 0.1/0.2 contracts and does not change SQL binding behavior. ## Repository layout diff --git a/ROADMAP.md b/ROADMAP.md index e8ebe49..8c75764 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -30,7 +30,7 @@ Prerequisite: the core mapping and canonical fixtures are stable enough to test and fixtures. - [x] Define adapter conformance guidance; each adapter repository owns its runtime CI and evidence. - [x] Define versioning and compatibility guidance for the specification and profiles. -- [x] Publish release notes and tagged specification releases; `v0.3.0` is the +- [x] Publish release notes and tagged specification releases; `v0.4.0` is the current public specification release and is immutable. - [ ] Expand implementation, dialect-profile, and adoption documentation from real adapter experience. @@ -122,8 +122,14 @@ follows and does not block specification publication. 5. [ ] Have PHP pin the exact specification commit and pass applicable conformance evidence before changing adapter or package-release claims. +6. [x] Merged and reviewed SPSS Syntax Frontend profile 0.3 as a + backward-compatible optional profile over immutable Plan 0.1/0.2 contracts. +7. [x] Prepared specification `v0.4.0` release notes, stable profile status, + exact artifact validation, and tag-context CI requirements; adapter claims + remain downstream and are not implied by this release. + The pending in-place service matrix and adapter conformance work in sections 6 -and 7 are downstream implementation gates. They do not block the `v0.3.0` +and 7 are downstream implementation gates. They do not block the `v0.4.0` specification release, and publishing the specification does not complete those implementation evidence gates. diff --git a/docs/spss-syntax-frontend-profile-0.3.md b/docs/spss-syntax-frontend-profile-0.3.md index 4cfa15e..6ff32d0 100644 --- a/docs/spss-syntax-frontend-profile-0.3.md +++ b/docs/spss-syntax-frontend-profile-0.3.md @@ -2,9 +2,9 @@ ## Status and boundary -Status: release candidate for the next OpenStatSpec minor release. This profile -is not published stable until a protected or signed specification tag targets -its exact reviewed commit and tag-context CI passes. +Status: released in OpenStatSpec `v0.4.0`. The protected specification tag is +the immutable release identity and its exact tag-context CI passed before +publication. This optional frontend profile maps a deliberately bounded SPSS-like command language to Transformation Plan 0.1 or 0.2. Its request contract is @@ -151,7 +151,7 @@ after inherited cases and the two published comment supersessions are applied. An adapter claim for this profile MUST satisfy every gate below: -1. Pin the exact future specification release commit. +1. Pin the exact `v0.4.0` specification commit. 2. Accept only the exact Frontend 0.3 request contract for this suite. 3. Run all 90 effective Frontend 0.3 cases. 4. Preserve every inherited Plan 0.1/0.2 object and hash. diff --git a/src/openstatspec_specification/artifacts.py b/src/openstatspec_specification/artifacts.py index 052ed39..88e8b1b 100644 --- a/src/openstatspec_specification/artifacts.py +++ b/src/openstatspec_specification/artifacts.py @@ -25,6 +25,7 @@ "0.2": "conformance/in-place-transformation-0.2.json", } V030_COMMIT = "cd8f198c68b849eb8ed018a894670a0904c2181d" +V040_RELEASE = "v0.4.0" V030_PROFILE_DOCUMENTS = ( "docs/transformation-plan-profile-0.2.md", "docs/spss-syntax-frontend-profile-0.2.md", @@ -718,7 +719,7 @@ def validate_release_metadata(root: Path) -> None: f"{relative}: stale release status remains", ) roadmap = " ".join(_load_text(root, "ROADMAP.md").split()) - _require("`v0.3.0` is the" in roadmap, "ROADMAP release tag mismatch") + _require(f"`{V040_RELEASE}` is the" in roadmap, "ROADMAP release tag mismatch") _require( "current public specification release and is immutable" in roadmap, "ROADMAP release status mismatch", @@ -727,13 +728,13 @@ def validate_release_metadata(root: Path) -> None: frontend_03 = " ".join(_load_text(root, FRONTEND_03_PROFILE_DOCUMENT).split()) _require( - "Status: release candidate for the next OpenStatSpec minor release." in frontend_03 - and "is not published stable until a protected or signed specification tag targets" in frontend_03 - and "its exact reviewed commit and tag-context CI passes." in frontend_03, - f"{FRONTEND_03_PROFILE_DOCUMENT}: release-candidate status is missing", + f"Status: released in OpenStatSpec `{V040_RELEASE}`." in frontend_03 + and "protected specification tag is the immutable release identity" in frontend_03 + and "exact tag-context CI passed before publication." in frontend_03, + f"{FRONTEND_03_PROFILE_DOCUMENT}: stable release status is missing", ) for phrase in ( - "Pin the exact future specification release commit.", + f"Pin the exact `{V040_RELEASE}` specification commit.", "Accept only the exact Frontend 0.3 request contract for this suite.", "Run all 90 effective Frontend 0.3 cases.", "Preserve every inherited Plan 0.1/0.2 object and hash.", @@ -747,6 +748,18 @@ def validate_release_metadata(root: Path) -> None: f"{FRONTEND_03_PROFILE_DOCUMENT}: adapter claim gate is missing {phrase}", ) + changelog = " ".join(_load_text(root, "CHANGELOG.md").split()) + _require( + f"## {V040_RELEASE} - 2026-08-21" in changelog + and f"OpenStatSpec `{V040_RELEASE}` publishes SPSS Syntax Frontend 0.3" in changelog, + "CHANGELOG v0.4.0 release entry is missing", + ) + readme = " ".join(_load_text(root, "README.md").split()) + _require( + f"was published in OpenStatSpec `{V040_RELEASE}`" in readme, + "README v0.4.0 Frontend 0.3 release wording is missing", + ) + classification = " ".join( _load_text(root, "docs/spss-frontend-roadmap.md").split() ) diff --git a/tests/test_contract_artifacts.py b/tests/test_contract_artifacts.py index eb5f2ce..eae2707 100644 --- a/tests/test_contract_artifacts.py +++ b/tests/test_contract_artifacts.py @@ -129,7 +129,7 @@ def test_existing_frontend_03_manifest_artifact_type_fails_closed( validate_contract_artifacts(root) -def test_v030_profile_status_is_consistently_released() -> None: +def test_v040_profile_status_is_consistently_released() -> None: validate_release_metadata(ROOT) From f8a96521ccf076352e1b448712fd57676fba00e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=B5nis=20Ormisson?= Date: Fri, 21 Aug 2026 20:36:06 +0300 Subject: [PATCH 2/3] docs: align frontend roadmap release status --- docs/spss-frontend-roadmap.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/spss-frontend-roadmap.md b/docs/spss-frontend-roadmap.md index ec44993..5d45bd9 100644 --- a/docs/spss-frontend-roadmap.md +++ b/docs/spss-frontend-roadmap.md @@ -3,18 +3,19 @@ ## Status and boundary This roadmap describes intended work, not a compatibility claim or release-date -promise. The current published boundary remains the exact bounded grammar in -[SPSS Syntax Frontend 0.2](spss-syntax-frontend-profile-0.2.md). Every syntax -form outside a claimed frontend contract must continue to fail closed. +promise. The current published boundary includes the exact bounded grammar in +[SPSS Syntax Frontend 0.3](spss-syntax-frontend-profile-0.3.md) and its +backward-compatible 0.1/0.2 predecessor profiles. Every syntax form outside a +claimed frontend contract must continue to fail closed. OpenStatSpec will expand the frontend in independently versioned stages. It will not advertise general IBM SPSS Statistics compatibility, forward source expressions into SQL, or weaken the same-dataset/same-table and caller-owned Dolt history rules. -Frontend 0.3 is specification-complete as a release candidate. Adapter claims -remain pending and separately gated; adapter evidence does not block -specification publication. +Frontend 0.3 is released in OpenStatSpec `v0.4.0`. Adapter claims remain +pending and separately gated; adapter evidence does not block specification +publication. ## Command classification From addce3093aa7424efd1ea09c66ccf0bc5902031f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?T=C3=B5nis=20Ormisson?= Date: Fri, 21 Aug 2026 20:38:43 +0300 Subject: [PATCH 3/3] test: include README release fixture --- tests/test_contract_artifacts.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_contract_artifacts.py b/tests/test_contract_artifacts.py index eae2707..7703f16 100644 --- a/tests/test_contract_artifacts.py +++ b/tests/test_contract_artifacts.py @@ -159,6 +159,7 @@ def copied_artifacts(tmp_path: Path) -> Path: shutil.copytree(ROOT / directory, tmp_path / directory) shutil.copy2(ROOT / "CHANGELOG.md", tmp_path / "CHANGELOG.md") shutil.copy2(ROOT / "ROADMAP.md", tmp_path / "ROADMAP.md") + shutil.copy2(ROOT / "README.md", tmp_path / "README.md") return tmp_path