okf-parser 0.45.2__tar.gz → 0.45.4__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 (347) hide show
  1. {okf_parser-0.45.2 → okf_parser-0.45.4}/Cargo.lock +2 -2
  2. {okf_parser-0.45.2 → okf_parser-0.45.4}/Cargo.toml +1 -0
  3. {okf_parser-0.45.2 → okf_parser-0.45.4}/PKG-INFO +2 -2
  4. {okf_parser-0.45.2 → okf_parser-0.45.4}/README.md +1 -1
  5. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.1.0.md +1 -1
  6. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.2.0.md +1 -1
  7. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.3.0.md +1 -1
  8. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.4.0.md +1 -1
  9. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.45.2.md +1 -1
  10. okf_parser-0.45.4/changelog/0.45.3/correct-0-45-2-notes.md +6 -0
  11. okf_parser-0.45.4/changelog/0.45.3/pep723-workflow-python.md +6 -0
  12. okf_parser-0.45.4/changelog/0.45.3/uv-first-release-validation.md +9 -0
  13. okf_parser-0.45.4/changelog/0.45.3/version-belongs-to-the-release.md +8 -0
  14. okf_parser-0.45.4/changelog/0.45.4/agent-first-search-rfc.md +9 -0
  15. okf_parser-0.45.4/changelog/0.45.4/atomic-import-writes.md +6 -0
  16. okf_parser-0.45.4/changelog/0.45.4/codebase-to-okf-lexical-containment.md +8 -0
  17. okf_parser-0.45.4/changelog/0.45.4/codebase-to-okf-local-import-resolution.md +11 -0
  18. okf_parser-0.45.4/changelog/0.45.4/codebase-to-okf-one-shot.md +11 -0
  19. okf_parser-0.45.4/changelog/0.45.4/codebase-to-okf-project-manifest.md +13 -0
  20. okf_parser-0.45.4/changelog/0.45.4/codebase-to-okf-self-describing-types.md +11 -0
  21. okf_parser-0.45.4/changelog/0.45.4/codebase-to-okf-skill.md +12 -0
  22. okf_parser-0.45.4/changelog/0.45.4/duckdb-extension-concepts-slice.md +6 -0
  23. okf_parser-0.45.4/changelog/0.45.4/duckdb-extension-read-surface.md +6 -0
  24. okf_parser-0.45.4/changelog/0.45.4/git-commit-envelope.md +6 -0
  25. okf_parser-0.45.4/changelog/0.45.4/projection-documents.md +12 -0
  26. okf_parser-0.45.4/changelog/0.45.4/referential-schema-export-embed-mode.md +10 -0
  27. okf_parser-0.45.4/changelog/0.45.4/referential-schema-export-key-mode.md +10 -0
  28. okf_parser-0.45.4/changelog/0.45.4/referential-schema-export.md +6 -0
  29. okf_parser-0.45.4/changelog/0.45.4/refs-depth-and-composite-keys.md +7 -0
  30. okf_parser-0.45.4/changelog/0.45.4/rfc-0015-canonical-markdown-ir.md +9 -0
  31. okf_parser-0.45.4/changelog/0.45.4/rfc0009-git-commits.md +6 -0
  32. okf_parser-0.45.4/changelog/0.45.4/rfc0010-native-duckdb-extension.md +6 -0
  33. okf_parser-0.45.4/changelog/0.45.4/rfc0011-tracked-migrations.md +6 -0
  34. okf_parser-0.45.4/changelog/0.45.4/rfc0015-rust-markdown-ast.md +11 -0
  35. okf_parser-0.45.4/changelog/0.45.4/rfc0017-fact-profile.md +16 -0
  36. okf_parser-0.45.4/changelog/0.45.4/rfc0018-projection-export.md +9 -0
  37. okf_parser-0.45.4/changelog/0.45.4/type-specifications.md +18 -0
  38. okf_parser-0.45.4/conformance/git-commit-messages.json +84 -0
  39. {okf_parser-0.45.2 → okf_parser-0.45.4}/docs/cli.md +16 -1
  40. {okf_parser-0.45.2 → okf_parser-0.45.4}/docs/releasing.md +26 -1
  41. okf_parser-0.45.4/docs/types/architecture.md +27 -0
  42. okf_parser-0.45.4/docs/types/benchmarkresult.md +28 -0
  43. okf_parser-0.45.4/docs/types/documentation.md +25 -0
  44. okf_parser-0.45.4/docs/types/procedure.md +26 -0
  45. okf_parser-0.45.4/docs/types/project.md +22 -0
  46. okf_parser-0.45.4/docs/types/release-note.md +41 -0
  47. okf_parser-0.45.4/docs/types/release.md +37 -0
  48. okf_parser-0.45.4/docs/types/rfc.md +31 -0
  49. okf_parser-0.45.4/docs/types/skill.md +40 -0
  50. okf_parser-0.45.4/docs/types/spec.md +32 -0
  51. okf_parser-0.45.4/duckdb-extension/Cargo.toml +13 -0
  52. okf_parser-0.45.4/duckdb-extension/Makefile +21 -0
  53. okf_parser-0.45.4/duckdb-extension/README.md +22 -0
  54. okf_parser-0.45.4/duckdb-extension/src/lib.rs +285 -0
  55. okf_parser-0.45.4/duckdb-extension/test/knowledge/index.md +1 -0
  56. okf_parser-0.45.4/duckdb-extension/test/knowledge/node.md +5 -0
  57. okf_parser-0.45.4/examples/minimal/concepts/access-review.md +16 -0
  58. okf_parser-0.45.4/examples/minimal/concepts/onboarding.md +16 -0
  59. okf_parser-0.45.4/examples/minimal/index.md +8 -0
  60. okf_parser-0.45.4/examples/minimal/log.md +10 -0
  61. {okf_parser-0.45.2 → okf_parser-0.45.4}/native-npm-linux-x64/package.json +1 -1
  62. {okf_parser-0.45.2 → okf_parser-0.45.4}/okf-engine/Cargo.toml +1 -1
  63. {okf_parser-0.45.2 → okf_parser-0.45.4}/pyproject.toml +1 -1
  64. okf_parser-0.45.4/rfcs/0009-git-commits-as-okf.md +389 -0
  65. okf_parser-0.45.4/rfcs/0010-native-duckdb-extension.md +496 -0
  66. okf_parser-0.45.4/rfcs/0011-tracked-migrations.md +258 -0
  67. okf_parser-0.45.4/rfcs/0015-canonical-rust-markdown-ast-and-typed-document-model.md +1205 -0
  68. okf_parser-0.45.4/rfcs/0016-agent-first-bundle-search-and-retrieval.md +689 -0
  69. okf_parser-0.45.4/rfcs/0017-fact-profile.md +551 -0
  70. okf_parser-0.45.4/rfcs/0018-referential-schema-export-and-projections.md +272 -0
  71. okf_parser-0.45.4/rfcs/0019-self-contained-recipe-skills.md +185 -0
  72. {okf_parser-0.45.2 → okf_parser-0.45.4}/rust-core/Cargo.toml +2 -2
  73. okf_parser-0.45.4/scripts/changelog_notes.py +93 -0
  74. okf_parser-0.45.4/scripts/project_version.py +67 -0
  75. {okf_parser-0.45.2 → okf_parser-0.45.4}/scripts/release_contract.py +21 -5
  76. okf_parser-0.45.4/scripts/release_summary.py +90 -0
  77. okf_parser-0.45.4/scripts/verify_wheel_scripts.py +66 -0
  78. okf_parser-0.45.4/skills/codebase-to-okf/SKILL.md +256 -0
  79. okf_parser-0.45.4/skills/codebase-to-okf/scripts/codebase_to_okf.py +149 -0
  80. okf_parser-0.45.4/skills/codebase-to-okf/scripts/finalize_codebase_okf.py +345 -0
  81. okf_parser-0.45.4/skills/codebase-to-okf/scripts/python_codebase_to_okf.py +941 -0
  82. okf_parser-0.45.4/skills/codebase-to-okf/scripts/python_project_metadata_to_okf.py +317 -0
  83. okf_parser-0.45.4/skills/codebase-to-okf/scripts/query_codebase_okf.py +202 -0
  84. okf_parser-0.45.4/skills/codebase-to-okf/scripts/resolve_codebase_okf.py +361 -0
  85. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/__init__.py +12 -0
  86. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/bundle_import.py +6 -1
  87. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/cli.py +5 -0
  88. okf_parser-0.45.4/src/okf_parser/git_commit.py +205 -0
  89. okf_parser-0.45.4/src/okf_parser/git_commit_cli.py +46 -0
  90. okf_parser-0.45.4/src/okf_parser/projection_export.py +100 -0
  91. okf_parser-0.45.4/src/okf_parser/projections.py +265 -0
  92. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/pydantic_projection.py +125 -38
  93. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/schema_contract.py +143 -9
  94. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/schema_export.py +105 -6
  95. okf_parser-0.45.4/src/okf_parser/schema_references.py +137 -0
  96. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/service.py +20 -2
  97. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_bundle_import.py +64 -4
  98. okf_parser-0.45.4/tests/test_changelog_notes.py +100 -0
  99. okf_parser-0.45.4/tests/test_codebase_to_okf_containment.py +100 -0
  100. okf_parser-0.45.4/tests/test_codebase_to_okf_local_resolution.py +102 -0
  101. okf_parser-0.45.4/tests/test_codebase_to_okf_one_shot.py +97 -0
  102. okf_parser-0.45.4/tests/test_codebase_to_okf_project_manifest.py +122 -0
  103. okf_parser-0.45.4/tests/test_codebase_to_okf_skill.py +174 -0
  104. okf_parser-0.45.4/tests/test_codebase_to_okf_type_specs.py +94 -0
  105. okf_parser-0.45.4/tests/test_git_commit.py +63 -0
  106. okf_parser-0.45.4/tests/test_git_commit_cli.py +28 -0
  107. okf_parser-0.45.4/tests/test_project_version.py +58 -0
  108. okf_parser-0.45.4/tests/test_projection_documents.py +241 -0
  109. okf_parser-0.45.4/tests/test_projection_export.py +131 -0
  110. okf_parser-0.45.4/tests/test_reference_embed.py +211 -0
  111. okf_parser-0.45.4/tests/test_reference_export.py +216 -0
  112. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_release_contract.py +3 -2
  113. okf_parser-0.45.4/tests/test_release_summary.py +96 -0
  114. okf_parser-0.45.4/tests/test_release_workflow_uv.py +143 -0
  115. okf_parser-0.45.4/tests/test_verify_wheel_scripts.py +64 -0
  116. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/package.json +2 -2
  117. okf_parser-0.45.4/typescript/src/git-commit.ts +197 -0
  118. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/index.ts +7 -0
  119. okf_parser-0.45.4/typescript/src/version.ts +1 -0
  120. okf_parser-0.45.4/typescript/test/git-commit.test.ts +96 -0
  121. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/package.json +2 -2
  122. {okf_parser-0.45.2 → okf_parser-0.45.4}/uv.lock +1 -1
  123. okf_parser-0.45.2/typescript/src/version.ts +0 -1
  124. {okf_parser-0.45.2 → okf_parser-0.45.4}/.gitignore +0 -0
  125. {okf_parser-0.45.2 → okf_parser-0.45.4}/action.yml +0 -0
  126. {okf_parser-0.45.2 → okf_parser-0.45.4}/benchmarks/README.md +0 -0
  127. {okf_parser-0.45.2 → okf_parser-0.45.4}/benchmarks/__init__.py +0 -0
  128. {okf_parser-0.45.2 → okf_parser-0.45.4}/benchmarks/python_parser.py +0 -0
  129. {okf_parser-0.45.2 → okf_parser-0.45.4}/benchmarks/results/2026-08-08-rust-mvp.md +0 -0
  130. {okf_parser-0.45.2 → okf_parser-0.45.4}/benchmarks/results/2026-08-09-rust-e2e.md +0 -0
  131. {okf_parser-0.45.2 → okf_parser-0.45.4}/benchmarks/rust-facts.mjs +0 -0
  132. {okf_parser-0.45.2 → okf_parser-0.45.4}/benchmarks/rust_facts.py +0 -0
  133. {okf_parser-0.45.2 → okf_parser-0.45.4}/benchmarks/typescript-parser.mjs +0 -0
  134. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.10.0.md +0 -0
  135. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.11.0.md +0 -0
  136. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.11.1.md +0 -0
  137. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.12.0.md +0 -0
  138. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.13.0.md +0 -0
  139. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.14.0.md +0 -0
  140. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.14.1.md +0 -0
  141. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.14.2.md +0 -0
  142. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.15.0.md +0 -0
  143. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.15.1.md +0 -0
  144. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.15.2.md +0 -0
  145. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.15.3.md +0 -0
  146. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.15.4.md +0 -0
  147. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.16.0.md +0 -0
  148. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.17.0.md +0 -0
  149. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.18.0.md +0 -0
  150. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.18.1.md +0 -0
  151. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.19.0.md +0 -0
  152. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.19.1.md +0 -0
  153. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.20.0.md +0 -0
  154. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.20.1.md +0 -0
  155. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.21.0.md +0 -0
  156. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.22.0.md +0 -0
  157. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.23.0.md +0 -0
  158. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.24.0.md +0 -0
  159. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.25.0.md +0 -0
  160. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.26.0.md +0 -0
  161. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.27.0.md +0 -0
  162. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.28.0.md +0 -0
  163. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.29.0.md +0 -0
  164. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.30.0.md +0 -0
  165. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.31.0.md +0 -0
  166. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.32.0.md +0 -0
  167. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.32.1.md +0 -0
  168. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.33.0.md +0 -0
  169. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.34.0.md +0 -0
  170. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.35.0.md +0 -0
  171. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.36.0.md +0 -0
  172. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.37.0.md +0 -0
  173. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.38.0.md +0 -0
  174. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.39.0.md +0 -0
  175. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.39.1.md +0 -0
  176. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.40.0.md +0 -0
  177. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.41.0.md +0 -0
  178. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.41.1.md +0 -0
  179. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.41.2.md +0 -0
  180. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.41.3.md +0 -0
  181. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.42.0.md +0 -0
  182. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.42.1.md +0 -0
  183. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.42.2.md +0 -0
  184. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.42.3.md +0 -0
  185. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.42.4.md +0 -0
  186. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.42.5.md +0 -0
  187. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.42.6.md +0 -0
  188. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.42.7.md +0 -0
  189. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.42.8.md +0 -0
  190. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.43.0.md +0 -0
  191. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.43.1.md +0 -0
  192. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.44.0.md +0 -0
  193. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.45.0.md +0 -0
  194. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.45.1.md +0 -0
  195. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.5.0.md +0 -0
  196. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.5.1.md +0 -0
  197. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.6.0.md +0 -0
  198. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.7.0.md +0 -0
  199. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.8.0.md +0 -0
  200. {okf_parser-0.45.2 → okf_parser-0.45.4}/changelog/0.9.0.md +0 -0
  201. {okf_parser-0.45.2 → okf_parser-0.45.4}/conformance/content-digests.json +0 -0
  202. {okf_parser-0.45.2 → okf_parser-0.45.4}/conformance/exclusion.json +0 -0
  203. {okf_parser-0.45.2 → okf_parser-0.45.4}/conformance/formatting.json +0 -0
  204. {okf_parser-0.45.2 → okf_parser-0.45.4}/conformance/frontmatter.json +0 -0
  205. {okf_parser-0.45.2 → okf_parser-0.45.4}/conformance/schema-inference.json +0 -0
  206. {okf_parser-0.45.2 → okf_parser-0.45.4}/conformance/schema-output.json +0 -0
  207. {okf_parser-0.45.2 → okf_parser-0.45.4}/conformance/type-spec-slugs.json +0 -0
  208. {okf_parser-0.45.2 → okf_parser-0.45.4}/docs/architecture.md +0 -0
  209. {okf_parser-0.45.2 → okf_parser-0.45.4}/docs/graphql.md +0 -0
  210. {okf_parser-0.45.2 → okf_parser-0.45.4}/docs/native-engine.md +0 -0
  211. {okf_parser-0.45.2 → okf_parser-0.45.4}/fastmcp.json +0 -0
  212. {okf_parser-0.45.2 → okf_parser-0.45.4}/native-npm-linux-x64/README.md +0 -0
  213. {okf_parser-0.45.2 → okf_parser-0.45.4}/okf-engine/src/engine.rs +0 -0
  214. {okf_parser-0.45.2 → okf_parser-0.45.4}/okf-engine/src/lib.rs +0 -0
  215. {okf_parser-0.45.2 → okf_parser-0.45.4}/okf-engine/src/yaml.rs +0 -0
  216. {okf_parser-0.45.2 → okf_parser-0.45.4}/rfcs/0001-python-model-codegen.md +0 -0
  217. {okf_parser-0.45.2 → okf_parser-0.45.4}/rfcs/0002-typescript-sibling-package.md +0 -0
  218. {okf_parser-0.45.2 → okf_parser-0.45.4}/rfcs/0003-resumable-multi-registry-release.md +0 -0
  219. {okf_parser-0.45.2 → okf_parser-0.45.4}/rfcs/0004-gitignore-exclusion-semantics.md +0 -0
  220. {okf_parser-0.45.2 → okf_parser-0.45.4}/rfcs/0005-relational-frontmatter-writes.md +0 -0
  221. {okf_parser-0.45.2 → okf_parser-0.45.4}/rfcs/0006-declared-column-types.md +0 -0
  222. {okf_parser-0.45.2 → okf_parser-0.45.4}/rfcs/0007-declared-relational-constraints.md +0 -0
  223. {okf_parser-0.45.2 → okf_parser-0.45.4}/rfcs/0008-effect-aware-mcp-writes.md +0 -0
  224. {okf_parser-0.45.2 → okf_parser-0.45.4}/rust-core/.gitignore +0 -0
  225. {okf_parser-0.45.2 → okf_parser-0.45.4}/rust-core/src/engine.rs +0 -0
  226. {okf_parser-0.45.2 → okf_parser-0.45.4}/rust-core/src/main.rs +0 -0
  227. {okf_parser-0.45.2 → okf_parser-0.45.4}/scripts/__init__.py +0 -0
  228. {okf_parser-0.45.2 → okf_parser-0.45.4}/scripts/check_no_duckdb_link.py +0 -0
  229. {okf_parser-0.45.2 → okf_parser-0.45.4}/scripts/native_from_wheel.py +0 -0
  230. {okf_parser-0.45.2 → okf_parser-0.45.4}/scripts/registry_state.py +0 -0
  231. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/apply.py +0 -0
  232. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/bundle.py +0 -0
  233. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/classification.py +0 -0
  234. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/concepts.py +0 -0
  235. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/declared_schema.py +0 -0
  236. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/digests.py +0 -0
  237. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/discovery.py +0 -0
  238. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/duckdb.py +0 -0
  239. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/duckdb_types.py +0 -0
  240. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/edit.py +0 -0
  241. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/engine.py +0 -0
  242. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/exclusion.py +0 -0
  243. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/formatting.py +0 -0
  244. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/graphql_adapter.py +0 -0
  245. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/ingestion.py +0 -0
  246. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/markdown_style.py +0 -0
  247. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/models.py +0 -0
  248. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/parser.py +0 -0
  249. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/relational_schema.py +0 -0
  250. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/rust_core.py +0 -0
  251. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/schema_lexemes.py +0 -0
  252. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/spec_scaffold.py +0 -0
  253. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/type_specs.py +0 -0
  254. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/typed_relations.py +0 -0
  255. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/typed_tables.py +0 -0
  256. {okf_parser-0.45.2 → okf_parser-0.45.4}/src/okf_parser/write_support.py +0 -0
  257. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/__init__.py +0 -0
  258. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/fixtures/__init__.py +0 -0
  259. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/fixtures/declared_parity.expected.json +0 -0
  260. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/fixtures/declared_parity.schema.sql +0 -0
  261. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/fixtures/pydantic_adversarial_generated.py +0 -0
  262. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/fixtures/pydantic_generated.py +0 -0
  263. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_apply.py +0 -0
  264. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_apply_preview_token.py +0 -0
  265. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_apply_preview_token_noop.py +0 -0
  266. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_bundle.py +0 -0
  267. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_bundle_import_reserved.py +0 -0
  268. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_classification.py +0 -0
  269. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_cli.py +0 -0
  270. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_concepts.py +0 -0
  271. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_conformance.py +0 -0
  272. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_content_digests.py +0 -0
  273. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_declared_schema.py +0 -0
  274. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_declared_schema_correctness.py +0 -0
  275. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_duckdb.py +0 -0
  276. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_duckdb_types.py +0 -0
  277. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_edit.py +0 -0
  278. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_engine_resolution.py +0 -0
  279. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_exclusion.py +0 -0
  280. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_exclusion_integration.py +0 -0
  281. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_formatting.py +0 -0
  282. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_formatting_conformance.py +0 -0
  283. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_graphql_adapter.py +0 -0
  284. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_import_preview_token.py +0 -0
  285. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_ingestion.py +0 -0
  286. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_markdown_style.py +0 -0
  287. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_mcp.py +0 -0
  288. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_native_from_wheel.py +0 -0
  289. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_parser.py +0 -0
  290. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_pydantic_source.py +0 -0
  291. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_registry_state.py +0 -0
  292. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_registry_state_native_npm.py +0 -0
  293. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_relational_schema.py +0 -0
  294. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_rust_core.py +0 -0
  295. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_schema_export.py +0 -0
  296. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_schema_inference_conformance.py +0 -0
  297. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_schema_output_conformance.py +0 -0
  298. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_spec_scaffold.py +0 -0
  299. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_type_specs.py +0 -0
  300. {okf_parser-0.45.2 → okf_parser-0.45.4}/tests/test_typed_relations.py +0 -0
  301. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/.npmignore +0 -0
  302. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/LICENSE +0 -0
  303. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/README.md +0 -0
  304. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/package-lock.json +0 -0
  305. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/scripts/smoke-mcp-stdio.mjs +0 -0
  306. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/cli.ts +0 -0
  307. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/core.ts +0 -0
  308. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/digests.ts +0 -0
  309. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/engine.ts +0 -0
  310. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/formatting.ts +0 -0
  311. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/ingestion.ts +0 -0
  312. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/lexemes.ts +0 -0
  313. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/mcp-cli.ts +0 -0
  314. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/mcp.ts +0 -0
  315. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/rust-core.ts +0 -0
  316. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/schema.ts +0 -0
  317. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/src/type-specs.ts +0 -0
  318. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/bundle.test.ts +0 -0
  319. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/classification.test.ts +0 -0
  320. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/content-digests.test.ts +0 -0
  321. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/engine-resolution.test.ts +0 -0
  322. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/exclusion.test.ts +0 -0
  323. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/formatting.test.ts +0 -0
  324. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/frontmatter.test.ts +0 -0
  325. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/ingestion.test.ts +0 -0
  326. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/mcp.test.ts +0 -0
  327. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/schema-inference-conformance.test.ts +0 -0
  328. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/schema-output-conformance.test.ts +0 -0
  329. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/schema.test.ts +0 -0
  330. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/test/type-specs.test.ts +0 -0
  331. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/tsconfig.build.json +0 -0
  332. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript/tsconfig.json +0 -0
  333. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/LICENSE +0 -0
  334. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/README.md +0 -0
  335. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/package-lock.json +0 -0
  336. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/src/cli.ts +0 -0
  337. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/src/declared.ts +0 -0
  338. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/src/index.ts +0 -0
  339. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/src/normalized.ts +0 -0
  340. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/src/session.ts +0 -0
  341. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/src/typed.ts +0 -0
  342. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/test/current-load-options.test.ts +0 -0
  343. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/test/digests.test.ts +0 -0
  344. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/test/duckdb.test.ts +0 -0
  345. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/test/typed.test.ts +0 -0
  346. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/tsconfig.build.json +0 -0
  347. {okf_parser-0.45.2 → okf_parser-0.45.4}/typescript-duckdb/tsconfig.json +0 -0
