openstatspec 0.7.0__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. {openstatspec-0.7.0 → openstatspec-0.8.0}/.github/workflows/ci.yml +11 -4
  2. {openstatspec-0.7.0 → openstatspec-0.8.0}/.github/workflows/release.yml +3 -3
  3. {openstatspec-0.7.0 → openstatspec-0.8.0}/CHANGELOG.md +32 -0
  4. {openstatspec-0.7.0 → openstatspec-0.8.0}/PKG-INFO +24 -10
  5. {openstatspec-0.7.0 → openstatspec-0.8.0}/README.md +23 -9
  6. {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/release-readiness.md +81 -15
  7. {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/sav-profile.md +1 -1
  8. openstatspec-0.8.0/docs/superpowers/plans/2026-08-12-python-v071-stable-pin.md +158 -0
  9. openstatspec-0.8.0/docs/superpowers/specs/2026-08-12-python-stable-specification-pin-design.md +35 -0
  10. openstatspec-0.8.0/openstatspec-specification/.github/workflows/ci.yml +24 -0
  11. openstatspec-0.8.0/openstatspec-specification/.github/workflows/release.yml +108 -0
  12. openstatspec-0.8.0/openstatspec-specification/.gitignore +5 -0
  13. openstatspec-0.8.0/openstatspec-specification/CHANGELOG.md +116 -0
  14. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/README.md +42 -7
  15. openstatspec-0.8.0/openstatspec-specification/RELEASING.md +81 -0
  16. openstatspec-0.8.0/openstatspec-specification/ROADMAP.md +162 -0
  17. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/VERSIONING.md +10 -1
  18. openstatspec-0.8.0/openstatspec-specification/conformance/spss-syntax-frontend-0.3.json +714 -0
  19. openstatspec-0.8.0/openstatspec-specification/docs/database-io-policy-v1.md +146 -0
  20. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/implementation-profiles/python-pyspssio-0.5.1.md +5 -0
  21. openstatspec-0.8.0/openstatspec-specification/docs/spss-frontend-roadmap.md +158 -0
  22. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-sav-zsav-profile-1.0.md +5 -0
  23. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-syntax-frontend-profile-0.2.md +2 -1
  24. openstatspec-0.8.0/openstatspec-specification/docs/spss-syntax-frontend-profile-0.3.md +164 -0
  25. openstatspec-0.8.0/openstatspec-specification/docs/superpowers/plans/2026-08-12-roadmap-v030-bookkeeping.md +64 -0
  26. openstatspec-0.8.0/openstatspec-specification/docs/superpowers/plans/2026-08-21-spss-frontend-03.md +1361 -0
  27. openstatspec-0.8.0/openstatspec-specification/docs/superpowers/specs/2026-08-21-spss-frontend-expansion-design.md +193 -0
  28. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-profile-0.2.md +2 -1
  29. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-sql-binding-0.2.md +2 -1
  30. openstatspec-0.8.0/openstatspec-specification/examples/spss-syntax-transformation-0.3.md +41 -0
  31. openstatspec-0.8.0/openstatspec-specification/pyproject.toml +22 -0
  32. openstatspec-0.8.0/openstatspec-specification/sql/dialect-profile-baseline.json +1224 -0
  33. openstatspec-0.8.0/openstatspec-specification/sql/dialect-profiles.md +279 -0
  34. openstatspec-0.8.0/openstatspec-specification/sql/dolt-adapter-declaration-schema.json +61 -0
  35. openstatspec-0.8.0/openstatspec-specification/sql/dolt-adapter-declarations/README.md +40 -0
  36. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/sql/profile-capabilities.md +18 -0
  37. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/sql/server-version-policy.md +7 -0
  38. openstatspec-0.8.0/openstatspec-specification/src/openstatspec_specification/__init__.py +19 -0
  39. openstatspec-0.8.0/openstatspec-specification/src/openstatspec_specification/artifacts.py +923 -0
  40. openstatspec-0.8.0/openstatspec-specification/src/openstatspec_specification/dolt.py +1966 -0
  41. openstatspec-0.8.0/openstatspec-specification/tests/test_contract_artifacts.py +272 -0
  42. openstatspec-0.8.0/openstatspec-specification/tests/test_dolt_declarations.py +370 -0
  43. openstatspec-0.8.0/openstatspec-specification/tools/validate_repository.py +178 -0
  44. openstatspec-0.8.0/openstatspec-specification/transformation/spss-syntax-frontend-0.3.schema.json +57 -0
  45. {openstatspec-0.7.0 → openstatspec-0.8.0}/pyproject.toml +1 -1
  46. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/api.py +8 -2
  47. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/spss/sav.py +4 -288
  48. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/capabilities.py +71 -27
  49. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/catalog_api.py +3 -0
  50. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/database_urls.py +17 -0
  51. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/dolt_conformance.py +5 -2
  52. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/inplace_transform.py +3 -0
  53. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/wide.py +20 -300
  54. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/workflow.py +9 -3
  55. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_catalog_lifecycle.py +0 -56
  56. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_catalog_persistence_review.py +0 -90
  57. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_cli.py +6 -3
  58. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_dolt_conformance.py +43 -49
  59. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_loss_reports.py +2 -15
  60. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_normative_catalog.py +1 -17
  61. openstatspec-0.8.0/tests/test_read_only_export.py +262 -0
  62. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_review_transaction_boundary.py +13 -82
  63. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_sql_profiles.py +36 -35
  64. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_sql_services.py +143 -13
  65. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_strict_catalog_review.py +4 -3
  66. openstatspec-0.7.0/openstatspec-specification/.github/workflows/ci.yml +0 -15
  67. openstatspec-0.7.0/openstatspec-specification/.gitignore +0 -2
  68. openstatspec-0.7.0/openstatspec-specification/CHANGELOG.md +0 -57
  69. openstatspec-0.7.0/openstatspec-specification/ROADMAP.md +0 -112
  70. openstatspec-0.7.0/openstatspec-specification/sql/dialect-profile-baseline.json +0 -233
  71. openstatspec-0.7.0/openstatspec-specification/sql/dialect-profiles.md +0 -202
  72. openstatspec-0.7.0/openstatspec-specification/tools/validate_repository.py +0 -934
  73. {openstatspec-0.7.0 → openstatspec-0.8.0}/.github/verify_release_ref.py +0 -0
  74. {openstatspec-0.7.0 → openstatspec-0.8.0}/.gitignore +0 -0
  75. {openstatspec-0.7.0 → openstatspec-0.8.0}/THIRD_PARTY_NOTICES.md +0 -0
  76. {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/architecture.md +0 -0
  77. {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/in-place-transformation.md +0 -0
  78. {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/pyspssio-spike.md +0 -0
  79. {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/sql-transformation-workflow.md +0 -0
  80. {openstatspec-0.7.0 → openstatspec-0.8.0}/docs/transformations.md +0 -0
  81. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/CONTRIBUTING.md +0 -0
  82. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/LICENSE.md +0 -0
  83. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/README.md +0 -0
  84. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/core-numeric-string.sav +0 -0
  85. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/dictionary-and-display.sav +0 -0
  86. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/generate-fixtures.sps +0 -0
  87. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
  88. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/missing-rules.sav +0 -0
  89. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/sets.sav +0 -0
  90. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/weight-and-string-mr.sav +0 -0
  91. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/zsav-compressed.zsav +0 -0
  92. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/in-place-transformation-0.1.json +0 -0
  93. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/in-place-transformation-0.2.json +0 -0
  94. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/spss-sav-zsav-1.0.json +0 -0
  95. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/spss-syntax-frontend-0.1.json +0 -0
  96. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/spss-syntax-frontend-0.2.json +0 -0
  97. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/sql-transformation-workflow-0.1.json +0 -0
  98. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/transformation-plan-0.1.json +0 -0
  99. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/conformance/transformation-plan-0.2.json +0 -0
  100. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/architecture.md +0 -0
  101. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/mssql-dialect-roadmap.md +0 -0
  102. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-profile.md +0 -0
  103. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-syntax-frontend-profile-0.1.md +0 -0
  104. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/sql-transformation-workflow-profile-0.1.md +0 -0
  105. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-profile-0.1.md +0 -0
  106. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-sql-binding-0.1.md +0 -0
  107. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/examples/basic-spss-mapping.md +0 -0
  108. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/examples/spss-syntax-transformation-0.2.md +0 -0
  109. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/examples/spss-syntax-transformation.md +0 -0
  110. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/examples/sql-transformation-workflow.md +0 -0
  111. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/sql/schema-outline.sql +0 -0
  112. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/sql/transformation-plan-profile-schema.sql +0 -0
  113. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/sql/transformation-workflow-profile-schema.sql +0 -0
  114. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/transformation/plan-0.1.schema.json +0 -0
  115. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/transformation/plan-0.2.schema.json +0 -0
  116. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/transformation/spss-syntax-frontend-0.1.schema.json +0 -0
  117. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification/transformation/spss-syntax-frontend-0.2.schema.json +0 -0
  118. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/.github/workflows/ci.yml +0 -0
  119. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/.github/workflows/publish.yml +0 -0
  120. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/.gitignore +0 -0
  121. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/CHANGELOG.md +0 -0
  122. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/CONTRIBUTING.md +0 -0
  123. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/README.md +0 -0
  124. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/RELEASING.md +0 -0
  125. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/ROADMAP.md +0 -0
  126. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/VERSIONING.md +0 -0
  127. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/LICENSE.md +0 -0
  128. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/README.md +0 -0
  129. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/core-numeric-string.sav +0 -0
  130. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/dictionary-and-display.sav +0 -0
  131. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/generate-fixtures.sps +0 -0
  132. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
  133. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/missing-rules.sav +0 -0
  134. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/sets.sav +0 -0
  135. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/weight-and-string-mr.sav +0 -0
  136. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/zsav-compressed.zsav +0 -0
  137. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/in-place-transformation-0.1.json +0 -0
  138. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/in-place-transformation-0.2.json +0 -0
  139. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/spss-sav-zsav-1.0.json +0 -0
  140. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/spss-syntax-frontend-0.1.json +0 -0
  141. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/spss-syntax-frontend-0.2.json +0 -0
  142. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/sql-transformation-workflow-0.1.json +0 -0
  143. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/transformation-plan-0.1.json +0 -0
  144. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/transformation-plan-0.2.json +0 -0
  145. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/architecture.md +0 -0
  146. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/implementation-profiles/python-pyspssio-0.5.1.md +0 -0
  147. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/mssql-dialect-roadmap.md +0 -0
  148. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-profile.md +0 -0
  149. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-sav-zsav-profile-1.0.md +0 -0
  150. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.1.md +0 -0
  151. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.2.md +0 -0
  152. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/sql-transformation-workflow-profile-0.1.md +0 -0
  153. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-profile-0.1.md +0 -0
  154. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-profile-0.2.md +0 -0
  155. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.1.md +0 -0
  156. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.2.md +0 -0
  157. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/examples/basic-spss-mapping.md +0 -0
  158. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/examples/spss-syntax-transformation-0.2.md +0 -0
  159. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/examples/spss-syntax-transformation.md +0 -0
  160. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/examples/sql-transformation-workflow.md +0 -0
  161. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/pyproject.toml +0 -0
  162. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dialect-profile-baseline.json +0 -0
  163. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dialect-profiles.md +0 -0
  164. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dolt-adapter-declaration-schema.json +0 -0
  165. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dolt-adapter-declarations/README.md +0 -0
  166. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/profile-capabilities.md +0 -0
  167. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/schema-outline.sql +0 -0
  168. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/server-version-policy.md +0 -0
  169. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/transformation-plan-profile-schema.sql +0 -0
  170. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/sql/transformation-workflow-profile-schema.sql +0 -0
  171. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/src/openstatspec_specification/__init__.py +0 -0
  172. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/src/openstatspec_specification/dolt.py +0 -0
  173. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/tests/test_dolt_declarations.py +0 -0
  174. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/tools/validate_repository.py +0 -0
  175. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/plan-0.1.schema.json +0 -0
  176. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/plan-0.2.schema.json +0 -0
  177. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/spss-syntax-frontend-0.1.schema.json +0 -0
  178. {openstatspec-0.7.0 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/spss-syntax-frontend-0.2.schema.json +0 -0
  179. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/__init__.py +0 -0
  180. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/cli.py +0 -0
  181. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/core/__init__.py +0 -0
  182. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/core/results.py +0 -0
  183. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/__init__.py +0 -0
  184. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/sas/.gitkeep +0 -0
  185. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/__init__.py +0 -0
  186. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/binding.py +0 -0
  187. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/compiler.py +0 -0
  188. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/execution.py +0 -0
  189. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/syntax.py +0 -0
  190. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/frontends/stata/.gitkeep +0 -0
  191. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/spss/__init__.py +0 -0
  192. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/spss/dictionary.py +0 -0
  193. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/spss/raw_dictionary.py +0 -0
  194. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/__init__.py +0 -0
  195. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/catalog_verification.py +0 -0
  196. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/normative.py +0 -0
  197. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/sql/profiles.py +0 -0
  198. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/transform/__init__.py +0 -0
  199. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/transform/errors.py +0 -0
  200. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/transform/plan.py +0 -0
  201. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/transform/schema.py +0 -0
  202. {openstatspec-0.7.0 → openstatspec-0.8.0}/src/openstatspec/transform/validation.py +0 -0
  203. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/conformance.py +0 -0
  204. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_atomic_import.py +0 -0
  205. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_attribute_catalog.py +0 -0
  206. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_conditional_inplace_transform.py +0 -0
  207. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_document_round_trip.py +0 -0
  208. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_inplace_transform.py +0 -0
  209. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_official_conformance.py +0 -0
  210. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_pyspssio_catalog_authority.py +0 -0
  211. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_release_ref.py +0 -0
  212. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_sav_sqlite.py +0 -0
  213. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_spss_catalog_preflight.py +0 -0
  214. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_sql_workflow.py +0 -0
  215. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_transform_frontend.py +0 -0
  216. {openstatspec-0.7.0 → openstatspec-0.8.0}/tests/test_vls_compatible_names.py +0 -0
@@ -20,7 +20,7 @@ jobs:
20
20
  uses: actions/checkout@v7
21
21
  with: &specification-checkout
22
22
  repository: OpenStatSpec/specification
23
- ref: f2fdf687d8cb32b944ca55a3e9e7215ffc603019
23
+ ref: 864e84479f554b8ee250ffed44c4dfb963750d4a
24
24
  path: openstatspec-specification
25
25
  - name: Checkout required SPSS engine
26
26
  uses: actions/checkout@v7
@@ -53,9 +53,9 @@ jobs:
53
53
  - run: python -m pip install --upgrade pip build
54
54
  - run: python -m build
55
55
  - run: python -m venv /tmp/openstatspec-wheel-smoke
56
- - run: /tmp/openstatspec-wheel-smoke/bin/python -m pip install ./openstatspec-pyspssio
57
56
  - run: /tmp/openstatspec-wheel-smoke/bin/python -m pip install dist/*.whl
58
- - run: /tmp/openstatspec-wheel-smoke/bin/openstatspec capabilities
57
+ - run: env -u PYTHONPATH /tmp/openstatspec-wheel-smoke/bin/openstatspec capabilities
58
+ working-directory: /tmp
59
59
 
60
60
  postgres-integration:
61
61
  name: PostgreSQL ${{ matrix.postgres }} integration
@@ -143,7 +143,7 @@ jobs:
143
143
  steps: *sql-test-steps
144
144
 
145
145
  dolt-integration:
146
- name: Dolt ${{ matrix.dolt }} read-only / fail-closed integration
146
+ name: Dolt ${{ matrix.dolt }} default-write integration
147
147
  runs-on: ubuntu-latest
148
148
  strategy:
149
149
  fail-fast: false
@@ -155,6 +155,7 @@ jobs:
155
155
  image: dolthub/dolt:2.2.3@sha256:1a651e738a2e7275b9c69fec8c5f42c6e23954314405c412f4dc9287ee7c0080
156
156
  env:
157
157
  OPENSTATSPEC_DOLT_URL: mysql+pymysql://openstatspec:openstatspec@127.0.0.1:13308/openstatspec
158
+ OPENSTATSPEC_TEST_DOLT_ADMIN_URL: mysql+pymysql://openstatspec_test_admin:ci-admin@127.0.0.1:13308/
158
159
  OPENSTATSPEC_EXPECTED_DOLT_VERSION: ${{ matrix.dolt }}
159
160
  OPENSTATSPEC_DOLT_IMAGE: ${{ matrix.image }}
160
161
  steps:
@@ -186,6 +187,11 @@ jobs:
186
187
  --workdir /var/lib/dolt \
187
188
  "$OPENSTATSPEC_DOLT_IMAGE" sql \
188
189
  -q "CREATE USER 'openstatspec'@'%' IDENTIFIED BY 'openstatspec'; GRANT ALL PRIVILEGES ON openstatspec.* TO 'openstatspec'@'%'"
190
+ docker run --rm \
191
+ --volume "$RUNNER_TEMP/openstatspec-dolt:/var/lib/dolt" \
192
+ --workdir /var/lib/dolt \
193
+ "$OPENSTATSPEC_DOLT_IMAGE" sql \
194
+ -q "CREATE USER 'openstatspec_test_admin'@'%' IDENTIFIED BY 'ci-admin'; GRANT ALL PRIVILEGES ON *.* TO 'openstatspec_test_admin'@'%' WITH GRANT OPTION"
189
195
  docker run --detach --name openstatspec-dolt \
190
196
  --publish 127.0.0.1:13308:3306 \
191
197
  --volume "$RUNNER_TEMP/openstatspec-dolt:/var/lib/dolt" \
@@ -218,6 +224,7 @@ jobs:
218
224
  break
219
225
  PY
220
226
  - run: python -m pytest -m "services and not candidate_evidence"
227
+ - run: python -m pytest tests/test_read_only_export.py
221
228
  - name: Show Dolt logs on failure and stop server
222
229
  if: always()
223
230
  run: |
@@ -48,7 +48,7 @@ jobs:
48
48
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
49
49
  with:
50
50
  repository: OpenStatSpec/specification
51
- ref: f2fdf687d8cb32b944ca55a3e9e7215ffc603019
51
+ ref: 864e84479f554b8ee250ffed44c4dfb963750d4a
52
52
  path: openstatspec-specification
53
53
  - name: Checkout specification package source
54
54
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
@@ -159,9 +159,9 @@ jobs:
159
159
  - run: python -m pip install -e ".[dev]"
160
160
  - run: python -m pytest -m "not services"
161
161
  - run: python -m venv /tmp/openstatspec-release-smoke
162
- - run: /tmp/openstatspec-release-smoke/bin/python -m pip install ./openstatspec-pyspssio
163
162
  - run: /tmp/openstatspec-release-smoke/bin/python -m pip install dist/openstatspec/openstatspec-*.whl
164
- - run: /tmp/openstatspec-release-smoke/bin/openstatspec capabilities
163
+ - run: env -u PYTHONPATH /tmp/openstatspec-release-smoke/bin/openstatspec capabilities
164
+ working-directory: /tmp
165
165
  - name: Smoke-test specification wheel
166
166
  run: |
167
167
  python -m venv /tmp/openstatspec-specification-release-smoke
@@ -6,6 +6,38 @@ All notable changes to this reference implementation are documented here.
6
6
 
7
7
  _No unreleased changes._
8
8
 
9
+ ## 0.8.0 - 2026-09-07
10
+
11
+ ### Changed
12
+
13
+ - Pin released specification `v0.5.0` at exact commit
14
+ `864e84479f554b8ee250ffed44c4dfb963750d4a`, with normative status `released`.
15
+ Capabilities identify adapter version 0.8.0 and explicitly select SAV/ZSAV 1.0
16
+ with `database_io_policy=openstatspec-database-io-v1`.
17
+ - Reads, inspection, validation, and SAV/ZSAV export no longer write database
18
+ operation/fidelity audit records, including on failure. Export diagnostics
19
+ and loss consent remain operation-scoped; export results omit `operation_id`.
20
+ - Default Dolt writes use the packaged tested exact-version policy for 2.2.2
21
+ and 2.2.3 without user-supplied evidence files. Unknown/untested versions
22
+ remain blocked before mutation; explicit external overrides remain strict.
23
+ Safety budgets are not claimed as proven native server limits.
24
+ - Dolt reads no longer require write-version declarations or the write
25
+ variable-count ceiling. Missing SQLite files are rejected without creation.
26
+ - Exact Dolt 2.2.2/2.2.3 CI explicitly runs SELECT-only export success/failure
27
+ tests using a separate fixture-admin account; normal service permissions
28
+ and adapter permissions are unchanged. Wheel smoke installs resolve the
29
+ required engine from PyPI rather than a source checkout.
30
+
31
+ No optional Transformation Workflow 0.3 implementation is claimed.
32
+
33
+ ## 0.7.1 - 2026-08-12
34
+
35
+ ### Changed
36
+
37
+ - Pinned capability declarations, conformance fixtures, and release validation
38
+ to the published OpenStatSpec specification `v0.3.0` at exact commit
39
+ `cd8f198c68b849eb8ed018a894670a0904c2181d`.
40
+
9
41
  ## 0.7.0 - 2026-08-11
10
42
 
11
43
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: openstatspec
3
- Version: 0.7.0
3
+ Version: 0.8.0
4
4
  Summary: Reference adapter for the OpenStatSpec relational contract
5
5
  Author: OpenStatSpec
6
6
  License: Apache-2.0
@@ -23,6 +23,10 @@ The reference Python implementation of the OpenStatSpec specification.
23
23
 
24
24
  This package implements the specification; it does not define or extend it.
25
25
  The normative model lives in the `OpenStatSpec/specification` repository.
26
+ Python 0.8.0 pins released specification `v0.5.0` at
27
+ `864e84479f554b8ee250ffed44c4dfb963750d4a` and selects SAV/ZSAV 1.0 with
28
+ `database_io_policy=openstatspec-database-io-v1`. This does not claim
29
+ implementation of the optional Transformation Workflow 0.3 profile.
26
30
 
27
31
  ## Boundaries
28
32
 
@@ -115,17 +119,19 @@ SAV/ZSAV export for the semantics exposed by that engine. SQLite is the local
115
119
  reference path.
116
120
  PostgreSQL, MySQL, MariaDB, and Dolt are each covered by separate service-backed CI
117
121
  conformance checks. Dolt support is an independent core profile for the
118
- canonical stable range `>=2.2.2,<2.3.0`; earlier patches, other families,
119
- noncanonical versions, and unknown MySQL-wire products fail closed.
122
+ exact write-supported versions 2.2.2 and 2.2.3; all other versions (including
123
+ 2.3.0), noncanonical versions, and unknown MySQL-wire products fail closed for writes.
120
124
 
121
125
  The supported family claims are broader than the deliberately exact CI
122
126
  evidence points: PostgreSQL 17.x/18.x is exercised at 17.10/18.4, MySQL
123
127
  8.4.x/9.7.x at 8.4.11/9.7.2, and MariaDB 11.4.x/11.8.x/12.3.x at
124
128
  11.4.12/11.8.8/12.3.2. Each service job checks the normalized live server
125
129
  version against its exact matrix entry before that run can count as evidence.
126
- Dolt claims the conservative 2.2.x range `>=2.2.2,<2.3.0`; its full service
127
- suite is exercised independently at exact versions 2.2.2 and 2.2.3 using
128
- immutable container-image digests.
130
+ Dolt's default-write service checks run independently at exact versions 2.2.2
131
+ and 2.2.3 using immutable container-image digests. Release/CI owns this evidence;
132
+ normal callers need no declaration or evidence files. The optional explicit
133
+ `DoltConformanceSource` override remains strict and does not fall back to the
134
+ default policy if its declarations are missing, invalid, or mismatched.
129
135
 
130
136
  | Engine/profile | Runtime supported policy | Exact CI-tested versions |
131
137
  | --- | --- | --- |
@@ -133,7 +139,7 @@ immutable container-image digests.
133
139
  | PostgreSQL | 17.x and 18.x | 17.10 and 18.4 |
134
140
  | MySQL | 8.4.x and 9.7.x | 8.4.11 and 9.7.2 |
135
141
  | MariaDB | 11.4.x, 11.8.x, and 12.3.x | 11.4.12, 11.8.8, and 12.3.2 |
136
- | Dolt | 2.2.x with `>=2.2.2,<2.3.0` | 2.2.2 and 2.2.3 |
142
+ | Dolt writes | Exactly 2.2.2 and 2.2.3 | 2.2.2 and 2.2.3 |
137
143
 
138
144
  Microsoft SQL Server (MSSQL) remains roadmap-only and is not a supported
139
145
  runtime profile; see the specification's [MSSQL roadmap](https://github.com/OpenStatSpec/specification/blob/main/docs/mssql-dialect-roadmap.md).
@@ -143,7 +149,7 @@ Use these explicit SQLAlchemy URLs:
143
149
  - SQLite: `sqlite:///dataset.sqlite`
144
150
  - PostgreSQL: `postgresql+psycopg://user:password@host/database`
145
151
  - MySQL/MariaDB: `mysql+pymysql://user:password@host/database`
146
- - Dolt `>=2.2.2,<2.3.0`: `mysql+pymysql://user:password@host/database` (detected by server identity)
152
+ - Dolt 2.2.2 or 2.2.3: `mysql+pymysql://user:password@host/database` (detected by server identity)
147
153
 
148
154
  The Dolt core profile supports strict wide-table import, validation, and export;
149
155
  the separate Transformation Workflow is unsupported.
@@ -151,8 +157,16 @@ the separate Transformation Workflow is unsupported.
151
157
  Run `openstatspec capabilities` before an integration to inspect the
152
158
  machine-readable feature matrix. Export is deliberately strict: if known
153
159
  dictionary semantics cannot be reproduced, it stops until you pass the exact
154
- diagnostic code with `--allow-loss`. This avoids silent loss while making an
155
- intentional lossy export auditable.
160
+ diagnostic code with `--allow-loss`. Diagnostics are returned to the caller, not
161
+ persisted. Reads, validation, and SAV/ZSAV export never write to the database,
162
+ including on failure. Export returns no `operation_id` and needs only read
163
+ permissions; Dolt reads have no write-version or write-variable-count gate.
164
+ Read operations reject missing SQLite files without creating them. Imports and transformations
165
+ use the packaged exact-version policy by default. Active driver/identity checks,
166
+ limit preflight, and the clean expected branch/HEAD guard for in-place apply
167
+ remain mandatory. Dolt's reported limits are adapter safety budgets, narrowed
168
+ by the active packet limit, not proven native server ceilings; full boundary
169
+ conformance is not claimed.
156
170
 
157
171
  The matrix is also available to Python callers as
158
172
  `openstatspec.capability_matrix()`. It distinguishes supported semantics from
@@ -4,6 +4,10 @@ The reference Python implementation of the OpenStatSpec specification.
4
4
 
5
5
  This package implements the specification; it does not define or extend it.
6
6
  The normative model lives in the `OpenStatSpec/specification` repository.
7
+ Python 0.8.0 pins released specification `v0.5.0` at
8
+ `864e84479f554b8ee250ffed44c4dfb963750d4a` and selects SAV/ZSAV 1.0 with
9
+ `database_io_policy=openstatspec-database-io-v1`. This does not claim
10
+ implementation of the optional Transformation Workflow 0.3 profile.
7
11
 
8
12
  ## Boundaries
9
13
 
@@ -96,17 +100,19 @@ SAV/ZSAV export for the semantics exposed by that engine. SQLite is the local
96
100
  reference path.
97
101
  PostgreSQL, MySQL, MariaDB, and Dolt are each covered by separate service-backed CI
98
102
  conformance checks. Dolt support is an independent core profile for the
99
- canonical stable range `>=2.2.2,<2.3.0`; earlier patches, other families,
100
- noncanonical versions, and unknown MySQL-wire products fail closed.
103
+ exact write-supported versions 2.2.2 and 2.2.3; all other versions (including
104
+ 2.3.0), noncanonical versions, and unknown MySQL-wire products fail closed for writes.
101
105
 
102
106
  The supported family claims are broader than the deliberately exact CI
103
107
  evidence points: PostgreSQL 17.x/18.x is exercised at 17.10/18.4, MySQL
104
108
  8.4.x/9.7.x at 8.4.11/9.7.2, and MariaDB 11.4.x/11.8.x/12.3.x at
105
109
  11.4.12/11.8.8/12.3.2. Each service job checks the normalized live server
106
110
  version against its exact matrix entry before that run can count as evidence.
107
- Dolt claims the conservative 2.2.x range `>=2.2.2,<2.3.0`; its full service
108
- suite is exercised independently at exact versions 2.2.2 and 2.2.3 using
109
- immutable container-image digests.
111
+ Dolt's default-write service checks run independently at exact versions 2.2.2
112
+ and 2.2.3 using immutable container-image digests. Release/CI owns this evidence;
113
+ normal callers need no declaration or evidence files. The optional explicit
114
+ `DoltConformanceSource` override remains strict and does not fall back to the
115
+ default policy if its declarations are missing, invalid, or mismatched.
110
116
 
111
117
  | Engine/profile | Runtime supported policy | Exact CI-tested versions |
112
118
  | --- | --- | --- |
@@ -114,7 +120,7 @@ immutable container-image digests.
114
120
  | PostgreSQL | 17.x and 18.x | 17.10 and 18.4 |
115
121
  | MySQL | 8.4.x and 9.7.x | 8.4.11 and 9.7.2 |
116
122
  | MariaDB | 11.4.x, 11.8.x, and 12.3.x | 11.4.12, 11.8.8, and 12.3.2 |
117
- | Dolt | 2.2.x with `>=2.2.2,<2.3.0` | 2.2.2 and 2.2.3 |
123
+ | Dolt writes | Exactly 2.2.2 and 2.2.3 | 2.2.2 and 2.2.3 |
118
124
 
119
125
  Microsoft SQL Server (MSSQL) remains roadmap-only and is not a supported
120
126
  runtime profile; see the specification's [MSSQL roadmap](https://github.com/OpenStatSpec/specification/blob/main/docs/mssql-dialect-roadmap.md).
@@ -124,7 +130,7 @@ Use these explicit SQLAlchemy URLs:
124
130
  - SQLite: `sqlite:///dataset.sqlite`
125
131
  - PostgreSQL: `postgresql+psycopg://user:password@host/database`
126
132
  - MySQL/MariaDB: `mysql+pymysql://user:password@host/database`
127
- - Dolt `>=2.2.2,<2.3.0`: `mysql+pymysql://user:password@host/database` (detected by server identity)
133
+ - Dolt 2.2.2 or 2.2.3: `mysql+pymysql://user:password@host/database` (detected by server identity)
128
134
 
129
135
  The Dolt core profile supports strict wide-table import, validation, and export;
130
136
  the separate Transformation Workflow is unsupported.
@@ -132,8 +138,16 @@ the separate Transformation Workflow is unsupported.
132
138
  Run `openstatspec capabilities` before an integration to inspect the
133
139
  machine-readable feature matrix. Export is deliberately strict: if known
134
140
  dictionary semantics cannot be reproduced, it stops until you pass the exact
135
- diagnostic code with `--allow-loss`. This avoids silent loss while making an
136
- intentional lossy export auditable.
141
+ diagnostic code with `--allow-loss`. Diagnostics are returned to the caller, not
142
+ persisted. Reads, validation, and SAV/ZSAV export never write to the database,
143
+ including on failure. Export returns no `operation_id` and needs only read
144
+ permissions; Dolt reads have no write-version or write-variable-count gate.
145
+ Read operations reject missing SQLite files without creating them. Imports and transformations
146
+ use the packaged exact-version policy by default. Active driver/identity checks,
147
+ limit preflight, and the clean expected branch/HEAD guard for in-place apply
148
+ remain mandatory. Dolt's reported limits are adapter safety budgets, narrowed
149
+ by the active packet limit, not proven native server ceilings; full boundary
150
+ conformance is not claimed.
137
151
 
138
152
  The matrix is also available to Python callers as
139
153
  `openstatspec.capability_matrix()`. It distinguishes supported semantics from
@@ -1,8 +1,15 @@
1
- # 0.7.0 release readiness
1
+ # 0.8.0 release readiness
2
2
 
3
3
  This page records the expected release contract, not a publication event.
4
4
  Creating a version tag remains a separate maintainer action.
5
5
 
6
+ The release selects SAV/ZSAV 1.0 with the optional Database I/O Execution
7
+ Policy `openstatspec-database-io-v1`. Reads and exports, including failures,
8
+ write no database audit records; export results omit `operation_id` and return
9
+ diagnostics to the caller. Reads must not create missing SQLite files or apply
10
+ Dolt write-variable-count ceilings. This release does not claim implementation
11
+ of the optional Transformation Workflow 0.3 profile.
12
+
6
13
  ## Supported workflow
7
14
 
8
15
  For a supported unencrypted SAV or ZSAV source, the adapter imports one source
@@ -20,15 +27,17 @@ database contract.
20
27
  | PostgreSQL | `postgresql+psycopg://…` | 17.x and 18.x | 17.10 and 18.4 |
21
28
  | MySQL | `mysql+pymysql://…` | 8.4.x and 9.7.x | 8.4.11 and 9.7.2 |
22
29
  | MariaDB | `mysql+pymysql://…` | 11.4.x, 11.8.x, and 12.3.x | 11.4.12, 11.8.8, and 12.3.2 |
23
- | Dolt | `mysql+pymysql://…` | 2.2.x with `>=2.2.2,<2.3.0` | 2.2.2 and 2.2.3 |
30
+ | Dolt writes | `mysql+pymysql://…` | Exactly 2.2.2 and 2.2.3 | 2.2.2 and 2.2.3 |
24
31
 
25
32
  Separate service matrices test the shared MySQL/MariaDB profile contract while
26
33
  retaining distinct active-server identities and version claims. Dolt is an
27
- independent core profile that accepts only canonical stable versions in
28
- `>=2.2.2,<2.3.0`; the optional Transformation Workflow remains SQLite-only. This does not
29
- claim coverage for every server configuration. The machine-readable capability
30
- declaration reports both the theoretical profile boundaries and effective
31
- limits observed from the active connection.
34
+ independent core profile with a packaged exact-version write policy; normal
35
+ callers supply no conformance files. An explicit external declaration source
36
+ remains a strict override. Read-only validation/export has no write-version gate.
37
+ The optional Transformation Workflow remains SQLite-only. This does not claim
38
+ coverage for every server configuration or proven Dolt native limit ceilings.
39
+ Dolt capabilities report adapter safety budgets and active packet constraints;
40
+ full boundary conformance remains pending.
32
41
  Every server service job compares the normalized live product version with its
33
42
  exact matrix entry, so a moved or mismatched image cannot substantiate the CI
34
43
  declaration. SQLite's optional Transformation Workflow retains its narrower
@@ -102,6 +111,51 @@ implemented openstatspec.frontends.spss package. Stata and SAS remain empty
102
111
  source-tree placeholders and must expose no compiler, apply API, CLI choice,
103
112
  capability claim, or implied support.
104
113
 
114
+ ## Prior default Dolt write verification (before the 0.8.0 pin)
115
+
116
+ Local release verification used the exact 2.2.2 and 2.2.3 image digests in
117
+ `.github/workflows/ci.yml`, isolated ports 13482/13483, and disposable `/tmp`
118
+ database directories. With `PYTHONPATH=src:../pyspssio`,
119
+ `OPENSTATSPEC_SPECIFICATION_DIR=/tmp/oss-php-spec-cd8f198`, and each matching
120
+ `OPENSTATSPEC_DOLT_URL` / `OPENSTATSPEC_EXPECTED_DOLT_VERSION`:
121
+
122
+ - `../python/.venv/bin/python -m pytest`: **366 passed, 49 skipped per pin**.
123
+ - CI selection `-m 'services and not candidate_evidence'`: **7 passed,
124
+ 41 skipped per pin**; other database services were not configured locally.
125
+ - Dolt 2.3.0 on port 13387: read-only export and unknown-version write rejection
126
+ checks passed (**19 passed**) using disposable fixture databases/users.
127
+ - `python -m compileall -q src tests` and `git diff --check` passed.
128
+
129
+ Live failures exposed and now cover two previously dormant write blockers:
130
+ owned table additions being misclassified as unrelated diffs, and Dolt retaining
131
+ `@@autocommit=1` despite the driver's setting. Writes now explicitly begin their
132
+ transaction. The candidate storage/identifier/column smoke probe also passed on
133
+ both pins; it does **not** establish full value/row/statement limit conformance.
134
+
135
+ ## 0.8.0 local verification
136
+
137
+ Using `../python/.venv/bin/python`, `PYTHONPATH=src:../pyspssio`, and
138
+ `OPENSTATSPEC_SPECIFICATION_DIR=/tmp/oss-python-spec-v050-5dSTna` (an archive
139
+ of exact `864e84479f554b8ee250ffed44c4dfb963750d4a`):
140
+
141
+ - `python -m pytest -ra`: **381 passed, 49 skipped**, with
142
+ `OPENSTATSPEC_TEST_DOLT_ADMIN_URL=mysql+pymysql://root@127.0.0.1:13387/`
143
+ exercising live Dolt 2.3.0 through disposable SELECT-only users.
144
+ - Both immutable CI images, exact Dolt 2.2.2/2.2.3, bootstrapped with the
145
+ unchanged service user and separate global fixture admin on ports 13582/13583:
146
+ `python -m pytest -m 'services and not candidate_evidence'`: **7 passed,
147
+ 41 skipped, 382 deselected per pin**; explicit
148
+ `python -m pytest tests/test_read_only_export.py`: **33 passed per pin**.
149
+ - `python -m compileall -q src tests`, `git diff --check`, wheel/sdist build,
150
+ and `python -m twine check /tmp/oss-python-v080-dist/*` passed.
151
+ - A clean wheel install resolved the required engine from PyPI. Isolated
152
+ imports came only from the smoke environment's `site-packages`; installed
153
+ capabilities reported adapter 0.8.0, the selected policy, released v0.5.0
154
+ provenance, and exactly 2.2.2/2.2.3 for default Dolt writes.
155
+
156
+ Other database services were not configured locally. This is local evidence,
157
+ not a claim that the updated remote CI or release publication has completed.
158
+
105
159
  ## Maintainer checks before tagging
106
160
 
107
161
  1. Publish the pinned `openstatspec-pyspssio==0.5.1.post2` engine distribution
@@ -110,16 +164,28 @@ capability claim, or implied support.
110
164
  2. Run `python -m pytest -m "not services"`.
111
165
  3. Confirm the GitHub Actions matrix is green for exact PostgreSQL 17.10/18.4,
112
166
  MySQL 8.4.11/9.7.2, MariaDB 11.4.12/11.8.8/12.3.2, and exact Dolt
113
- 2.2.2/2.2.3 service evidence from the immutable image pins in CI.
167
+ 2.2.2/2.2.3 service evidence from the immutable image pins in CI. The Dolt
168
+ jobs must perform default import/validate/SAV+ZSAV export, in-place recode
169
+ and labels with unchanged dataset/table counts and HEAD, injected data,
170
+ catalog, and audit rollback checks, and failed-import cleanup. Release/CI
171
+ owns this evidence, not per-user runtime declaration files. Candidate limit
172
+ probes remain non-claiming and separate from these write gates.
173
+ Each Dolt job must also run `python -m pytest tests/test_read_only_export.py`
174
+ explicitly, outside the `services` marker filter. Bootstrap a separate
175
+ `openstatspec_test_admin` on the isolated CI server with global database/user
176
+ creation and grant privileges, and set `OPENSTATSPEC_TEST_DOLT_ADMIN_URL`.
177
+ The fixture creates its own database and SELECT-only reader and removes
178
+ both afterward; the normal service user remains unchanged.
114
179
  4. Build with `python -m build` and install the generated wheel in a clean
115
- environment.
180
+ environment, resolving `openstatspec-pyspssio==0.5.1.post2` from PyPI.
181
+ Run the installed CLI outside the source checkout with `PYTHONPATH` unset;
182
+ verify adapter version `0.8.0` and the selected database I/O policy.
116
183
  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.
184
+ 6. Confirm CI, release fixtures, and capabilities use the published OpenStatSpec
185
+ specification `v0.5.0` at exact commit
186
+ `864e84479f554b8ee250ffed44c4dfb963750d4a`, publish
187
+ `specification_status=released`, and set `specification_release` to `v0.5.0`.
188
+ Use an exact checkout via `OPENSTATSPEC_SPECIFICATION_DIR` for local tests.
123
189
  7. Review this document, the README, and CHANGELOG for accurate scope.
124
190
 
125
191
  The tag-triggered release workflow repeats the non-service test suite, builds
@@ -49,7 +49,7 @@ equivalence of supported values, order, and dictionary metadata.
49
49
 
50
50
  The `openstatspec capabilities` command and the
51
51
  `openstatspec.capability_matrix()` function are the machine-readable declaration
52
- of this boundary. It records the pinned source commit and installed engine version, and the adapter stores the same identity in every import and export operation record. The matrix deliberately distinguishes a supported feature from a feature that the underlying engine cannot observe or write faithfully.
52
+ of this boundary. It records the pinned source commit and installed engine version, and the adapter stores the same identity in import operation records. Export is database-read-only: no operation, fidelity, recovery, or Dolt-history records are written, even on failure. Loss diagnostics are returned to the caller. Dolt export identifies the server and validates the catalog and data without requiring write-conformance declarations; write entry points retain that requirement. The matrix deliberately distinguishes a supported feature from a feature that the underlying engine cannot observe or write faithfully.
53
53
 
54
54
  | SPSS semantic | Pinned pyspssio status | Behaviour |
55
55
  | --- | --- | --- |
@@ -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.
@@ -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.
@@ -0,0 +1,24 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ specification:
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ # v7.0.1: https://github.com/actions/checkout/commit/3d3c42e5aac5ba805825da76410c181273ba90b1
15
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
16
+ with:
17
+ persist-credentials: false
18
+ # v7.0.0: https://github.com/actions/setup-python/commit/5fda3b95a4ea91299a34e894583c3862153e4b97
19
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
20
+ with:
21
+ python-version: "3.13"
22
+ - run: python -m pip install --disable-pip-version-check -e ".[dev]"
23
+ - run: python -m pytest
24
+ - run: python tools/validate_repository.py