Skip to content

Commit 180f92a

Browse files
Merge pull request #18 from OpenStatSpec/agent/stable-spec-v071
release: pin Python adapter to specification v0.3.0
2 parents 581f10e + fc7c694 commit 180f92a

10 files changed

Lines changed: 219 additions & 20 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
uses: actions/checkout@v7
2121
with: &specification-checkout
2222
repository: OpenStatSpec/specification
23-
ref: f2fdf687d8cb32b944ca55a3e9e7215ffc603019
23+
ref: cd8f198c68b849eb8ed018a894670a0904c2181d
2424
path: openstatspec-specification
2525
- name: Checkout required SPSS engine
2626
uses: actions/checkout@v7

‎.github/workflows/release.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ jobs:
4848
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
4949
with:
5050
repository: OpenStatSpec/specification
51-
ref: f2fdf687d8cb32b944ca55a3e9e7215ffc603019
51+
ref: cd8f198c68b849eb8ed018a894670a0904c2181d
5252
path: openstatspec-specification
5353
- name: Checkout specification package source
5454
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1

‎CHANGELOG.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ All notable changes to this reference implementation are documented here.
66

77
_No unreleased changes._
88

9+
## 0.7.1 - 2026-08-12
10+
11+
### Changed
12+
13+
- Pinned capability declarations, conformance fixtures, and release validation
14+
to the published OpenStatSpec specification `v0.3.0` at exact commit
15+
`cd8f198c68b849eb8ed018a894670a0904c2181d`.
16+
917
## 0.7.0 - 2026-08-11
1018

1119
### Added

‎docs/release-readiness.md‎

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 0.7.0 release readiness
1+
# 0.7.1 release readiness
22

33
This page records the expected release contract, not a publication event.
44
Creating a version tag remains a separate maintainer action.
@@ -114,12 +114,10 @@ capability claim, or implied support.
114114
4. Build with `python -m build` and install the generated wheel in a clean
115115
environment.
116116
5. Confirm `openstatspec capabilities` reflects the intended support boundary.
117-
6. Confirm CI, release fixtures, and capabilities use the untagged OpenStatSpec
118-
specification release candidate at exact commit
119-
`f2fdf687d8cb32b944ca55a3e9e7215ffc603019`, publish
120-
`specification_status=release_candidate`, and leave
121-
`specification_release` null. If that exact commit receives a stable tag
122-
before this package is tagged, update the identity and re-run every gate.
117+
6. Confirm CI, release fixtures, and capabilities use the published OpenStatSpec
118+
specification `v0.3.0` at exact commit
119+
`cd8f198c68b849eb8ed018a894670a0904c2181d`, publish
120+
`specification_status=stable`, and set `specification_release` to `v0.3.0`.
123121
7. Review this document, the README, and CHANGELOG for accurate scope.
124122