@@ -447,7 +447,7 @@ dependencies = [
447
447
 
448
448
  [[package]]
449
449
  name = "okf-core"
450
- version = "0.45.2"
450
+ version = "0.45.4"
451
451
  dependencies = [
452
452
  "clap",
453
453
  "okf-engine",
@@ -457,7 +457,7 @@ dependencies = [
457
457
 
458
458
  [[package]]
459
459
  name = "okf-engine"
460
- version = "0.45.2"
460
+ version = "0.45.4"
461
461
  dependencies = [
462
462
  "chrono",
463
463
  "ignore",
@@ -1,5 +1,6 @@
1
1
  [workspace]
2
2
  members = ["okf-engine", "rust-core"]
3
+ exclude = ["duckdb-extension"]
3
4
  resolver = "3"
4
5
 
5
6
  [profile.release]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: okf-parser
3
- Version: 0.45.2
3
+ Version: 0.45.4
4
4
  Requires-Dist: cyclopts>=4.22,<5
5
5
  Requires-Dist: duckdb>=1.4,<2
6
6
  Requires-Dist: fastmcp>=3.4,<4
@@ -231,7 +231,7 @@ Add the repository as a CI check:
231
231
  ```yaml
232
232
  steps:
233
233
  - uses: actions/checkout@v7
234
- - uses: franklinbaldo/okf-parser@v0.45.2
234
+ - uses: franklinbaldo/okf-parser@v0.45.4
235
235
  with:
236
236
  path: knowledge
237
237
  ```
@@ -209,7 +209,7 @@ Add the repository as a CI check:
209
209
  ```yaml
210
210
  steps:
211
211
  - uses: actions/checkout@v7
212
- - uses: franklinbaldo/okf-parser@v0.45.2
212
+ - uses: franklinbaldo/okf-parser@v0.45.4
213
213
  with:
214
214
  path: knowledge
215
215
  ```
@@ -1,5 +1,5 @@
1
1
  ---
2
- type: ChangelogEntry
2
+ type: Release
3
3
  title: okf-parser 0.1.0
4
4
  description: Initial release of the relational OKF validation toolkit
5
5
  ---
@@ -1,5 +1,5 @@
1
1
  ---
2
- type: ChangelogEntry
2
+ type: Release
3
3
  title: okf-parser 0.2.0
4
4
  description: Validate frontmatter at the parse boundary and stop single documents from aborting a run
5
5
  ---
@@ -1,5 +1,5 @@
1
1
  ---
2
- type: ChangelogEntry
2
+ type: Release
3
3
  title: okf-parser 0.3.0
4
4
  description: Decide ordered-list numbering while rendering, and refuse a rewrite that changes protected block structure
5
5
  ---
@@ -1,5 +1,5 @@
1
1
  ---
2
- type: ChangelogEntry
2
+ type: Release
3
3
  title: okf-parser 0.4.0
4
4
  description: Exclude subpaths so a mixed repository can be validated from one root
5
5
  ---
@@ -5,7 +5,7 @@ title: okf-parser 0.45.2
5
5
 
6
6
  # okf-parser 0.45.2
7
7
 
8
- - Restore the executable bits on the six repository scripts that carry a `#!/usr/bin/env -S uv run --script` shebang (`scripts/release_contract.py`, `scripts/registry_state.py`, `scripts/native_from_wheel.py`, `scripts/check_no_duckdb_link.py`, `benchmarks/python_parser.py`, `benchmarks/rust_facts.py`). The PEP 723 migration in 0.45.1's follow-up commit committed them as `100644`, so Ruff reported `EXE001` and the whole quality gate stopped before running. Consumers of the source distribution now get scripts that are runnable as declared.
8
+ - Restore the executable bits on the six repository scripts that carry a `#!/usr/bin/env -S uv run --script` shebang (`scripts/release_contract.py`, `scripts/registry_state.py`, `scripts/native_from_wheel.py`, `scripts/check_no_duckdb_link.py`, `benchmarks/python_parser.py`, `benchmarks/rust_facts.py`). The PEP 723 migration in 0.45.1's follow-up commit committed them as `100644`, so Ruff reported `EXE001` and the whole quality gate stopped before running. Maturin normalizes source-distribution file modes to `644`, so the restored bit applies to the repository and to clones, not inside the published sdist.
9
9
  - Ship the PEP 723 inline dependency headers themselves in the source distribution: the release and benchmark scripts declare `requires-python` and their dependencies inline, so they run standalone with `uv run` without the repository's own environment.
10
10
 
11
11
  No change to the public Python API, the CLI surface, or the wire protocol; the wheel payload is identical to 0.45.1.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: Release Note
3
+ title: Correct the 0.45.2 release notes
4
+ ---
5
+
6
+ - Correct the 0.45.2 changelog, which claimed the restored executable bits reach consumers of the source distribution. Maturin normalizes sdist file modes to `644`; the bits apply to the repository and to clones.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: Release Note
3
+ title: PEP 723 for the workflows' inline Python
4
+ ---
5
+
6
+ - Finish the PEP 723 migration in the workflows themselves. Standalone Python that lived as `python -c` and `python - <<PY` heredocs became three declared helpers -- `scripts/project_version.py`, `scripts/verify_wheel_scripts.py` and `scripts/release_summary.py` -- each run through `uv run --script`. The project version had five inline copies reaching for the runner's ambient interpreter, the one-unified-executable wheel check had two, and the dry run's job summary could only ever be exercised by pushing to CI. All three now have unit tests, run off CI against a downloaded release tree, and are covered by the workflow policy tests, which reject a return to inline Python. The one surviving `python -c` reads `platform.python_version()` for the manifest's build provenance, where an ephemeral script interpreter would report the wrong number.
@@ -0,0 +1,9 @@
1
+ ---
2
+ type: Release Note
3
+ title: uv-first release validation
4
+ ---
5
+
6
+ - Make `uv` the Python environment/install/runner path for release validation. The platform wheel smokes in both the release workflow and the release dry run now use `astral-sh/setup-uv`, `uv venv`, and `uv pip install`; release helpers that declare PEP 723 metadata (`check_no_duckdb_link.py`, `release_contract.py`, `native_from_wheel.py`, and `registry_state.py`) run through `uv run --script` instead of a bare Python interpreter. Regression tests lock this uv-first policy into both workflows.
7
+ - Stop depending on `rustup self uninstall` to prove that a missing wheel fails loudly. The public-index smoke now enforces `uv pip install --only-binary :all:`, which directly forbids a source fallback on every platform and avoids the macOS runner failure where Homebrew rustup refuses self-uninstallation.
8
+ - Replace the fixed `sleep 30` and auxiliary PyPI JSON polling with retry of the real consumer operation: `uv pip install --refresh-package okf-parser --only-binary :all: okf-parser==<version>`. The gate only advances when the public index actually serves a compatible wheel to the installer, eliminating the propagation race that hit 0.45.2.
9
+ - Keep the dry run semantically aligned with release: wheel-consumer installs are binary-only through uv, while the explicit sdist-consumer path remains allowed to build from source so that fallback is still tested deliberately rather than accidentally.
@@ -0,0 +1,8 @@
1
+ ---
2
+ type: Release Note
3
+ title: A version identifies a release, not a pull request
4
+ ---
5
+
6
+ - Let several changes declare the same version, because that is the version they will all carry once merged. The CI gate compared each pull request's version against `origin/$BASE` and refused equality, which on a stack means comparing against the previous PR's branch: the gate itself numbered one six-deep chain 0.45.3 through 0.45.8, while two other pull requests still asked for numbers that had already shipped. The gate now enforces the invariant that actually matters -- never reuse a published version, read from the `v*.*.*` tags -- and allows the head version to equal its base.
7
+ - Move release notes from one `changelog/X.Y.Z.md` to fragments under `changelog/X.Y.Z/`. Changes that share a version no longer compete for a single file; each contributes its own note and `scripts/changelog_notes.py` assembles them, in sorted file-name order, into the published release body. Prefix a fragment's name if you need it to sort somewhere particular. Releases up to 0.45.2 keep their flat files as an archive.
8
+ - Stop publishing frontmatter to GitHub. `finalize` passed `changelog/X.Y.Z.md` straight to `gh release create`, so v0.45.1's release body opens with a byte-order mark and a `---` block; the assembler emits the notes alone.
@@ -0,0 +1,9 @@
1
+ ---
2
+ type: Release Note
3
+ title: Define agent-first bundle search
4
+ ---
5
+
6
+ - Propose RFC 0016 with one public `search` surface that returns compact, provenance-preserving Markdown evidence through explicitly ephemeral body-line locations such as `path.md#B35-B39`.
7
+ - Freeze deterministic offline lexical/literal Phase 1A semantics, exact filter/profile/mode rules, whole-line compact rendering, ranking/tie-breaking, static RFC 0008 MCP effects, and cross-runtime conformance expectations without requiring embeddings, a persistent sidecar, or network access.
8
+ - Keep local DuckDB FTS/BM25 as a non-blocking Phase 1B optimization and keep vector, hybrid, ANN, embeddings, and persistent materializations behind later profiles/phases.
9
+ - Align retrieval with RFC 0015: structural document IR may select complete Markdown fragments, but raw AST/IR JSON is not default agent context; task success/quality gates benchmarks and actual agent-context tokens remain the primary efficiency metric.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: Release Note
3
+ title: atomic per-document import writes
4
+ ---
5
+
6
+ - Make `import --write` stage each destination and rename it into place instead of writing directly to the live Markdown path. A crash during one document write can therefore leave a temporary file but cannot leave a truncated concept at the destination; regression coverage injects a mid-write failure and verifies every committed document remains byte-identical to a clean import.
@@ -0,0 +1,8 @@
1
+ ---
2
+ type: Release Note
3
+ title: expose lexical containment in codebase OKF
4
+ ---
5
+
6
+ - Add immediate bidirectional lexical-containment metadata to projected classes, functions, and methods, including definition-line and generated-path identity so same-name redefinitions remain distinct.
7
+ - Add exact `--parent` lookup so agents can retrieve the immediate children of a class or callable without reopening source.
8
+ - Keep containment explicitly syntax-level: it does not claim runtime ownership, inheritance, reachability, descriptor binding, or call dispatch.
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Release Note
3
+ title: Conservative local import resolution for codebase OKF
4
+ description: The codebase skill can now add separate source-tree import-resolution claims without rewriting syntax observations or claiming runtime dispatch
5
+ ---
6
+
7
+ # Conservative local import resolution for codebase OKF
8
+
9
+ Adds a PEP 723 `resolve_codebase_okf.py` enrichment recipe that maps import targets only when they match a unique projected `CodeModule` in the generated source tree.
10
+
11
+ The resolver preserves `CodeImport` as immutable syntax evidence and emits separate `CodeImportResolution` concepts with explicit `source-tree-resolved` or `source-tree-partial` status, a versioned resolution method, normative type specification, deterministic regeneration and dependency-oriented query support.
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Release Note
3
+ title: One-shot codebase-to-OKF projection
4
+ description: The codebase skill now provides one agent-facing command that generates and normatively finalizes a Python OKF bundle before returning success
5
+ ---
6
+
7
+ # One-shot codebase-to-OKF projection
8
+
9
+ Adds `codebase_to_okf.py`, a thin PEP 723 orchestrator over the existing Python generator and type finalizer. The default agent workflow now returns only after producer-defined type specs reach their canonical fixed point and normative validation succeeds.
10
+
11
+ The lower-level generation and finalization recipes remain available for inspection and repair, while `--force` regeneration through the one-shot path remains byte-for-byte deterministic.
@@ -0,0 +1,13 @@
1
+ ---
2
+ type: Release Note
3
+ title: project PEP 621 dependencies into OKF
4
+ ---
5
+
6
+ The `codebase-to-okf` skill now includes standard Python project metadata in the one-shot projection when a PEP 621 `[project]` table is present in `pyproject.toml`.
7
+
8
+ - `CodeProject` preserves authored project identity and selected PEP 621 fields.
9
+ - `CodeDependency` preserves runtime and optional PEP 508 declarations with parsed navigation fields.
10
+ - dependency concepts use `manifest-declared` explicitly and do not claim installation, imports, reachability, or runtime use.
11
+ - the query recipe adds `--package` for compact dependency lookup.
12
+ - the normative finalizer documents both new producer-defined types through canonical `docs/types/{slug}.md` specs.
13
+ - projects without a PEP 621 `[project]` table keep the source-only projection path unchanged.
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Release Note
3
+ title: Self-describing codebase-to-OKF bundles
4
+ description: Generated codebase bundles can now be finalized with canonical type specifications scaffolded through the same init lifecycle used by okf-parser itself
5
+ ---
6
+
7
+ # Self-describing codebase-to-OKF bundles
8
+
9
+ Adds a `finalize_codebase_okf.py` PEP 723 recipe that runs the canonical `init_bundle` service to a fixed point, authors semantics for the generated `Code*` types plus `Spec`, and validates the result with normative `docs/types/{slug}.md` coverage.
10
+
11
+ The finalizer is deterministic and idempotent: it never invents specification paths, does not rewrite already-complete specs, and a second run leaves the generated bundle byte-for-byte unchanged.
@@ -0,0 +1,12 @@
1
+ ---
2
+ type: Release Note
3
+ title: self-contained codebase-to-OKF recipe skill
4
+ ---
5
+
6
+ - Add RFC 0019, keeping source-specific extraction out of `okf-parser` core and defining typed recipe skill directories as the preferred boundary for deterministic source-to-OKF adapters.
7
+ - Add `skills/codebase-to-okf/SKILL.md` plus bundled PEP 723 generation and query recipes under `scripts/`, keeping agent instructions compact while recipe-only dependencies stay outside the package runtime.
8
+ - Extract Python modules, classes, functions, methods, imports, signatures, parameters, returns, docstrings, decorators, bases, class fields and explicit `CodeCall` syntax observations into deterministic derived OKF.
9
+ - Preserve epistemic boundaries by marking calls and imports `syntactic-unresolved`; name-matched call targets are navigation candidates rather than dispatch claims.
10
+ - Add compact code-aware lookup by symbol, caller, callee, source and producer-defined type on top of the public generic `load_bundle()` API, without adding code semantics to parser core; compact JSON is the default so agents can decide whether a source read is still necessary before paying for it.
11
+ - Keep the standalone recipes under the repository's normal Ruff quality rules, with only the explicit `T201` exception appropriate to command-line output rather than a blanket recipe lint exemption.
12
+ - Test the skill as typed OKF knowledge and both bundled recipes as executable code, including rich metadata, same-name redefinitions, code-aware lookup, conformant output and byte-for-byte deterministic regeneration.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: Release Note
3
+ title: first native DuckDB extension slice
4
+ ---
5
+
6
+ - Add the first RFC 0010 implementation slice: an experimental Rust loadable DuckDB extension exposing `okf_concepts(root)` directly from the shared `okf-engine`, emitting DuckDB data chunks without subprocess/whole-bundle JSON transport and keeping the evolving extension toolchain isolated from the stable workspace release graph.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: Release Note
3
+ title: complete native DuckDB read surface
4
+ ---
5
+
6
+ - Extend the RFC 0010 DuckDB extension slice with `okf_links(root)`, `okf_reserved(root)` and `okf_diagnostics(root)` alongside `okf_concepts(root)`, preserving unresolved links, reserved documents and document-level diagnostics as typed SQL rows while keeping root/configuration failures as table-function errors.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: Release Note
3
+ title: subject-first Git commit envelopes
4
+ ---
5
+
6
+ - Implement the first RFC 0009 Git adapter slice: parse and validate subject-first `--- okf` commit-message envelopes, preserve plain commits with an effective `type: Commit`, reject adapter-owned metadata collisions with stable diagnostics, expose an `okf-commit-msg` hook command, and pin Python/TypeScript parity with shared conformance vectors and canonical digests.
@@ -0,0 +1,12 @@
1
+ ---
2
+ type: Release Note
3
+ title: projection documents, parsed and resolved
4
+ ---
5
+
6
+ - Recognize `type: Projection` documents in a bundle (RFC 0018 section 5). A projection names one root concept type and, in `include`, the declared relations to traverse; each `relation` is written `FromType.field` and must resolve to a `FOREIGN KEY` the bundle's `okf.schema.sql` already declares. A projection composes what the relational contract states and cannot invent a relationship.
7
+ - Resolve each relation's direction from RFC 0007's rule that N:1 is the primitive: a key *pointing at* the root becomes a list on the root, a key *on* the root becomes a single value. A self-reference is written from the root's own side and therefore reads as single.
8
+ - Resolve a composite foreign key from any one of its participating columns, so the case that standalone `--refs=embed` refuses is the case a projection answers — the member's `as` is the name that was missing.
9
+ - Refuse, with errors that name the projection: an unknown root, a name colliding with a concept type, a duplicate projection or member name, a relation that is not `FromType.field`, a relation the relational contract does not declare, a relation that connects two types neither of which is the root, and a projection document in a bundle with no relational schema to resolve it against. `optional: true` is the only member-level modifier recognized; any other key is an error rather than a silent no-op, so a mistyped `as` cannot pass for composition.
10
+ - Keep projections out of the compiled concept types: a bundle with projection documents no longer exports a `Projection` schema whose fields are `name`, `root` and `include`.
11
+
12
+ Parsing and resolution only. Compiling a resolved projection into a `TypeContract` and exporting it through `--format` is the next step of the same RFC.
@@ -0,0 +1,10 @@
1
+ ---
2
+ type: Release Note
3
+ title: referential schema export, embed mode
4
+ ---
5
+
6
+ - Add `schema --refs=embed`, the second half of RFC 0018's export: a declared reference stops being a scalar and becomes the referenced schema itself. It is emitted **by name**, never re-inlined — `$ref` into the exported `defs` pool for JSON Schema, the sibling `const` for Zod, and the sibling model for Pydantic — so one change to a type reaches every schema that references it in the same regeneration.
7
+ - Order Zod declarations by dependency, since a `const` cannot be read before it is declared, and close a cycle with `z.lazy(() => Schema)` on the one edge that ordering cannot satisfy. A self-referencing type is the minimal case and is covered by the corpus.
8
+ - Emit Pydantic forward references with postponed annotations and a trailing `model_rebuild()`, and only when an embedded reference actually needs them: a bundle without cycles generates exactly the module it generated before. The generated module is executed in the tests, not merely string-matched, so a cyclic model is proven to import and validate.
9
+ - Refuse `--refs=embed` on a composite foreign key with an error that names the constraint and points at projections: embedding replaces the key's columns with one member, and naming that member from N columns would put a naming convention in the parser. `--refs=key` continues to support composite keys.
10
+ - Refuse `--refs=embed` without `--relational-schema`, which has nothing to embed.
@@ -0,0 +1,10 @@
1
+ ---
2
+ type: Release Note
3
+ title: referential schema export, key mode
4
+ ---
5
+
6
+ - Implement the first half of RFC 0018: `schema --relational-schema PATH` reads the bundle's `okf.schema.sql` and compiles every field participating in a declared `FOREIGN KEY` to a reference node instead of to the bare scalar it carries. Composition is read from the RFC 0007 contract that already exists — no second place to declare that two types are related, and no naming or folder convention consulted.
7
+ - Publish the reference in each format's own idiom: JSON Schema gains `x-okf-references` (target type, the constraint's columns in authored order, the referenced columns, and this field's position in the key), Zod gains a `.describe("references Type(column)")` that leaves `z.infer` untouched, and Pydantic carries the same payload in `Field(json_schema_extra=...)`. The field keeps the scalar type it always had: under key mode a reference is a type-level fact about the value, not a promise that the consumer holds the referenced document.
8
+ - Support composite foreign keys, which `ForeignKeyConstraint` has described since RFC 0007: every participating column carries the whole constraint and its own position, so a consumer can reassemble the key without guessing its order.
9
+ - Keep the whole feature opt-in and default-off. Without `--relational-schema` the exported JSON Schema, Zod and Pydantic are byte-identical to before, which the regression corpus asserts directly. A relative path resolves against the bundle root, matching `check --relational-schema`.
10
+ - Report, rather than silently skip, a declared foreign-key column that no document of its type carries, and a column claimed by two foreign keys.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: Release Note
3
+ title: referential schema export proposal
4
+ ---
5
+
6
+ - Add RFC 0018, proposing referential schema export and declared projections: `schema` learns to read the bundle's `okf.schema.sql` so a field participating in a declared foreign key compiles to a reference instead of a closed scalar, and an optional `type: Projection` document composes a root type with declared relations. Both are opt-in; without the new flag and without projection documents the export is unchanged. The RFC also proposes emitting `export type X = z.infer<typeof XSchema>` from the Zod renderer, which removes the hand-written barrel every TypeScript consumer maintains today.
@@ -0,0 +1,7 @@
1
+ ---
2
+ type: Release Note
3
+ title: reference depth and composite-key rules
4
+ ---
5
+
6
+ - Amend RFC 0018 with the two controls its first draft left open. `--refs=embed` stays a per-run binary mode rather than a per-field selector: a projection is where per-member composition is declared. Depth moves to projections, where it is answerable — a flat export emits one schema per concept type and every type is a root there, so bounding hops would need two variants of the same contract; a projection has exactly one root, and a member beyond its bound degrades to the reference's key form instead of being dropped.
7
+ - Settle composite foreign keys, which `ForeignKeyConstraint` has described since RFC 0007 and which the motivating bundle needs on its first reference: `--refs=key` supports them, projections embed them under the member's `as` name, and standalone `--refs=embed` rejects them with a normative error that names the constraint and points at projections. Naming a composed member from N columns would put a naming convention in the parser, which the RFC's first decision forbids.
@@ -0,0 +1,9 @@
1
+ ---
2
+ type: Release Note
3
+ title: Define the canonical Markdown document model
4
+ ---
5
+
6
+ - Propose RFC 0015: make the Rust engine the authoritative Markdown parser while keeping raw `mdast` private behind an OKF-owned, versioned document protocol.
7
+ - Define frozen/closed Pydantic and TypeScript boundary models, source spans over a normalized parser snapshot, exact-source guarding through `source_digest`, and an internal `SourceMap` for lossless BOM/newline-aware edits.
8
+ - Keep generated RFC 0001 Pydantic models focused on producer-authored frontmatter, keep `Bundle` and relational records compact, and make full AST serialization opt-in.
9
+ - Add convergence gates with #182/#183 performance fast paths, #189 structural retrieval, and #104 Git/provenance ownership.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: Release Note
3
+ title: Git commits as OKF proposal
4
+ ---
5
+
6
+ - Accept RFC 0009 defining Git commit messages as an explicit OKF source-adapter surface: subject-first `--- okf` envelopes preserve ordinary Git subjects, plain commits remain representable as `type: Commit`, Git object/provenance identity stays adapter-owned, and `parsed_digest` covers the effective semantic OKF projection rather than Git transport metadata.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: Release Note
3
+ title: native DuckDB extension proposal
4
+ ---
5
+
6
+ - Propose RFC 0010 for a loadable DuckDB extension backed by the shared `okf-engine`: keep OKF semantics DuckDB-independent, expose concepts/links/reserved/diagnostics as typed table functions, retain Python/TypeScript/CLI fallbacks, and treat projection pushdown, bounded chunking, cancellation and Community Extension distribution as explicit implementation gates.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: Release Note
3
+ title: tracked bundle migrations proposal
4
+ ---
5
+
6
+ - Propose RFC 0011 for idempotent, ledger-backed bundle migrations that reuse the RFC 0005 relational write contract and record each migration as an ordinary `type: Migration` OKF concept. The design also makes atomic creation of new candidate files a shared write primitive so migrations and imports can converge on one staging/validation/conflict path.
@@ -0,0 +1,11 @@
1
+ ---
2
+ type: Release Note
3
+ title: Propose RFC 0015, a canonical Rust Markdown AST
4
+ ---
5
+
6
+ Documentation/RFC release; no runtime behavior changes.
7
+
8
+ - Propose RFC 0015: make the Rust engine the authoritative Markdown parser while keeping raw `mdast` private behind an OKF-owned, versioned document protocol.
9
+ - Define frozen/closed Pydantic and TypeScript boundary models, source spans over a normalized parser snapshot, exact-source guarding through `source_digest`, and an internal `SourceMap` for lossless BOM/newline-aware edits.
10
+ - Keep generated RFC 0001 Pydantic models focused on producer-authored frontmatter, keep `Bundle` and relational records compact, and make full AST serialization opt-in.
11
+ - Add convergence gates with #182/#183 performance fast paths, #189 structural retrieval, and #104 Git/provenance ownership.
@@ -0,0 +1,16 @@
1
+ ---
2
+ type: Release Note
3
+ title: Draft RFC 0017, the provider-local fact profile
4
+ ---
5
+
6
+ - Draft RFC 0017, the `fact` profile, scoped explicitly to native `.fact/`
7
+ contexts so plain OKF keeps the identity, reserved filenames and vocabulary
8
+ the base format and RFC 0012 already pin. A markerless directory is read as a
9
+ compatibility view, and retiring `index.md`/`log.md` or renaming
10
+ `bundle`/`concept` stays profile-local until a migration of its own.
11
+ - Reconcile the profile's stable fact identity with RFC 0012 by defining
12
+ `.fact/` as a distinct provider rather than a reinterpretation of the
13
+ filesystem provider. Identity still comes from the provider and never from
14
+ content: the id is authored, not inferred from equal digests.
15
+ - Add `examples/minimal`, the smallest bundle `check` accepts as conformant,
16
+ validated by the repository's own `check` run.
@@ -0,0 +1,9 @@
1
+ ---
2
+ type: Release Note
3
+ title: projection contracts export across schema formats
4
+ ---
5
+
6
+ - Export resolved RFC 0018 `Projection` contracts through JSON Schema, Zod, and Pydantic while preserving every field of the root contract.
7
+ - Compose each declared member under its authored `as` name by sibling-schema reference rather than structural re-inline; 1:N members become lists, singular relations remain singular, and composite foreign keys are supported because the projection supplies the composed member name.
8
+ - Keep undeclared references on the root in key form while projection-declared members are embedded by name, so the projection remains the sole control over composition.
9
+ - Treat `optional: true` as a nullable composed member, matching RFC 0018, and publish JSON Schema `$defs` whenever projection references require them even under the default flat key mode.
@@ -0,0 +1,18 @@
1
+ ---
2
+ type: Release Note
3
+ title: The repository specifies its own concept types
4
+ ---
5
+
6
+ - Add a specification document for every concept type in use, at the
7
+ `docs/types/{slug}.md` path `--require-spec` derives, and run the rule
8
+ normatively in CI. The flag shipped in 0.14.0 and the repository that ships it
9
+ had never run it; a new type without a specification now fails the build
10
+ instead of passing unnoticed.
11
+ - Migrate `changelog/0.1.0.md` through `0.4.0.md` from `ChangelogEntry` to
12
+ `Release`. Writing both specifications forced the question the split had been
13
+ hiding: same directory, same fields, same meaning, so the earlier four were
14
+ drift left behind by the rename at 0.5.0 rather than a second type.
15
+ - Move the 0.45.4 release notes into `changelog/0.45.4/` as a fragment. The
16
+ version arrived while the flat-file format was being retired, and
17
+ `changelog_notes.py` assembles a release only from its fragment directory, so
18
+ the notes would not have reached the published body.
@@ -0,0 +1,84 @@
1
+ {
2
+ "valid": [
3
+ {
4
+ "name": "plain",
5
+ "source": "Fix the thing\n\nNarrative.\n",
6
+ "subject": "Fix the thing",
7
+ "authored_metadata": {},
8
+ "effective_frontmatter": {"type": "Commit", "title": "Fix the thing"},
9
+ "body": "Narrative.\n",
10
+ "has_envelope": false,
11
+ "source_digest": "sha256:a57c5b47db88bb64e3cdeff8c503465b010f57746f210ad0e5e9aff0f888e4b6",
12
+ "parsed_digest": "okf-parsed-v1-jcs-sha256:c19c4c2520f68da420c1ba1cfd5871f836fbeff99df1ebdba51509fc57a7ea6e",
13
+ "formatted": "Fix the thing\n\nNarrative.\n"
14
+ },
15
+ {
16
+ "name": "structured",
17
+ "source": "Publish parser history\n\n--- okf\ntype: Post\npublish: true\ntags:\n - git\n - okf\n---\n\nHello **history**.\n",
18
+ "subject": "Publish parser history",
19
+ "authored_metadata": {"type": "Post", "publish": "true", "tags": ["git", "okf"]},
20
+ "effective_frontmatter": {"type": "Post", "publish": "true", "tags": ["git", "okf"], "title": "Publish parser history"},
21
+ "body": "Hello **history**.\n",
22
+ "has_envelope": true,
23
+ "source_digest": "sha256:7f223b8850136874d8218f55a819e5df5dab385a4c5a8e07030e336248fcd6c9",
24
+ "parsed_digest": "okf-parsed-v1-jcs-sha256:d27af18923c8a5e99d5925af51d527797f5c574bf9158a8c903dde1b53349e47",
25
+ "formatted": "Publish parser history\n\n--- okf\n\"publish\": \"true\"\n\"tags\": [\"git\",\"okf\"]\n\"type\": \"Post\"\n---\n\nHello **history**.\n"
26
+ },
27
+ {
28
+ "name": "subject-only",
29
+ "source": "Legacy subject only",
30
+ "subject": "Legacy subject only",
31
+ "authored_metadata": {},
32
+ "effective_frontmatter": {"type": "Commit", "title": "Legacy subject only"},
33
+ "body": "",
34
+ "has_envelope": false,
35
+ "source_digest": "sha256:1f2874fbac03a8c04e8f71b551320bb1006087b1eee542f87d5ea68837ab62ca",
36
+ "parsed_digest": "okf-parsed-v1-jcs-sha256:508d433a377922534b97a511103f7c97f44171a5b9f24290ecd0f16ecc2e05fa",
37
+ "formatted": "Legacy subject only"
38
+ },
39
+ {
40
+ "name": "conventional-subject",
41
+ "source": "feat(parser): preserve subjects\n\nBody.",
42
+ "subject": "feat(parser): preserve subjects",
43
+ "authored_metadata": {},
44
+ "effective_frontmatter": {"type": "Commit", "title": "feat(parser): preserve subjects"},
45
+ "body": "Body.",
46
+ "has_envelope": false,
47
+ "source_digest": "sha256:4fee7cb6063d4e4f8b07a02697f2427f83fb733b2198712935d748ffcd294ea0",
48
+ "parsed_digest": "okf-parsed-v1-jcs-sha256:a72a4f8baa3ca2011dbf1554013075157c35bf3a4cc476b376cfaad2d346bc1f",
49
+ "formatted": "feat(parser): preserve subjects\n\nBody."
50
+ }
51
+ ],
52
+ "invalid": [
53
+ {
54
+ "name": "empty-subject",
55
+ "source": "\n\nBody",
56
+ "code": "GIT_MESSAGE_EMPTY_SUBJECT"
57
+ },
58
+ {
59
+ "name": "unterminated-envelope",
60
+ "source": "Subject\n\n--- okf\ntype: Change\n",
61
+ "code": "GIT_MESSAGE_UNTERMINATED_ENVELOPE"
62
+ },
63
+ {
64
+ "name": "reserved-title",
65
+ "source": "Subject\n\n--- okf\ntitle: Another title\n---",
66
+ "code": "GIT_MESSAGE_RESERVED_KEY"
67
+ },
68
+ {
69
+ "name": "invalid-type",
70
+ "source": "Subject\n\n--- okf\ntype:\n - Change\n---",
71
+ "code": "GIT_MESSAGE_TYPE"
72
+ },
73
+ {
74
+ "name": "missing-body-separator",
75
+ "source": "Subject\n\n--- okf\ntype: Change\n---\nBody",
76
+ "code": "GIT_MESSAGE_BODY_SEPARATOR"
77
+ },
78
+ {
79
+ "name": "duplicate-envelope",
80
+ "source": "Subject\n\n--- okf\ntype: Change\n---\n\nBody\n--- okf\n",
81
+ "code": "GIT_MESSAGE_DUPLICATE_ENVELOPE"
82
+ }
83
+ ]
84
+ }
@@ -126,7 +126,7 @@ MCP tool: `graph`.
126
126
  ## `schema`
127
127
 
128
128
  ```bash
129
- uv run okf-parser schema path/to/bundle [--format json|zod|pydantic|graphql] [--infer-types] [--cast FIELD]... [--spec-template TEMPLATE] [--exclude PATTERN]... [--zod-import zod|astro]
129
+ uv run okf-parser schema path/to/bundle [--format json|zod|pydantic|graphql] [--infer-types] [--cast FIELD]... [--spec-template TEMPLATE] [--exclude PATTERN]... [--zod-import zod|astro] [--relational-schema PATH] [--refs key|embed]
130
130
  ```
131
131
 
132
132
  Exports the bundle's shared frontmatter contract as JSON Schema, Zod source,
@@ -159,6 +159,21 @@ multiline form rather than relying on a later formatter pass.
159
159
  - `--spec-template TEMPLATE` — derive each type's specification path and, when
160
160
  present, read the sibling `.schema.sql` declaration introduced by RFC 0006.
161
161
  The template must contain `{slug}`.
162
+ - `--relational-schema` — read the bundle's `okf.schema.sql` (RFC 0007) and
163
+ compile every field participating in a declared `FOREIGN KEY` to a reference
164
+ (RFC 0018). A relative path resolves against the bundle root, same as
165
+ `check --relational-schema`. JSON Schema publishes the constraint under
166
+ `x-okf-references`, Zod describes it, and Pydantic carries it in
167
+ `json_schema_extra`; the field keeps the scalar type it already had. Without
168
+ the flag, output is unchanged. `--format graphql` ignores it for now.
169
+ - `--refs` — how a declared reference is exported. `key` (default) keeps the
170
+ scalar and publishes the constraint as metadata. `embed` replaces the field
171
+ with the referenced schema **by name**: `$ref` into `defs` for JSON Schema,
172
+ the sibling `const` for Zod (declared in dependency order, with `z.lazy` on a
173
+ cycle), and the sibling model for Pydantic (with postponed annotations and
174
+ `model_rebuild()` when a forward reference is needed). `embed` requires
175
+ `--relational-schema`, and refuses a composite key: embedding replaces N
176
+ columns with one member, and only a projection can name it.
162
177
  - `--zod-import` — only meaningful with `--format zod`; choose the `zod` or
163
178
  `astro:content` import style.
164
179
 
@@ -53,11 +53,36 @@ Before building, `scripts/release_contract.py verify-source` requires all of the
53
53
  - versions in the npm manifests;
54
54
  - `PROTOCOL_VERSION` in `typescript/src/version.ts`;
55
55
  - the `okf-parser` peer range in the DuckDB adapter;
56
- - `changelog/X.Y.Z.md` frontmatter title;
56
+ - at least one release-note fragment in `changelog/X.Y.Z/`;
57
57
  - an optional stable tag, exactly `vX.Y.Z`.
58
58
 
59
59
  Prereleases are deliberately rejected until npm dist-tag policy is implemented.
60
60
 
61
+ ## Version numbers and release notes
62
+
63
+ A version number identifies a **release**, not a pull request. Several changes may declare the same number, because that is the version they will all carry once they merge. A stack of pull requests should therefore share one version rather than climbing by one at every level -- the CI gate used to force that climb, by comparing each head against its base, and produced chains numbered 0.45.3 through 0.45.8 that nobody intended.
64
+
65
+ The gate now checks the invariant that matters: the declared version must outrank every published `v*.*.*` tag. It may equal the base's version, and it may not regress below it.
66
+
67
+ Each change contributes its own note to `changelog/X.Y.Z/`, so changes sharing a version never compete for one file:
68
+
69
+ ```text
70
+ changelog/
71
+ ├── 0.45.2.md # releases up to 0.45.2 keep their flat file
72
+ └── 0.45.3/
73
+ ├── correct-0-45-2-notes.md
74
+ ├── pep723-workflow-python.md
75
+ └── uv-first-release-validation.md
76
+ ```
77
+
78
+ A fragment is a `type: Release Note` concept with a title and a body of bullets. `scripts/changelog_notes.py X.Y.Z` assembles them, in sorted file-name order, into the body `finalize` publishes as the GitHub Release; prefix a file name if a fragment must sort somewhere particular. The assembler strips frontmatter, which the old `--notes-file changelog/X.Y.Z.md` did not -- v0.45.1's release body still opens with a byte-order mark and a `---` block.
79
+
80
+ Preview a release's notes at any time:
81
+
82
+ ```bash
83
+ uv run --script scripts/changelog_notes.py "$(uv run --script scripts/project_version.py)"
84
+ ```
85
+
61
86
  ## Python packaging
62
87
 
63
88
  The root project uses Maturin as its PEP 517 backend with `bindings = "bin"`. The Python import package and PyPI distribution remain `okf_parser` and `okf-parser`; the sole installed binary target is `okf-parser`.
@@ -0,0 +1,27 @@
1
+ ---
2
+ type: Spec
3
+ title: Architecture
4
+ description: A document recording a structural boundary the implementation is expected to hold
5
+ ---
6
+
7
+ # Architecture
8
+
9
+ An `Architecture` concept records a structural rule the implementation is
10
+ expected to hold, in enough detail that a pull request can be judged against it.
11
+
12
+ The single concept of this type is [`docs/architecture.md`](../architecture.md),
13
+ which draws the boundary between the strict authored-OKF core and source
14
+ adapters.
15
+
16
+ ## Frontmatter
17
+
18
+ - `type` — always `Architecture`.
19
+ - `title` — the boundary being drawn.
20
+
21
+ `description` is optional here and the existing document omits it.
22
+
23
+ ## Distinguished from Documentation
24
+
25
+ `Documentation` explains how to use what exists. `Architecture` constrains what
26
+ may be built. A rule that no reviewer would cite when rejecting a change is
27
+ documentation, not architecture.