openstatspec 0.7.1__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 (209) hide show
  1. {openstatspec-0.7.1 → openstatspec-0.8.0}/.github/workflows/ci.yml +11 -4
  2. {openstatspec-0.7.1 → openstatspec-0.8.0}/.github/workflows/release.yml +3 -3
  3. {openstatspec-0.7.1 → openstatspec-0.8.0}/CHANGELOG.md +24 -0
  4. {openstatspec-0.7.1 → openstatspec-0.8.0}/PKG-INFO +24 -10
  5. {openstatspec-0.7.1 → openstatspec-0.8.0}/README.md +23 -9
  6. {openstatspec-0.7.1 → openstatspec-0.8.0}/docs/release-readiness.md +80 -12
  7. {openstatspec-0.7.1 → openstatspec-0.8.0}/docs/sav-profile.md +1 -1
  8. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/.github/workflows/ci.yml +2 -0
  9. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/CHANGELOG.md +44 -6
  10. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/README.md +33 -5
  11. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/RELEASING.md +21 -0
  12. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/ROADMAP.md +42 -14
  13. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/VERSIONING.md +9 -0
  14. openstatspec-0.8.0/openstatspec-specification/conformance/spss-syntax-frontend-0.3.json +714 -0
  15. openstatspec-0.8.0/openstatspec-specification/docs/database-io-policy-v1.md +146 -0
  16. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/implementation-profiles/python-pyspssio-0.5.1.md +5 -0
  17. openstatspec-0.8.0/openstatspec-specification/docs/spss-frontend-roadmap.md +158 -0
  18. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-sav-zsav-profile-1.0.md +5 -0
  19. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-syntax-frontend-profile-0.2.md +2 -1
  20. openstatspec-0.8.0/openstatspec-specification/docs/spss-syntax-frontend-profile-0.3.md +164 -0
  21. openstatspec-0.8.0/openstatspec-specification/docs/superpowers/plans/2026-08-12-roadmap-v030-bookkeeping.md +64 -0
  22. openstatspec-0.8.0/openstatspec-specification/docs/superpowers/plans/2026-08-21-spss-frontend-03.md +1361 -0
  23. openstatspec-0.8.0/openstatspec-specification/docs/superpowers/specs/2026-08-21-spss-frontend-expansion-design.md +193 -0
  24. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-profile-0.2.md +2 -1
  25. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-sql-binding-0.2.md +2 -1
  26. openstatspec-0.8.0/openstatspec-specification/examples/spss-syntax-transformation-0.3.md +41 -0
  27. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/pyproject.toml +2 -1
  28. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/sql/dialect-profiles.md +6 -0
  29. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/sql/dolt-adapter-declarations/README.md +7 -0
  30. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/sql/profile-capabilities.md +8 -0
  31. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/sql/server-version-policy.md +7 -0
  32. openstatspec-0.8.0/openstatspec-specification/src/openstatspec_specification/artifacts.py +923 -0
  33. openstatspec-0.8.0/openstatspec-specification/tests/test_contract_artifacts.py +272 -0
  34. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/tools/validate_repository.py +34 -1
  35. openstatspec-0.8.0/openstatspec-specification/transformation/spss-syntax-frontend-0.3.schema.json +57 -0
  36. {openstatspec-0.7.1 → openstatspec-0.8.0}/pyproject.toml +1 -1
  37. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/api.py +8 -2
  38. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/spss/sav.py +4 -288
  39. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/capabilities.py +71 -27
  40. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/catalog_api.py +3 -0
  41. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/database_urls.py +17 -0
  42. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/dolt_conformance.py +5 -2
  43. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/inplace_transform.py +3 -0
  44. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/wide.py +20 -300
  45. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/workflow.py +9 -3
  46. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_catalog_lifecycle.py +0 -56
  47. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_catalog_persistence_review.py +0 -90
  48. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_cli.py +6 -3
  49. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_dolt_conformance.py +43 -49
  50. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_loss_reports.py +2 -15
  51. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_normative_catalog.py +1 -17
  52. openstatspec-0.8.0/tests/test_read_only_export.py +262 -0
  53. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_review_transaction_boundary.py +13 -82
  54. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_sql_profiles.py +36 -35
  55. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_sql_services.py +143 -13
  56. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_strict_catalog_review.py +4 -3
  57. {openstatspec-0.7.1 → openstatspec-0.8.0}/.github/verify_release_ref.py +0 -0
  58. {openstatspec-0.7.1 → openstatspec-0.8.0}/.gitignore +0 -0
  59. {openstatspec-0.7.1 → openstatspec-0.8.0}/THIRD_PARTY_NOTICES.md +0 -0
  60. {openstatspec-0.7.1 → openstatspec-0.8.0}/docs/architecture.md +0 -0
  61. {openstatspec-0.7.1 → openstatspec-0.8.0}/docs/in-place-transformation.md +0 -0
  62. {openstatspec-0.7.1 → openstatspec-0.8.0}/docs/pyspssio-spike.md +0 -0
  63. {openstatspec-0.7.1 → openstatspec-0.8.0}/docs/sql-transformation-workflow.md +0 -0
  64. {openstatspec-0.7.1 → openstatspec-0.8.0}/docs/superpowers/plans/2026-08-12-python-v071-stable-pin.md +0 -0
  65. {openstatspec-0.7.1 → openstatspec-0.8.0}/docs/superpowers/specs/2026-08-12-python-stable-specification-pin-design.md +0 -0
  66. {openstatspec-0.7.1 → openstatspec-0.8.0}/docs/transformations.md +0 -0
  67. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/.github/workflows/release.yml +0 -0
  68. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/.gitignore +0 -0
  69. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/CONTRIBUTING.md +0 -0
  70. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/LICENSE.md +0 -0
  71. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/README.md +0 -0
  72. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/core-numeric-string.sav +0 -0
  73. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/dictionary-and-display.sav +0 -0
  74. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/generate-fixtures.sps +0 -0
  75. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
  76. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/missing-rules.sav +0 -0
  77. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/sets.sav +0 -0
  78. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/weight-and-string-mr.sav +0 -0
  79. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/fixtures/zsav-compressed.zsav +0 -0
  80. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/in-place-transformation-0.1.json +0 -0
  81. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/in-place-transformation-0.2.json +0 -0
  82. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/spss-sav-zsav-1.0.json +0 -0
  83. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/spss-syntax-frontend-0.1.json +0 -0
  84. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/spss-syntax-frontend-0.2.json +0 -0
  85. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/sql-transformation-workflow-0.1.json +0 -0
  86. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/transformation-plan-0.1.json +0 -0
  87. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/conformance/transformation-plan-0.2.json +0 -0
  88. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/architecture.md +0 -0
  89. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/mssql-dialect-roadmap.md +0 -0
  90. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-profile.md +0 -0
  91. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/spss-syntax-frontend-profile-0.1.md +0 -0
  92. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/sql-transformation-workflow-profile-0.1.md +0 -0
  93. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-profile-0.1.md +0 -0
  94. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/docs/transformation-plan-sql-binding-0.1.md +0 -0
  95. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/examples/basic-spss-mapping.md +0 -0
  96. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/examples/spss-syntax-transformation-0.2.md +0 -0
  97. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/examples/spss-syntax-transformation.md +0 -0
  98. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/examples/sql-transformation-workflow.md +0 -0
  99. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/sql/dialect-profile-baseline.json +0 -0
  100. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/sql/dolt-adapter-declaration-schema.json +0 -0
  101. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/sql/schema-outline.sql +0 -0
  102. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/sql/transformation-plan-profile-schema.sql +0 -0
  103. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/sql/transformation-workflow-profile-schema.sql +0 -0
  104. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/src/openstatspec_specification/__init__.py +0 -0
  105. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/src/openstatspec_specification/dolt.py +0 -0
  106. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/tests/test_dolt_declarations.py +0 -0
  107. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/transformation/plan-0.1.schema.json +0 -0
  108. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/transformation/plan-0.2.schema.json +0 -0
  109. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/transformation/spss-syntax-frontend-0.1.schema.json +0 -0
  110. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification/transformation/spss-syntax-frontend-0.2.schema.json +0 -0
  111. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/.github/workflows/ci.yml +0 -0
  112. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/.github/workflows/publish.yml +0 -0
  113. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/.gitignore +0 -0
  114. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/CHANGELOG.md +0 -0
  115. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/CONTRIBUTING.md +0 -0
  116. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/README.md +0 -0
  117. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/RELEASING.md +0 -0
  118. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/ROADMAP.md +0 -0
  119. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/VERSIONING.md +0 -0
  120. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/LICENSE.md +0 -0
  121. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/README.md +0 -0
  122. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/core-numeric-string.sav +0 -0
  123. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/dictionary-and-display.sav +0 -0
  124. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/generate-fixtures.sps +0 -0
  125. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/long-utf8-and-attributes.sav +0 -0
  126. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/missing-rules.sav +0 -0
  127. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/sets.sav +0 -0
  128. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/weight-and-string-mr.sav +0 -0
  129. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/fixtures/zsav-compressed.zsav +0 -0
  130. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/in-place-transformation-0.1.json +0 -0
  131. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/in-place-transformation-0.2.json +0 -0
  132. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/spss-sav-zsav-1.0.json +0 -0
  133. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/spss-syntax-frontend-0.1.json +0 -0
  134. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/spss-syntax-frontend-0.2.json +0 -0
  135. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/sql-transformation-workflow-0.1.json +0 -0
  136. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/transformation-plan-0.1.json +0 -0
  137. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/conformance/transformation-plan-0.2.json +0 -0
  138. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/architecture.md +0 -0
  139. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/implementation-profiles/python-pyspssio-0.5.1.md +0 -0
  140. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/mssql-dialect-roadmap.md +0 -0
  141. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-profile.md +0 -0
  142. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-sav-zsav-profile-1.0.md +0 -0
  143. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.1.md +0 -0
  144. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/spss-syntax-frontend-profile-0.2.md +0 -0
  145. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/sql-transformation-workflow-profile-0.1.md +0 -0
  146. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-profile-0.1.md +0 -0
  147. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-profile-0.2.md +0 -0
  148. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.1.md +0 -0
  149. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/docs/transformation-plan-sql-binding-0.2.md +0 -0
  150. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/examples/basic-spss-mapping.md +0 -0
  151. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/examples/spss-syntax-transformation-0.2.md +0 -0
  152. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/examples/spss-syntax-transformation.md +0 -0
  153. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/examples/sql-transformation-workflow.md +0 -0
  154. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/pyproject.toml +0 -0
  155. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dialect-profile-baseline.json +0 -0
  156. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dialect-profiles.md +0 -0
  157. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dolt-adapter-declaration-schema.json +0 -0
  158. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/sql/dolt-adapter-declarations/README.md +0 -0
  159. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/sql/profile-capabilities.md +0 -0
  160. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/sql/schema-outline.sql +0 -0
  161. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/sql/server-version-policy.md +0 -0
  162. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/sql/transformation-plan-profile-schema.sql +0 -0
  163. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/sql/transformation-workflow-profile-schema.sql +0 -0
  164. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/src/openstatspec_specification/__init__.py +0 -0
  165. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/src/openstatspec_specification/dolt.py +0 -0
  166. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/tests/test_dolt_declarations.py +0 -0
  167. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/tools/validate_repository.py +0 -0
  168. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/plan-0.1.schema.json +0 -0
  169. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/plan-0.2.schema.json +0 -0
  170. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/spss-syntax-frontend-0.1.schema.json +0 -0
  171. {openstatspec-0.7.1 → openstatspec-0.8.0}/openstatspec-specification-package/transformation/spss-syntax-frontend-0.2.schema.json +0 -0
  172. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/__init__.py +0 -0
  173. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/cli.py +0 -0
  174. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/core/__init__.py +0 -0
  175. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/core/results.py +0 -0
  176. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/frontends/__init__.py +0 -0
  177. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/frontends/sas/.gitkeep +0 -0
  178. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/__init__.py +0 -0
  179. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/binding.py +0 -0
  180. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/compiler.py +0 -0
  181. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/execution.py +0 -0
  182. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/frontends/spss/syntax.py +0 -0
  183. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/frontends/stata/.gitkeep +0 -0
  184. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/spss/__init__.py +0 -0
  185. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/spss/dictionary.py +0 -0
  186. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/spss/raw_dictionary.py +0 -0
  187. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/__init__.py +0 -0
  188. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/catalog_verification.py +0 -0
  189. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/normative.py +0 -0
  190. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/sql/profiles.py +0 -0
  191. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/transform/__init__.py +0 -0
  192. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/transform/errors.py +0 -0
  193. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/transform/plan.py +0 -0
  194. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/transform/schema.py +0 -0
  195. {openstatspec-0.7.1 → openstatspec-0.8.0}/src/openstatspec/transform/validation.py +0 -0
  196. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/conformance.py +0 -0
  197. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_atomic_import.py +0 -0
  198. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_attribute_catalog.py +0 -0
  199. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_conditional_inplace_transform.py +0 -0
  200. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_document_round_trip.py +0 -0
  201. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_inplace_transform.py +0 -0
  202. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_official_conformance.py +0 -0
  203. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_pyspssio_catalog_authority.py +0 -0
  204. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_release_ref.py +0 -0
  205. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_sav_sqlite.py +0 -0
  206. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_spss_catalog_preflight.py +0 -0
  207. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_sql_workflow.py +0 -0
  208. {openstatspec-0.7.1 → openstatspec-0.8.0}/tests/test_transform_frontend.py +0 -0
  209. {openstatspec-0.7.1 → 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: cd8f198c68b849eb8ed018a894670a0904c2181d
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: cd8f198c68b849eb8ed018a894670a0904c2181d
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,30 @@ 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
+
9
33
  ## 0.7.1 - 2026-08-12
10
34
 
11
35
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: openstatspec
3
- Version: 0.7.1
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.1 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,14 +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
184
  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`.
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.
121
189
  7. Review this document, the README, and CHANGELOG for accurate scope.
122
190
 
123
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
  | --- | --- | --- |
@@ -19,4 +19,6 @@ jobs:
19
19
  - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97
20
20
  with:
21
21
  python-version: "3.13"
22
+ - run: python -m pip install --disable-pip-version-check -e ".[dev]"
23
+ - run: python -m pytest
22
24
  - run: python tools/validate_repository.py
@@ -2,15 +2,53 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
- Future changes will be listed here.
5
+ ### v0.5.0 (prepared; not yet published)
6
+
7
+ - Add normative optional `openstatspec-database-io-v1`, explicitly selected by
8
+ capability field `database_io_policy`. Reads, validation and export perform
9
+ no database writes, including audit, temporary DDL and failure paths; export
10
+ loss diagnostics are returned while safe file publication remains required.
11
+ - Permit default Dolt writes through packaged exact tested 2.2.2/2.2.3 policy
12
+ backed by adapter release CI, with no runtime user declaration/evidence files.
13
+ External declarations and their unchanged validator remain an optional
14
+ advanced override. Identity, limits, atomicity, security and branch/HEAD
15
+ checks remain mandatory; unknown or untested versions fail closed.
16
+ - Preserve unselected adapters' old requirements, SAV 1.0 source semantics,
17
+ catalog/data/metadata schema and fixtures, and all canonical plan, frontend
18
+ and SQL binding contracts. This pre-1.0 minor release adds an independently
19
+ selected policy; it does not silently revise an existing profile.
20
+ - Keep the separately released `openstatspec-specification` companion package
21
+ at `0.1.0`. No adapter conformance or package release is asserted here.
22
+
23
+ ## v0.4.1 - 2026-08-21
24
+
25
+ OpenStatSpec `v0.4.1` is a documentation and release-bookkeeping patch for
26
+ the stable `v0.4.0` specification. It changes no normative contract or
27
+ conformance artifact.
28
+
29
+ - Aligned the SPSS frontend roadmap with the published Frontend 0.3 profile.
30
+ - Corrected release metadata fixtures and validation coverage for the public
31
+ README and current release status.
32
+
33
+ ## v0.4.0 - 2026-08-21
34
+
35
+ OpenStatSpec `v0.4.0` publishes SPSS Syntax Frontend 0.3 as a stable optional
36
+ profile. The release tag is the immutable specification identity for this
37
+ release.
38
+
39
+ - Added comments, existing-variable `TO`, grouped supported forms, predicate
40
+ aliases and bounded `NOT`, open recode ranges, and additive value labels.
41
+ - Frontend 0.3 emits only immutable Plan 0.1/0.2 objects and adds no SQL
42
+ binding operation.
43
+ - Repository validation now covers all Plan/Frontend/Binding schemas,
44
+ manifests, references, inherited cases, and canonical hashes.
45
+ - Adapter claims remain downstream and separately gated; this release does not
46
+ assert PHP or Python implementation conformance.
6
47
 
7
48
  ## v0.3.0 - 2026-08-12
8
49
 
9
- Release preparation for the planned stable `v0.3.0` tag. Until a protected or
10
- signed `v0.3.0` tag targets this exact release commit, implementations MUST
11
- identify it with `specification_status: release_candidate`,
12
- `specification_release: null`, and the exact immutable specification commit.
13
- The entries below become the stable release only when that tag exists.
50
+ OpenStatSpec `v0.3.0` is the stable public specification release at immutable
51
+ specification commit `cd8f198c68b849eb8ed018a894670a0904c2181d`.
14
52
 
15
53
  - Added backward-compatible Transformation Plan and SPSS Syntax Frontend 0.2
16
54
  contracts for sequential numeric `COMPUTE` and conditional `IF`, bounded
@@ -13,6 +13,19 @@ MySQL 8.4.x/9.7.x, MariaDB 11.4.x/11.8.x/12.3.x and PostgreSQL 17.x/18.x
13
13
  series while requiring exact patch-version CI evidence. Microsoft SQL Server
14
14
  remains an explicitly unsupported [future dialect](docs/mssql-dialect-roadmap.md).
15
15
 
16
+ ## Optional database I/O execution policy
17
+
18
+ Prepared for specification `v0.5.0`, the normative optional
19
+ [Database I/O Execution Policy v1](docs/database-io-policy-v1.md) is explicitly
20
+ selected with `database_io_policy: "openstatspec-database-io-v1"`.
21
+ It requires database-read-only reads, validation and exports (including errors
22
+ and loss diagnostics), and permits default Dolt writes on packaged exact tested
23
+ 2.2.2/2.2.3 policy backed by adapter release CI, without user evidence files.
24
+ External declarations remain an optional advanced override. Unselected adapters
25
+ retain existing requirements; SAV 1.0 semantics, schemas, fixtures and canonical
26
+ Plan/Frontend/Binding contracts are unchanged. Publication and downstream
27
+ adapter support remain separately gated.
28
+
16
29
  ## Core contract
17
30
 
18
31
  - One source dataset maps to exactly one dedicated SQL data table.
@@ -37,10 +50,11 @@ permits a transformation to mutate a core import.
37
50
  That separate derived-data profile is not used by the SPSS-like in-place
38
51
  frontend below.
39
52
 
40
- The release-candidate [Transformation Plan Profile 0.2](docs/transformation-plan-profile-0.2.md)
41
- adds sequential bounded numeric assignment and conditional assignment to the
53
+ The released [Transformation Plan Profile 0.2](docs/transformation-plan-profile-0.2.md)
54
+ was released in OpenStatSpec `v0.3.0` and adds sequential bounded numeric assignment and conditional assignment to the
42
55
  unchanged 0.1 operations. The
43
- [SPSS Syntax Frontend Profile 0.2](docs/spss-syntax-frontend-profile-0.2.md)
56
+ [released SPSS Syntax Frontend Profile 0.2](docs/spss-syntax-frontend-profile-0.2.md)
57
+ was released in OpenStatSpec `v0.3.0` and
44
58
  lowers `COMPUTE`, `IF`, `FORMATS`, `VARIABLE LEVEL`, and `EXECUTE`
45
59
  alongside the 0.1 `RECODE`, `VARIABLE LABELS`, and `VALUE LABELS` subset.
46
60
  Programs using only the 0.1 subset retain exact 0.1 plan identity and hash. The
@@ -50,6 +64,10 @@ creates no derived dataset, data copy, or OpenStatSpec undo layer; Dolt-specific
50
64
  history and commits remain Dolt's. MySQL, MariaDB, and Dolt require a new target
51
65
  to be provisioned separately before an in-place transformation apply.
52
66
 
67
+ The released [SPSS Syntax Frontend Profile 0.3](docs/spss-syntax-frontend-profile-0.3.md)
68
+ was published in OpenStatSpec `v0.4.0`. It adds syntax-only expansion over the
69
+ released Plan 0.1/0.2 contracts and does not change SQL binding behavior.
70
+
53
71
  ## Repository layout
54
72
 
55
73
  - `sql/server-version-policy.md` — server release-series claims and exact reference-CI targets.
@@ -72,8 +90,18 @@ to be provisioned separately before an in-place transformation apply.
72
90
  - `transformation/plan-0.1.schema.json` — canonical transformation-plan schema.
73
91
  - `sql/transformation-plan-profile-schema.sql` — compact in-place apply audit;
74
92
  it is not a dataset-version catalog.
75
- - `conformance/transformation-plan-0.2.json` and
76
- `conformance/spss-syntax-frontend-0.2.json` — additive plan and frontend
93
+ - `docs/spss-syntax-frontend-profile-0.1.md`,
94
+ `docs/spss-syntax-frontend-profile-0.2.md`, and
95
+ `docs/spss-syntax-frontend-profile-0.3.md` — bounded syntax frontend
96
+ profiles and their contract boundaries.
97
+ - `transformation/spss-syntax-frontend-0.1.schema.json`,
98
+ `transformation/spss-syntax-frontend-0.2.schema.json`, and
99
+ `transformation/spss-syntax-frontend-0.3.schema.json` — frontend request
100
+ schemas.
101
+ - `conformance/transformation-plan-0.2.json`,
102
+ `conformance/spss-syntax-frontend-0.1.json`,
103
+ `conformance/spss-syntax-frontend-0.2.json`, and
104
+ `conformance/spss-syntax-frontend-0.3.json` — additive plan and frontend
77
105
  conformance cases with independent golden hashes; `conformance/in-place-transformation-0.2.json`
78
106
  fixes the same-dataset/same-table execution invariants and the additional
79
107
  controlled Dolt context. The 0.1 schemas and fixtures remain unchanged.
@@ -12,6 +12,27 @@ Package tags use the `package-vX.Y.Z` convention; specification tags use
12
12
  `vX.Y.Z`. A specification tag MUST NOT publish the package, and a package tag
13
13
  MUST match the version declared in `pyproject.toml`.
14
14
 
15
+ ## Prepared v0.5.0 scope
16
+
17
+ This release prepares the normative optional
18
+ [Database I/O Execution Policy v1](docs/database-io-policy-v1.md). It is not
19
+ published until the gates below complete. Release notes MUST identify explicit
20
+ `database_io_policy` selection, database-read-only export with returned loss
21
+ diagnostics, and packaged exact tested Dolt 2.2.2/2.2.3 write policy with optional
22
+ external evidence. Existing unselected-profile requirements, SAV 1.0 semantics
23
+ and fixtures, schemas, and canonical Plan/Frontend/Binding artifacts are unchanged.
24
+ This is a pre-1.0 minor optional addition under [VERSIONING](VERSIONING.md).
25
+
26
+ Run `python -m pytest` and `python tools/validate_repository.py` at the selected
27
+ commit. Adapter package release CI supplies real exact-version write and
28
+ read-only/failure-path evidence under the new policy; neither fabricated
29
+ repository declarations nor user-supplied evidence files are release substitutes.
30
+ Python `v0.8.0` and PHP `v0.7.0` are downstream adapter release targets, not
31
+ conformance claims made by this specification. Their pins and publication are
32
+ managed separately. The companion `openstatspec-specification` distribution
33
+ remains `0.1.0`: no package API, schema or validator contract change requires a
34
+ package release for this documentation policy addition.
35
+
15
36
  ## Before preparing a release
16
37
 
17
38
  - Choose an exact reviewed commit on the appropriate branch and record its