125123
The tag-triggered release workflow repeats the non-service test suite, builds
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
# Python 0.7.1 Stable Specification Pin Implementation Plan
2+
3+
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4+
5+
**Goal:** Release Python adapter `0.7.1` with stable, exact provenance for specification `v0.3.0`.
6+
7+
**Architecture:** Keep the provenance values centralized in `src/openstatspec/sql/capabilities.py`; tests and capability declarations consume those values. CI and release-readiness documentation pin the same immutable specification commit, while the package version changes only in packaging metadata.
8+
9+
**Tech Stack:** Python 3.11–3.14, pytest, GitHub Actions, `python -m build`, Twine, PyPI Trusted Publishing.
10+
11+
## Global Constraints
12+
13+
- Specification commit: `cd8f198c68b849eb8ed018a894670a0904c2181d`.
14+
- Specification status: `stable`.
15+
- Specification release: `v0.3.0`.
16+
- Package version: `0.7.1`.
17+
- Keep the SPSS engine pin, companion package pin, SQL profile matrix, and runtime behavior unchanged.
18+
- Do not publish or change the normative specification package in this task.
19+
20+
---
21+
22+
### Task 1: Update provenance contract tests first
23+
24+
**Files:**
25+
- Modify: `tests/test_cli.py:44-48`
26+
- Modify: `tests/test_sql_profiles.py:32-40`
27+
28+
**Interfaces:**
29+
- Consumes: public `openstatspec.capability_matrix()` and SQL profile declarations.
30+
- Produces: executable expectations for stable `v0.3.0` provenance.
31+
32+
- [ ] **Step 1: Change the assertions to the stable identity**
33+
34+
Replace the candidate expectations with:
35+
36+
```python
37+
assert matrix["specification_status"] == "stable"
38+
assert matrix["specification_release"] == "v0.3.0"
39+
assert matrix["specification_commit"] == "cd8f198c68b849eb8ed018a894670a0904c2181d"
40+
```
41+
42+
Apply the same three values to each profile declaration assertion.
43+
44+
- [ ] **Step 2: Run the focused tests and confirm the expected red state**
45+
46+
Run:
47+
48+
```bash
49+
python -m pytest -q tests/test_cli.py::test_capability_matrix_is_public_and_cli_matches_engine_boundary tests/test_sql_profiles.py::test_profile_declarations_publish_stable_specification_provenance
50+
```
51+
52+
Expected: both tests fail because production constants still expose the old release-candidate identity.
53+
54+
- [ ] **Step 3: Commit the failing-test update**
55+
56+
```bash
57+
git add tests/test_cli.py tests/test_sql_profiles.py
58+
git commit -m "test: expect stable specification v0.3.0"
59+
```
60+
61+
### Task 2: Bind production provenance and release metadata
62+
63+
**Files:**
64+
- Modify: `src/openstatspec/sql/capabilities.py:20-23`
65+
- Modify: `pyproject.toml:7`
66+
- Modify: `.github/workflows/ci.yml:23`
67+
- Modify: `.github/workflows/release.yml:51`
68+
- Modify: `docs/release-readiness.md:1,116-123`
69+
- Modify: `CHANGELOG.md` after the `Unreleased` section
70+
71+
**Interfaces:**
72+
- Consumes: the exact specification commit from the published `v0.3.0` tag.
73+
- Produces: capability output and release automation identifying `stable`, `v0.3.0`, and `cd8f198c...`.
74+
75+
- [ ] **Step 1: Update the centralized capability constants**
76+
77+
Set the declarations to:
78+
79+
```python
80+
SPECIFICATION_COMMIT = "cd8f198c68b849eb8ed018a894670a0904c2181d"
81+
SPECIFICATION_STATUS = "stable"
82+
SPECIFICATION_RELEASE: str | None = "v0.3.0"
83+
```
84+
85+
- [ ] **Step 2: Bump the package and CI fixture pin**
86+
87+
Set `project.version` in `pyproject.toml` to `0.7.1`. Replace the old specification checkout ref in both workflows with the exact commit `cd8f198c68b849eb8ed018a894670a0904c2181d`; leave the companion package ref unchanged.
88+
89+
- [ ] **Step 3: Update release documentation and changelog**
90+
91+
Rename the readiness heading to `0.7.1 release readiness`, change its specification checklist to the stable commit/release identity, and add a dated `0.7.1` entry explaining that the adapter now pins published specification `v0.3.0`.
92+
93+
- [ ] **Step 4: Run focused tests and confirm green**
94+
95+
Run the focused command from Task 1. Expected: both tests pass.
96+
97+
- [ ] **Step 5: Commit the implementation and metadata**
98+
99+
```bash
100+
git add src/openstatspec/sql/capabilities.py pyproject.toml .github/workflows/ci.yml .github/workflows/release.yml docs/release-readiness.md CHANGELOG.md
101+
git commit -m "release: pin Python adapter to specification v0.3.0"
102+
```
103+
104+
### Task 3: Verify the complete Python release candidate
105+
106+
**Files:**
107+
- Verify: all tracked files in the Python repository.
108+
109+
- [ ] **Step 1: Check the diff and stale current references**
110+
111+
Run:
112+
113+
```bash
114+
git diff --check
115+
rg -n 'f2fdf687d8cb32b944ca55a3e9e7215ffc603019|specification_status.*release_candidate|specification_release.*None|version = "0\.7\.0"' src tests .github docs pyproject.toml
116+
```
117+
118+
Expected: no stale current references; historical changelog entries may retain their original release evidence.
119+
120+
- [ ] **Step 2: Run the non-service test suite**
121+
122+
```bash
123+
python -m pytest -m "not services"
124+
```
125+
126+
Expected: zero failures.
127+
128+
- [ ] **Step 3: Build and smoke-test the package**
129+
130+
```bash
131+
rm -rf /tmp/openstatspec-v071-dist /tmp/openstatspec-v071-smoke
132+
python -m build --outdir /tmp/openstatspec-v071-dist
133+
python -m twine check /tmp/openstatspec-v071-dist/*
134+
python -m venv /tmp/openstatspec-v071-smoke
135+
/tmp/openstatspec-v071-smoke/bin/python -m pip install ./openstatspec-pyspssio
136+
/tmp/openstatspec-v071-smoke/bin/python -m pip install /tmp/openstatspec-v071-dist/openstatspec-0.7.1-*.whl
137+
/tmp/openstatspec-v071-smoke/bin/openstatspec capabilities
138+
```
139+
140+
Expected: build and Twine checks pass, and capabilities reports `stable`, `v0.3.0`, and the exact commit.
141+
142+
### Task 4: Review, publish, and release
143+
144+
- [ ] **Step 1: Run the local review loop and fix every actionable finding**
145+
146+
Review the complete branch diff against `origin/main`; repeat the tests after each fix until no actionable findings remain.
147+
148+
- [ ] **Step 2: Push the branch and open a draft PR**
149+
150+
Push `agent/stable-spec-v071` to `OpenStatSpec/python`, open a PR targeting `main`, mark it ready for review, and add `@codex review`.
151+
152+
- [ ] **Step 3: Iterate on GitHub review and CI**
153+
154+
Inspect every Codex review finding and failing check, fix actionable issues locally, push, and repeat until the review and required checks are clean.
155+
156+
- [ ] **Step 4: After merge, create and push annotated tag `v0.7.1`**
157+
158+
Verify the tag targets the merge commit and wait for tag-context CI to pass before relying on the existing PyPI workflow.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Python 0.7.1 stable specification pin
2+
3+
## Goal
4+
5+
Publish the Python adapter's first patch release after Python adapter `v0.7.0`
6+
with its capability declarations and conformance fixtures bound to the
7+
published OpenStatSpec specification `v0.3.0`.
8+
9+
## Scope
10+
11+
- Bump the Python distribution from `0.7.0` to `0.7.1`.
12+
- Replace the release-candidate specification identity with:
13+
- commit `cd8f198c68b849eb8ed018a894670a0904c2181d`;
14+
- status `stable`;
15+
- release `v0.3.0`.
16+
- Update unit expectations, CI fixture checkouts, release-readiness guidance,
17+
and the changelog so every release surface carries the same identity.
18+
- Keep the required SPSS engine pin, specification companion package pin,
19+
database version matrix, and runtime behavior unchanged.
20+
- Separately update the specification repository roadmap to mark the completed
21+
`v0.3.0` release gates and current public release.
22+
23+
## Release and verification
24+
25+
The Python change is reviewed through a pull request. Before tagging `v0.7.1`,
26+
run the non-service suite, package build and wheel smoke test, and the full
27+
GitHub CI matrix. The annotated `v0.7.1` tag must target the merged release
28+
commit; its tag-context workflow must pass before the existing trusted-PyPI
29+
workflow publishes the package artifacts.
30+
31+
## Non-goals
32+
33+
This work does not add transformation behavior, change SQL dialect support,
34+
modify the normative specification, or publish a new specification package
35+
version.

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "openstatspec"
7-
version = "0.7.0"
7+
version = "0.7.1"
88
description = "Reference adapter for the OpenStatSpec relational contract"
99
readme = "README.md"
1010
requires-python = ">=3.11"

‎src/openstatspec/sql/capabilities.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818

1919
# Release/build automation binds the adapter to the exact language-neutral
2020
# specification revision used for normative fixtures and profile semantics.
21-
SPECIFICATION_COMMIT = "f2fdf687d8cb32b944ca55a3e9e7215ffc603019"
22-
SPECIFICATION_STATUS = "release_candidate"
23-
SPECIFICATION_RELEASE: str | None = None
21+
SPECIFICATION_COMMIT = "cd8f198c68b849eb8ed018a894670a0904c2181d"
22+
SPECIFICATION_STATUS = "stable"
23+
SPECIFICATION_RELEASE: str | None = "v0.3.0"
2424

2525
DOLT_WRITE_CONFORMANCE = {
2626
"declaration_schema_id": "openstatspec-dolt-adapter-declaration-v1",

‎tests/test_cli.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ def test_cli_import_inspect_validate_and_export_emit_json(tmp_path, capsys) -> N
4242

4343
def test_capability_matrix_is_public_and_cli_matches_engine_boundary(capsys) -> None:
4444
matrix = openstatspec.capability_matrix()
45-
assert matrix["specification_status"] == "release_candidate"
46-
assert matrix["specification_release"] is None
47-
assert matrix["specification_commit"] == "f2fdf687d8cb32b944ca55a3e9e7215ffc603019"
45+
assert matrix["specification_status"] == "stable"
46+
assert matrix["specification_release"] == "v0.3.0"
47+
assert matrix["specification_commit"] == "cd8f198c68b849eb8ed018a894670a0904c2181d"
4848
assert matrix["directions"] == ["import", "export", "semantic_round_trip"]
4949
assert matrix["active_connection"] is None
5050
assert matrix["engine"]["package"] == "openstatspec-pyspssio"

‎tests/test_sql_profiles.py‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ def test_profile_detection_tracks_supported_dialect_urls() -> None:
2929
assert profile_for_url("mariadb+mariadbconnector://user@host/database") is MYSQL
3030
assert profile_for_url("mysql+pymysql://user@host/dolt_database") is MYSQL
3131

32-
def test_profile_declarations_publish_specification_candidate_provenance() -> None:
32+
def test_profile_declarations_publish_stable_specification_provenance() -> None:
3333
for declaration in capabilities.profile_declarations().values():
34-
assert declaration["specification_status"] == "release_candidate"
35-
assert declaration["specification_release"] is None
34+
assert declaration["specification_status"] == "stable"
35+
assert declaration["specification_release"] == "v0.3.0"
3636
assert (
3737
declaration["specification_commit"]
38-
== "f2fdf687d8cb32b944ca55a3e9e7215ffc603019"
38+
== "cd8f198c68b849eb8ed018a894670a0904c2181d"
3939
)
4040

4141
def test_profile_preflight_fails_without_transforming_a_wide_dataset() -> None:

0 commit comments

Comments
 (0)