solverforge 0.6.0__tar.gz → 0.6.1__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 (243) hide show
  1. {solverforge-0.6.0 → solverforge-0.6.1}/Cargo.lock +1 -1
  2. {solverforge-0.6.0 → solverforge-0.6.1}/Cargo.toml +12 -1
  3. {solverforge-0.6.0 → solverforge-0.6.1}/PKG-INFO +4 -11
  4. {solverforge-0.6.0 → solverforge-0.6.1}/README.md +3 -10
  5. {solverforge-0.6.0 → solverforge-0.6.1}/pyproject.toml +1 -1
  6. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/__init__.py +1 -1
  7. solverforge-0.6.0/.github/workflows/ci.yml +0 -69
  8. solverforge-0.6.0/.github/workflows/release.yml +0 -212
  9. solverforge-0.6.0/.gitignore +0 -11
  10. solverforge-0.6.0/.pre-commit-config.yaml +0 -31
  11. solverforge-0.6.0/.python-version +0 -1
  12. solverforge-0.6.0/AGENTS.md +0 -153
  13. solverforge-0.6.0/CHANGELOG.md +0 -61
  14. solverforge-0.6.0/Makefile +0 -419
  15. solverforge-0.6.0/WIREFRAME.md +0 -456
  16. solverforge-0.6.0/examples/list_tsp.py +0 -20
  17. solverforge-0.6.0/examples/mixed_job_shop.py +0 -30
  18. solverforge-0.6.0/examples/nqueens.py +0 -36
  19. solverforge-0.6.0/examples/shift_scheduling.py +0 -45
  20. solverforge-0.6.0/examples/solverforge_deliveries/README.md +0 -90
  21. solverforge-0.6.0/examples/solverforge_deliveries/__init__.py +0 -23
  22. solverforge-0.6.0/examples/solverforge_deliveries/__main__.py +0 -32
  23. solverforge-0.6.0/examples/solverforge_deliveries/solver.toml +0 -51
  24. solverforge-0.6.0/examples/solverforge_deliveries/src/__init__.py +0 -1
  25. solverforge-0.6.0/examples/solverforge_deliveries/src/api/__init__.py +0 -1
  26. solverforge-0.6.0/examples/solverforge_deliveries/src/api/dto.py +0 -233
  27. solverforge-0.6.0/examples/solverforge_deliveries/src/api/mod.py +0 -3
  28. solverforge-0.6.0/examples/solverforge_deliveries/src/api/routes.py +0 -239
  29. solverforge-0.6.0/examples/solverforge_deliveries/src/api/sse.py +0 -42
  30. solverforge-0.6.0/examples/solverforge_deliveries/src/constraints/__init__.py +0 -5
  31. solverforge-0.6.0/examples/solverforge_deliveries/src/constraints/mod.py +0 -47
  32. solverforge-0.6.0/examples/solverforge_deliveries/src/data/__init__.py +0 -5
  33. solverforge-0.6.0/examples/solverforge_deliveries/src/data/data_seed/__init__.py +0 -5
  34. solverforge-0.6.0/examples/solverforge_deliveries/src/data/data_seed/entrypoints.py +0 -149
  35. solverforge-0.6.0/examples/solverforge_deliveries/src/data/data_seed/locations.json +0 -1472
  36. solverforge-0.6.0/examples/solverforge_deliveries/src/data/mod.py +0 -1
  37. solverforge-0.6.0/examples/solverforge_deliveries/src/domain/__init__.py +0 -33
  38. solverforge-0.6.0/examples/solverforge_deliveries/src/domain/delivery.py +0 -32
  39. solverforge-0.6.0/examples/solverforge_deliveries/src/domain/metrics.py +0 -493
  40. solverforge-0.6.0/examples/solverforge_deliveries/src/domain/mod.py +0 -1
  41. solverforge-0.6.0/examples/solverforge_deliveries/src/domain/plan.py +0 -126
  42. solverforge-0.6.0/examples/solverforge_deliveries/src/domain/vehicle.py +0 -112
  43. solverforge-0.6.0/examples/solverforge_deliveries/src/lib.py +0 -34
  44. solverforge-0.6.0/examples/solverforge_deliveries/src/main.py +0 -22
  45. solverforge-0.6.0/examples/solverforge_deliveries/src/solver/__init__.py +0 -5
  46. solverforge-0.6.0/examples/solverforge_deliveries/src/solver/mod.py +0 -1
  47. solverforge-0.6.0/examples/solverforge_deliveries/src/solver/service/__init__.py +0 -196
  48. solverforge-0.6.0/examples/solverforge_deliveries/src/solver/service/mod.py +0 -7
  49. solverforge-0.6.0/examples/solverforge_deliveries/src/solver/service/payload.py +0 -86
  50. solverforge-0.6.0/examples/solverforge_deliveries/static/app/main.mjs +0 -287
  51. solverforge-0.6.0/examples/solverforge_deliveries/static/app/models/core.mjs +0 -57
  52. solverforge-0.6.0/examples/solverforge_deliveries/static/app/models/formatters.mjs +0 -53
  53. solverforge-0.6.0/examples/solverforge_deliveries/static/app/models/preview.mjs +0 -154
  54. solverforge-0.6.0/examples/solverforge_deliveries/static/app/models/timeline.mjs +0 -94
  55. solverforge-0.6.0/examples/solverforge_deliveries/static/app/models.mjs +0 -8
  56. solverforge-0.6.0/examples/solverforge_deliveries/static/app/ui/api-guide.mjs +0 -29
  57. solverforge-0.6.0/examples/solverforge_deliveries/static/app/ui/components.mjs +0 -44
  58. solverforge-0.6.0/examples/solverforge_deliveries/static/app/ui/data-tables.mjs +0 -98
  59. solverforge-0.6.0/examples/solverforge_deliveries/static/app/ui/layout.mjs +0 -123
  60. solverforge-0.6.0/examples/solverforge_deliveries/static/app/ui/lifecycle.mjs +0 -23
  61. solverforge-0.6.0/examples/solverforge_deliveries/static/app/ui/modals.mjs +0 -63
  62. solverforge-0.6.0/examples/solverforge_deliveries/static/app/ui/overview.mjs +0 -172
  63. solverforge-0.6.0/examples/solverforge_deliveries/static/app.css +0 -196
  64. solverforge-0.6.0/examples/solverforge_deliveries/static/app.js +0 -3
  65. solverforge-0.6.0/examples/solverforge_deliveries/static/generated/ui-model.json +0 -25
  66. solverforge-0.6.0/examples/solverforge_deliveries/static/index.html +0 -22
  67. solverforge-0.6.0/examples/solverforge_deliveries/static/sf-config.json +0 -4
  68. solverforge-0.6.0/examples/solverforge_hospital/README.md +0 -86
  69. solverforge-0.6.0/examples/solverforge_hospital/__init__.py +0 -43
  70. solverforge-0.6.0/examples/solverforge_hospital/__main__.py +0 -32
  71. solverforge-0.6.0/examples/solverforge_hospital/solver.toml +0 -38
  72. solverforge-0.6.0/examples/solverforge_hospital/src/__init__.py +0 -41
  73. solverforge-0.6.0/examples/solverforge_hospital/src/api/__init__.py +0 -20
  74. solverforge-0.6.0/examples/solverforge_hospital/src/api/dto.py +0 -299
  75. solverforge-0.6.0/examples/solverforge_hospital/src/api/mod.py +0 -20
  76. solverforge-0.6.0/examples/solverforge_hospital/src/api/routes.py +0 -193
  77. solverforge-0.6.0/examples/solverforge_hospital/src/api/sse.py +0 -42
  78. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/__init__.py +0 -3
  79. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/assigned_shift.py +0 -14
  80. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/balance_assignments.py +0 -20
  81. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/desired_day.py +0 -24
  82. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/minimum_rest.py +0 -33
  83. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/mod.py +0 -42
  84. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/one_shift_per_day.py +0 -16
  85. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/overlapping_shift.py +0 -28
  86. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/required_skill.py +0 -20
  87. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/unavailable_employee.py +0 -32
  88. solverforge-0.6.0/examples/solverforge_hospital/src/constraints/undesired_day.py +0 -24
  89. solverforge-0.6.0/examples/solverforge_hospital/src/data/__init__.py +0 -23
  90. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/LARGE.json +0 -1
  91. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/__init__.py +0 -13
  92. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/availability.py +0 -16
  93. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/cohorts.py +0 -14
  94. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/coverage.py +0 -14
  95. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/demand.py +0 -9
  96. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/employees.py +0 -18
  97. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/entrypoints.py +0 -32
  98. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/large.py +0 -16
  99. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/preferences.py +0 -17
  100. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/shifts.py +0 -20
  101. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/skills.py +0 -15
  102. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/time_utils.py +0 -5
  103. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/validation.py +0 -12
  104. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/vocabulary.py +0 -10
  105. solverforge-0.6.0/examples/solverforge_hospital/src/data/data_seed/witness.py +0 -10
  106. solverforge-0.6.0/examples/solverforge_hospital/src/data/mod.py +0 -3
  107. solverforge-0.6.0/examples/solverforge_hospital/src/domain/__init__.py +0 -59
  108. solverforge-0.6.0/examples/solverforge_hospital/src/domain/care_hub.py +0 -63
  109. solverforge-0.6.0/examples/solverforge_hospital/src/domain/employee.py +0 -32
  110. solverforge-0.6.0/examples/solverforge_hospital/src/domain/mod.py +0 -19
  111. solverforge-0.6.0/examples/solverforge_hospital/src/domain/plan.py +0 -301
  112. solverforge-0.6.0/examples/solverforge_hospital/src/lib.py +0 -56
  113. solverforge-0.6.0/examples/solverforge_hospital/src/main.py +0 -22
  114. solverforge-0.6.0/examples/solverforge_hospital/src/solver/__init__.py +0 -8
  115. solverforge-0.6.0/examples/solverforge_hospital/src/solver/mod.py +0 -8
  116. solverforge-0.6.0/examples/solverforge_hospital/src/solver/service/__init__.py +0 -202
  117. solverforge-0.6.0/examples/solverforge_hospital/src/solver/service/mod.py +0 -8
  118. solverforge-0.6.0/examples/solverforge_hospital/src/solver/service/payload.py +0 -86
  119. solverforge-0.6.0/examples/solverforge_hospital/static/app/main.mjs +0 -130
  120. solverforge-0.6.0/examples/solverforge_hospital/static/app/schedule/analysis-modal.mjs +0 -79
  121. solverforge-0.6.0/examples/solverforge_hospital/static/app/schedule/datetime.mjs +0 -60
  122. solverforge-0.6.0/examples/solverforge_hospital/static/app/schedule/employee-view.mjs +0 -95
  123. solverforge-0.6.0/examples/solverforge_hospital/static/app/schedule/grouping.mjs +0 -77
  124. solverforge-0.6.0/examples/solverforge_hospital/static/app/schedule/identity.mjs +0 -33
  125. solverforge-0.6.0/examples/solverforge_hospital/static/app/schedule/location-view.mjs +0 -42
  126. solverforge-0.6.0/examples/solverforge_hospital/static/app/schedule/presentation.mjs +0 -116
  127. solverforge-0.6.0/examples/solverforge_hospital/static/app/schedule/rail-renderer.mjs +0 -154
  128. solverforge-0.6.0/examples/solverforge_hospital/static/app/shell/api-guide.mjs +0 -104
  129. solverforge-0.6.0/examples/solverforge_hospital/static/app/shell/app-shell.mjs +0 -103
  130. solverforge-0.6.0/examples/solverforge_hospital/static/app/shell/app-state.mjs +0 -7
  131. solverforge-0.6.0/examples/solverforge_hospital/static/app/shell/config-loader.mjs +0 -63
  132. solverforge-0.6.0/examples/solverforge_hospital/static/app/shell/data-panel.mjs +0 -22
  133. solverforge-0.6.0/examples/solverforge_hospital/static/app/shell/solver-controller.mjs +0 -134
  134. solverforge-0.6.0/examples/solverforge_hospital/static/app/views/registry.mjs +0 -10
  135. solverforge-0.6.0/examples/solverforge_hospital/static/generated/ui-model.json +0 -41
  136. solverforge-0.6.0/examples/solverforge_hospital/static/index.html +0 -23
  137. solverforge-0.6.0/examples/solverforge_hospital/static/sf-config.json +0 -5
  138. solverforge-0.6.0/examples/vrp_owner_hooks.py +0 -21
  139. solverforge-0.6.0/scripts/verify_release_artifacts.py +0 -211
  140. solverforge-0.6.0/scripts/verify_solverforge_release_base.py +0 -109
  141. solverforge-0.6.0/tests/python/test_candidate_trace_provenance.py +0 -174
  142. solverforge-0.6.0/tests/python/test_config.py +0 -225
  143. solverforge-0.6.0/tests/python/test_constraints.py +0 -1440
  144. solverforge-0.6.0/tests/python/test_decorators.py +0 -606
  145. solverforge-0.6.0/tests/python/test_deliveries_example.py +0 -380
  146. solverforge-0.6.0/tests/python/test_deliveries_frontend_app.py +0 -289
  147. solverforge-0.6.0/tests/python/test_examples_import_surface.py +0 -63
  148. solverforge-0.6.0/tests/python/test_examples_playwright.py +0 -296
  149. solverforge-0.6.0/tests/python/test_hospital_example.py +0 -199
  150. solverforge-0.6.0/tests/python/test_hospital_frontend_app.py +0 -400
  151. solverforge-0.6.0/tests/python/test_list_solving.py +0 -2089
  152. solverforge-0.6.0/tests/python/test_manager.py +0 -372
  153. solverforge-0.6.0/tests/python/test_mixed_solving.py +0 -8
  154. solverforge-0.6.0/tests/python/test_release_metadata.py +0 -195
  155. solverforge-0.6.0/tests/python/test_scalar_solving.py +0 -3275
  156. solverforge-0.6.0/tests/python/test_threading.py +0 -11
  157. solverforge-0.6.0/tests/python/test_tracebacks.py +0 -185
  158. solverforge-0.6.0/tests/python/test_ui_assets.py +0 -125
  159. solverforge-0.6.0/tests/rust/constraint_set.rs +0 -45
  160. solverforge-0.6.0/tests/rust/descriptor.rs +0 -85
  161. solverforge-0.6.0/tests/rust/manager.rs +0 -6
  162. solverforge-0.6.0/tests/rust/runtime_slots.rs +0 -226
  163. solverforge-0.6.0/tests/rust/score.rs +0 -8
  164. solverforge-0.6.0/tests/rust/state_clone.rs +0 -306
  165. solverforge-0.6.0/tests/rust.rs +0 -16
  166. {solverforge-0.6.0 → solverforge-0.6.1}/LICENSE +0 -0
  167. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/_native.pyi +0 -0
  168. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/config.py +0 -0
  169. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/console.py +0 -0
  170. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/constraints.py +0 -0
  171. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/decorators.py +0 -0
  172. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/errors.py +0 -0
  173. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/events.py +0 -0
  174. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/fields.py +0 -0
  175. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/groups.py +0 -0
  176. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/joiner.py +0 -0
  177. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/manager.py +0 -0
  178. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/model.py +0 -0
  179. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/py.typed +0 -0
  180. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/score.py +0 -0
  181. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/solver.py +0 -0
  182. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/typing.py +0 -0
  183. {solverforge-0.6.0 → solverforge-0.6.1}/python/solverforge/ui.py +0 -0
  184. {solverforge-0.6.0 → solverforge-0.6.1}/rust-toolchain.toml +0 -0
  185. {solverforge-0.6.0 → solverforge-0.6.1}/src/bindings.rs +0 -0
  186. {solverforge-0.6.0 → solverforge-0.6.1}/src/callbacks/call.rs +0 -0
  187. {solverforge-0.6.0 → solverforge-0.6.1}/src/callbacks/mod.rs +0 -0
  188. {solverforge-0.6.0 → solverforge-0.6.1}/src/callbacks/registry.rs +0 -0
  189. {solverforge-0.6.0 → solverforge-0.6.1}/src/callbacks/threading.rs +0 -0
  190. {solverforge-0.6.0 → solverforge-0.6.1}/src/config.rs +0 -0
  191. {solverforge-0.6.0 → solverforge-0.6.1}/src/constraints/compiled.rs +0 -0
  192. {solverforge-0.6.0 → solverforge-0.6.1}/src/constraints/evaluate.rs +0 -0
  193. {solverforge-0.6.0 → solverforge-0.6.1}/src/constraints/incremental.rs +0 -0
  194. {solverforge-0.6.0 → solverforge-0.6.1}/src/constraints/list_precedence.rs +0 -0
  195. {solverforge-0.6.0 → solverforge-0.6.1}/src/constraints/matches.rs +0 -0
  196. {solverforge-0.6.0 → solverforge-0.6.1}/src/constraints/mod.rs +0 -0
  197. {solverforge-0.6.0 → solverforge-0.6.1}/src/constraints/state.rs +0 -0
  198. {solverforge-0.6.0 → solverforge-0.6.1}/src/constraints/stream_plan.rs +0 -0
  199. {solverforge-0.6.0 → solverforge-0.6.1}/src/descriptor/extractor.rs +0 -0
  200. {solverforge-0.6.0 → solverforge-0.6.1}/src/descriptor/mod.rs +0 -0
  201. {solverforge-0.6.0 → solverforge-0.6.1}/src/descriptor/variable.rs +0 -0
  202. {solverforge-0.6.0 → solverforge-0.6.1}/src/error.rs +0 -0
  203. {solverforge-0.6.0 → solverforge-0.6.1}/src/intern.rs +0 -0
  204. {solverforge-0.6.0 → solverforge-0.6.1}/src/lib.rs +0 -0
  205. {solverforge-0.6.0 → solverforge-0.6.1}/src/manager/candidate_trace.rs +0 -0
  206. {solverforge-0.6.0 → solverforge-0.6.1}/src/manager/events.rs +0 -0
  207. {solverforge-0.6.0 → solverforge-0.6.1}/src/manager/jobs.rs +0 -0
  208. {solverforge-0.6.0 → solverforge-0.6.1}/src/manager/mod.rs +0 -0
  209. {solverforge-0.6.0 → solverforge-0.6.1}/src/manager/provenance.rs +0 -0
  210. {solverforge-0.6.0 → solverforge-0.6.1}/src/proxy/entity.rs +0 -0
  211. {solverforge-0.6.0 → solverforge-0.6.1}/src/proxy/list.rs +0 -0
  212. {solverforge-0.6.0 → solverforge-0.6.1}/src/proxy/mod.rs +0 -0
  213. {solverforge-0.6.0 → solverforge-0.6.1}/src/proxy/solution.rs +0 -0
  214. {solverforge-0.6.0 → solverforge-0.6.1}/src/runtime/candidate_metric.rs +0 -0
  215. {solverforge-0.6.0 → solverforge-0.6.1}/src/runtime/dynamic_assignment_group.rs +0 -0
  216. {solverforge-0.6.0 → solverforge-0.6.1}/src/runtime/dynamic_provider.rs +0 -0
  217. {solverforge-0.6.0 → solverforge-0.6.1}/src/runtime/list_slots.rs +0 -0
  218. {solverforge-0.6.0 → solverforge-0.6.1}/src/runtime/mod.rs +0 -0
  219. {solverforge-0.6.0 → solverforge-0.6.1}/src/runtime/scalar_slots.rs +0 -0
  220. {solverforge-0.6.0 → solverforge-0.6.1}/src/schema/build.rs +0 -0
  221. {solverforge-0.6.0 → solverforge-0.6.1}/src/schema/compiled.rs +0 -0
  222. {solverforge-0.6.0 → solverforge-0.6.1}/src/schema/mod.rs +0 -0
  223. {solverforge-0.6.0 → solverforge-0.6.1}/src/schema/parse.rs +0 -0
  224. {solverforge-0.6.0 → solverforge-0.6.1}/src/schema/python.rs +0 -0
  225. {solverforge-0.6.0 → solverforge-0.6.1}/src/schema/runtime_plan.rs +0 -0
  226. {solverforge-0.6.0 → solverforge-0.6.1}/src/schema/types.rs +0 -0
  227. {solverforge-0.6.0 → solverforge-0.6.1}/src/schema/validate.rs +0 -0
  228. {solverforge-0.6.0 → solverforge-0.6.1}/src/score.rs +0 -0
  229. {solverforge-0.6.0 → solverforge-0.6.1}/src/solver/api.rs +0 -0
  230. {solverforge-0.6.0 → solverforge-0.6.1}/src/solver/console.rs +0 -0
  231. {solverforge-0.6.0 → solverforge-0.6.1}/src/solver/mod.rs +0 -0
  232. {solverforge-0.6.0 → solverforge-0.6.1}/src/solver/progress.rs +0 -0
  233. {solverforge-0.6.0 → solverforge-0.6.1}/src/solver/result.rs +0 -0
  234. {solverforge-0.6.0 → solverforge-0.6.1}/src/solver/solvable.rs +0 -0
  235. {solverforge-0.6.0 → solverforge-0.6.1}/src/state/callback_view.rs +0 -0
  236. {solverforge-0.6.0 → solverforge-0.6.1}/src/state/clone.rs +0 -0
  237. {solverforge-0.6.0 → solverforge-0.6.1}/src/state/entity_table.rs +0 -0
  238. {solverforge-0.6.0 → solverforge-0.6.1}/src/state/marshal.rs +0 -0
  239. {solverforge-0.6.0 → solverforge-0.6.1}/src/state/mod.rs +0 -0
  240. {solverforge-0.6.0 → solverforge-0.6.1}/src/state/solution.rs +0 -0
  241. {solverforge-0.6.0 → solverforge-0.6.1}/src/state/variables.rs +0 -0
  242. {solverforge-0.6.0 → solverforge-0.6.1}/src/ui.rs +0 -0
  243. {solverforge-0.6.0 → solverforge-0.6.1}/src/value.rs +0 -0
@@ -691,7 +691,7 @@ dependencies = [
691
691
 
692
692
  [[package]]
693
693
  name = "solverforge_py"
694
- version = "0.6.0"
694
+ version = "0.6.1"
695
695
  dependencies = [
696
696
  "indexmap",
697
697
  "once_cell",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "solverforge_py"
3
- version = "0.6.0"
3
+ version = "0.6.1"
4
4
  edition = "2021"
5
5
  license = "Apache-2.0"
6
6
  rust-version = "1.95"
@@ -9,6 +9,17 @@ readme = "README.md"
9
9
  repository = "https://github.com/SolverForge/solverforge-py"
10
10
  homepage = "https://solverforge.org"
11
11
  documentation = "https://docs.solverforge.org"
12
+ include = [
13
+ "/Cargo.lock",
14
+ "/LICENSE",
15
+ "/README.md",
16
+ "/pyproject.toml",
17
+ "/python/solverforge/*.py",
18
+ "/python/solverforge/*.pyi",
19
+ "/python/solverforge/py.typed",
20
+ "/rust-toolchain.toml",
21
+ "/src/**",
22
+ ]
12
23
 
13
24
  [lib]
14
25
  name = "solverforge_py"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: solverforge
3
- Version: 0.6.0
3
+ Version: 0.6.1
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Intended Audience :: Science/Research
@@ -50,11 +50,11 @@ Java service requirements, and other APIs that are not part of this package.
50
50
 
51
51
  ## Installation
52
52
 
53
- Install the `solverforge` `0.6.0` release, built on the exact published and
53
+ Install the `solverforge` `0.6.1` release, built on the exact published and
54
54
  locked SolverForge Rust `0.18.0` registry dependency base:
55
55
 
56
56
  ```sh
57
- python3.14 -m pip install "solverforge==0.6.0"
57
+ python3.14 -m pip install "solverforge==0.6.1"
58
58
  ```
59
59
 
60
60
  The installable wheel contains the core `solverforge` package, native extension,
@@ -79,7 +79,7 @@ without `PYTHONPATH` or an editable checkout:
79
79
  ```sh
80
80
  python3.14 -m venv .venv-examples
81
81
  . .venv-examples/bin/activate
82
- python -m pip install "solverforge[examples]==0.6.0"
82
+ python -m pip install "solverforge[examples]==0.6.1"
83
83
  python examples/nqueens.py
84
84
  python -m examples.solverforge_hospital
85
85
  python -m examples.solverforge_deliveries
@@ -402,13 +402,6 @@ solution state, safe to run concurrently, and treat solution-level lookup contex
402
402
  as immutable for the duration of a solve. Third-party Python extension modules
403
403
  used inside callbacks may still impose their own synchronization constraints.
404
404
 
405
- ## Release
406
-
407
- The current package and crate version is `0.6.0`, built on the published
408
- SolverForge `0.18.0` crates and `solverforge-ui` `0.7.0`. `Cargo.lock` resolves
409
- those exact crates from crates.io. Maintainers run `make pre-release` to verify
410
- the dependency base, local CI, distribution metadata, and artifact contents.
411
-
412
405
  ## License
413
406
 
414
407
  SolverForge Python is licensed under the Apache License, Version 2.0. See
@@ -19,11 +19,11 @@ Java service requirements, and other APIs that are not part of this package.
19
19
 
20
20
  ## Installation
21
21
 
22
- Install the `solverforge` `0.6.0` release, built on the exact published and
22
+ Install the `solverforge` `0.6.1` release, built on the exact published and
23
23
  locked SolverForge Rust `0.18.0` registry dependency base:
24
24
 
25
25
  ```sh
26
- python3.14 -m pip install "solverforge==0.6.0"
26
+ python3.14 -m pip install "solverforge==0.6.1"
27
27
  ```
28
28
 
29
29
  The installable wheel contains the core `solverforge` package, native extension,
@@ -48,7 +48,7 @@ without `PYTHONPATH` or an editable checkout:
48
48
  ```sh
49
49
  python3.14 -m venv .venv-examples
50
50
  . .venv-examples/bin/activate
51
- python -m pip install "solverforge[examples]==0.6.0"
51
+ python -m pip install "solverforge[examples]==0.6.1"
52
52
  python examples/nqueens.py
53
53
  python -m examples.solverforge_hospital
54
54
  python -m examples.solverforge_deliveries
@@ -371,13 +371,6 @@ solution state, safe to run concurrently, and treat solution-level lookup contex
371
371
  as immutable for the duration of a solve. Third-party Python extension modules
372
372
  used inside callbacks may still impose their own synchronization constraints.
373
373
 
374
- ## Release
375
-
376
- The current package and crate version is `0.6.0`, built on the published
377
- SolverForge `0.18.0` crates and `solverforge-ui` `0.7.0`. `Cargo.lock` resolves
378
- those exact crates from crates.io. Maintainers run `make pre-release` to verify
379
- the dependency base, local CI, distribution metadata, and artifact contents.
380
-
381
374
  ## License
382
375
 
383
376
  SolverForge Python is licensed under the Apache License, Version 2.0. See
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "solverforge"
7
- version = "0.6.0"
7
+ version = "0.6.1"
8
8
  description = "Dynamic Python bindings for the SolverForge constraint solver."
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
@@ -40,7 +40,7 @@ from .manager import JobHandle, SolverManager
40
40
  from .score import HardMediumSoftScore, HardSoftDecimalScore, HardSoftScore, SoftScore
41
41
  from .solver import Solver
42
42
 
43
- __version__ = "0.6.0"
43
+ __version__ = "0.6.1"
44
44
 
45
45
  __all__ = [
46
46
  "CallbackError",
@@ -1,69 +0,0 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- branches: [main]
6
- pull_request:
7
-
8
- permissions:
9
- contents: read
10
-
11
- env:
12
- PYTHON_VERSION: "3.14"
13
- RUST_VERSION: "1.95.0"
14
-
15
- jobs:
16
- ci-local:
17
- name: local CI gate
18
- runs-on: ${{ github.server_url == 'https://github.com' && 'ubuntu-latest' || 'rust' }}
19
- steps:
20
- - name: Checkout solverforge-py
21
- uses: actions/checkout@v6
22
-
23
- - name: Set up Python
24
- shell: bash
25
- run: |
26
- curl --retry 5 --retry-all-errors --retry-delay 5 \
27
- -LsSf https://astral.sh/uv/install.sh | sh
28
- echo "${HOME}/.local/bin" >> "${GITHUB_PATH}"
29
- "${HOME}/.local/bin/uv" python install "${PYTHON_VERSION}"
30
- host_python="$("${HOME}/.local/bin/uv" python find "${PYTHON_VERSION}")"
31
- host_python_dir="$(dirname "${host_python}")"
32
- host_python_libdir="$("${host_python}" -c 'import sysconfig; print(sysconfig.get_config_var("LIBDIR") or "")')"
33
- echo "${host_python_dir}" >> "${GITHUB_PATH}"
34
- echo "HOST_PYTHON=${host_python}" >> "${GITHUB_ENV}"
35
- echo "PYO3_PYTHON=${host_python}" >> "${GITHUB_ENV}"
36
- echo "PYTHON_SYS_EXECUTABLE=${host_python}" >> "${GITHUB_ENV}"
37
- echo "LIBRARY_PATH=${host_python_libdir}:${LIBRARY_PATH:-}" >> "${GITHUB_ENV}"
38
- echo "LD_LIBRARY_PATH=${host_python_libdir}:${LD_LIBRARY_PATH:-}" >> "${GITHUB_ENV}"
39
- "${host_python}" --version
40
-
41
- - name: Set up Rust
42
- shell: bash
43
- run: |
44
- curl --retry 5 --retry-all-errors --retry-delay 5 \
45
- --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
46
- | sh -s -- -y --profile minimal --default-toolchain "${RUST_VERSION}" \
47
- --component rustfmt --component clippy
48
- if [ -f "${HOME}/.cargo/env" ]; then
49
- . "${HOME}/.cargo/env"
50
- echo "${HOME}/.cargo/bin" >> "${GITHUB_PATH}"
51
- else
52
- . /usr/local/cargo/env
53
- echo "/usr/local/cargo/bin" >> "${GITHUB_PATH}"
54
- fi
55
- rustc --version
56
- cargo --version
57
-
58
- - name: Validate SolverForge release base
59
- run: make release-base-check
60
-
61
- - name: Install Playwright system dependencies
62
- if: ${{ runner.os == 'Linux' }}
63
- run: make install-playwright-system-deps
64
-
65
- - name: Run local CI
66
- run: make ci-local
67
-
68
- - name: Build and verify local distributions
69
- run: make build-dist dist-check smoke-wheel
@@ -1,212 +0,0 @@
1
- name: Release
2
-
3
- on:
4
- workflow_dispatch: {}
5
- push:
6
- tags:
7
- - "v*.*.*"
8
-
9
- permissions:
10
- contents: read
11
-
12
- env:
13
- PYTHON_VERSION: "3.14"
14
- RUST_VERSION: "1.95.0"
15
-
16
- jobs:
17
- forgejo-release-guard:
18
- name: Forgejo release guard
19
- if: github.server_url != 'https://github.com'
20
- runs-on: rust
21
- steps:
22
- - name: Skip publish-only release workflow
23
- run: echo "Release publishing runs only on GitHub; Forgejo tag CI is intentionally a no-op."
24
-
25
- sdist:
26
- name: source distribution
27
- if: github.server_url == 'https://github.com'
28
- runs-on: ${{ github.server_url == 'https://github.com' && 'ubuntu-latest' || 'rust' }}
29
- steps:
30
- - name: Checkout solverforge-py
31
- uses: actions/checkout@v6
32
- with:
33
- path: solverforge-py
34
-
35
- - name: Set up Python
36
- uses: actions/setup-python@v6
37
- with:
38
- python-version: ${{ env.PYTHON_VERSION }}
39
-
40
- - name: Set up Rust
41
- uses: dtolnay/rust-toolchain@stable
42
- with:
43
- toolchain: ${{ env.RUST_VERSION }}
44
- components: rustfmt, clippy
45
-
46
- - name: Build sdist
47
- working-directory: solverforge-py
48
- run: make build-sdist
49
-
50
- - name: Upload sdist
51
- uses: actions/upload-artifact@v7
52
- with:
53
- name: sdist
54
- path: solverforge-py/dist/*.tar.gz
55
-
56
- wheels:
57
- name: wheel ${{ matrix.os }} ${{ matrix.target }}
58
- if: github.server_url == 'https://github.com'
59
- runs-on: ${{ github.server_url == 'https://github.com' && matrix.os || 'rust' }}
60
- strategy:
61
- fail-fast: false
62
- matrix:
63
- include:
64
- - os: ubuntu-latest
65
- target: x86_64
66
- manylinux: "2014"
67
- interpreter: python3.14
68
- - os: macos-14
69
- target: aarch64
70
- manylinux: ""
71
- interpreter: python3.14
72
- - os: windows-latest
73
- target: x64
74
- manylinux: ""
75
- interpreter: python
76
- steps:
77
- - name: Checkout solverforge-py
78
- uses: actions/checkout@v6
79
- with:
80
- path: solverforge-py
81
-
82
- - name: Set up Python
83
- uses: actions/setup-python@v6
84
- with:
85
- python-version: ${{ env.PYTHON_VERSION }}
86
-
87
- - name: Build wheels
88
- uses: PyO3/maturin-action@v1
89
- with:
90
- command: build
91
- args: --release --locked --strip --compatibility pypi -i ${{ matrix.interpreter }} --out dist
92
- manylinux: ${{ matrix.manylinux }}
93
- target: ${{ matrix.target }}
94
- rust-toolchain: ${{ env.RUST_VERSION }}
95
- working-directory: solverforge-py
96
-
97
- - name: Upload wheels
98
- uses: actions/upload-artifact@v7
99
- with:
100
- name: wheels-${{ matrix.os }}-${{ matrix.target }}
101
- path: solverforge-py/dist/*.whl
102
-
103
- verify:
104
- name: verify artifacts
105
- if: github.server_url == 'https://github.com'
106
- runs-on: ${{ github.server_url == 'https://github.com' && 'ubuntu-latest' || 'rust' }}
107
- needs: [sdist, wheels]
108
- steps:
109
- - name: Checkout solverforge-py
110
- uses: actions/checkout@v6
111
-
112
- - name: Set up Python
113
- uses: actions/setup-python@v6
114
- with:
115
- python-version: ${{ env.PYTHON_VERSION }}
116
-
117
- - name: Download artifacts
118
- uses: actions/download-artifact@v8
119
- with:
120
- path: artifact-download
121
-
122
- - name: Collect distributions
123
- run: |
124
- mkdir dist
125
- find artifact-download -type f \( -name '*.whl' -o -name '*.tar.gz' \) -exec cp '{}' dist/ \;
126
-
127
- - name: Install release tools
128
- run: python -m pip install --disable-pip-version-check twine
129
-
130
- - name: Check metadata
131
- run: |
132
- python -m twine check dist/*
133
- python scripts/verify_release_artifacts.py --dist dist
134
-
135
- - name: Upload verified distributions
136
- uses: actions/upload-artifact@v7
137
- with:
138
- name: release-dist
139
- path: dist/*
140
-
141
- publish-testpypi:
142
- name: publish to TestPyPI
143
- runs-on: ${{ github.server_url == 'https://github.com' && 'ubuntu-latest' || 'rust' }}
144
- needs: verify
145
- if: >-
146
- always() &&
147
- needs.verify.result == 'success' &&
148
- github.server_url == 'https://github.com' &&
149
- github.event_name == 'workflow_dispatch'
150
- environment: testpypi
151
- permissions:
152
- contents: read
153
- steps:
154
- - name: Download verified distributions
155
- uses: actions/download-artifact@v8
156
- with:
157
- name: release-dist
158
- path: dist
159
-
160
- - name: Publish to TestPyPI
161
- uses: pypa/gh-action-pypi-publish@release/v1
162
- with:
163
- repository-url: https://test.pypi.org/legacy/
164
- password: ${{ secrets.TEST_PYPI_API_TOKEN }}
165
-
166
- publish-pypi:
167
- name: publish to PyPI
168
- runs-on: ${{ github.server_url == 'https://github.com' && 'ubuntu-latest' || 'rust' }}
169
- needs: verify
170
- if: >-
171
- always() &&
172
- needs.verify.result == 'success' &&
173
- github.server_url == 'https://github.com' &&
174
- github.event_name == 'push' &&
175
- startsWith(github.ref, 'refs/tags/v')
176
- environment: pypi
177
- permissions:
178
- contents: read
179
- steps:
180
- - name: Checkout solverforge-py
181
- uses: actions/checkout@v6
182
-
183
- - name: Set up Python
184
- uses: actions/setup-python@v6
185
- with:
186
- python-version: ${{ env.PYTHON_VERSION }}
187
-
188
- - name: Validate tag version
189
- run: |
190
- python - <<'PY'
191
- import os
192
- import tomllib
193
-
194
- with open("pyproject.toml", "rb") as handle:
195
- version = tomllib.load(handle)["project"]["version"]
196
-
197
- expected = f"v{version}"
198
- actual = os.environ["GITHUB_REF_NAME"]
199
- if actual != expected:
200
- raise SystemExit(f"tag {actual} does not match package version {expected}")
201
- PY
202
-
203
- - name: Download verified distributions
204
- uses: actions/download-artifact@v8
205
- with:
206
- name: release-dist
207
- path: dist
208
-
209
- - name: Publish to PyPI
210
- uses: pypa/gh-action-pypi-publish@release/v1
211
- with:
212
- password: ${{ secrets.PYPI_API_TOKEN }}
@@ -1,11 +0,0 @@
1
- /target/
2
- /.venv/
3
- /.mypy_cache/
4
- /.pytest_cache/
5
- /.ruff_cache/
6
- /dist/
7
- /wheelhouse/
8
- *.egg-info/
9
- __pycache__/
10
- *.py[cod]
11
- python/solverforge/_native*.so
@@ -1,31 +0,0 @@
1
- repos:
2
- - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: v4.5.0
4
- hooks:
5
- - id: check-yaml
6
- - id: end-of-file-fixer
7
- - id: trailing-whitespace
8
- - id: check-merge-conflict
9
- - id: check-added-large-files
10
-
11
- - repo: https://github.com/gitleaks/gitleaks
12
- rev: v8.18.0
13
- hooks:
14
- - id: gitleaks
15
- - repo: https://github.com/psf/black
16
- rev: 26.5.1
17
- hooks:
18
- - id: black
19
-
20
- - repo: https://github.com/astral-sh/ruff-pre-commit
21
- rev: v0.15.14
22
- hooks:
23
- - id: ruff
24
- args: [--fix, --exit-non-zero-on-fix]
25
- - repo: https://github.com/doublify/pre-commit-rust
26
- rev: v1.0
27
- hooks:
28
- - id: fmt
29
- args: ["--", "--check"]
30
- - id: clippy
31
- args: ["--", "-D", "warnings"]
@@ -1 +0,0 @@
1
- 3.14t
@@ -1,153 +0,0 @@
1
- # Repository Guidelines
2
-
3
- ## Project Structure & Module Organization
4
-
5
- `solverforge-py` is a mixed Python/Rust binding package built with PyO3 and
6
- maturin. Python package code lives under `python/solverforge/`; the native
7
- extension, dynamic runtime bridge, callbacks, manager, and schema code live under
8
- `src/`. Python tests are in `tests/python/`, Rust tests are in `tests/rust/`, and
9
- examples are in `examples/`. The hospital and deliveries demos own their
10
- FastAPI apps, app-specific static UI, generated UI models, and seed data under
11
- `examples/solverforge_hospital/` and `examples/solverforge_deliveries/`;
12
- shared `/sf/*` assets are served from the pinned `solverforge-ui` crate through
13
- the native binding.
14
- `WIREFRAME.md` is the as-built API/UI map; `README.md` carries installation,
15
- callback/threading, boundary, and release contracts. There is no separate
16
- `docs/` directory.
17
-
18
- ## Build, Test, and Development Commands
19
-
20
- - `make develop`: create `.venv`, install tools, and install the release native extension.
21
- - `make install-playwright-system-deps`: install Chromium plus Linux shared
22
- libraries required by Playwright browser tests in lean CI images.
23
- - `make test`: run Rust tests with the local Python link setup, then pytest.
24
- - `make test-quick`: run fast Python regressions without the example app tests.
25
- - `make test-hospital`: run the hospital model, FastAPI/frontend lifecycle, and
26
- hospital Playwright browser test.
27
- - `make test-deliveries`: run the deliveries model, FastAPI/frontend lifecycle,
28
- and deliveries Playwright browser test.
29
- - `make test-examples-browser`: run the Playwright browser tests for both example apps.
30
- - `make lint`: run rustfmt check, ruff, strict mypy, and clippy with warnings denied.
31
- - `make docs-check`: verify the tracked README, AGENTS, WIREFRAME, and example
32
- README surface exists and avoids known stale claims.
33
- - `make release-base-check`: verify the exact crates.io SolverForge dependency
34
- base in `Cargo.toml` and `Cargo.lock`.
35
- - `make ci-local` or `make audit`: run the local CI simulation.
36
- - `make pre-release`: run `release-base-check`, `ci-local`, release
37
- distribution build/checks, and clean-wheel smoke test.
38
- - `make hospital-run`: serve the hospital app on `APP_HOST=127.0.0.1 PORT=7860`.
39
- - `make deliveries-run`: serve the deliveries app on `APP_HOST=127.0.0.1 PORT=7860`
40
- unless `PORT` is overridden.
41
-
42
- Use Rust `1.95.0` from `rust-toolchain.toml`. Python code targets Python `3.14`.
43
-
44
- ## Coding Style & Naming Conventions
45
-
46
- Python uses Ruff linting, strict mypy, and the 100-character line limit from
47
- `pyproject.toml`; `make py-format` is available for an intentional Black pass.
48
- Prefer typed public APIs and keep exports in `python/solverforge/__init__.py`
49
- intentional. Use snake_case for Python modules, functions, and variables; use
50
- PascalCase for classes. Rust follows rustfmt and clippy with `-D warnings`; keep
51
- module names snake_case and public types descriptive.
52
-
53
- ## Testing Guidelines
54
-
55
- Add Python regression tests as `tests/python/test_*.py`. Add Rust integration or
56
- unit coverage under `tests/rust/` or the relevant `src/` module. For binding
57
- changes, prefer tests that prove Python behavior through the public `solverforge`
58
- API, then add Rust tests only where native runtime behavior is directly changed.
59
- Run the narrow suite first, then `make ci-local` for cross-language or
60
- integration changes. Use `make test-hospital` or `make test-deliveries` when
61
- touching either example app. Binding changes should normally prove behavior
62
- through the public Python API and add Rust coverage only when native runtime
63
- behavior changes directly.
64
-
65
- ## Runtime & Callback Contracts
66
-
67
- Python owns model authoring: classes, decorators, functions, lambdas, and
68
- callbacks. `solverforge-py` owns the Python API, PyO3 binding code, Rust-owned
69
- dynamic model state, callback invocation, marshaling, packaging, and example
70
- apps. Upstream SolverForge owns the solver engine, phases, selectors, move
71
- machinery, termination, telemetry, retained lifecycle, descriptors, and public
72
- bridge seams. This checkout consumes public upstream crates through exact
73
- registry pins in `Cargo.toml` and `Cargo.lock`; do not add private upstream
74
- module dependencies or local path overrides for release work.
75
-
76
- One compiled schema owns one immutable runtime plan: parsed schema, descriptor,
77
- upstream `RuntimeModel`, assignment bindings, constraints, and candidate metrics.
78
- Direct solves, retained jobs, snapshots, clones, and resumes must use that same
79
- plan; do not recreate wrapper-local phases, selector trees, move types, TLS slot
80
- state, or fallback construction paths. Schema caching is allowed only for
81
- structurally stable, capture-free callback state; stateful callbacks compile per
82
- invocation.
83
-
84
- Python callbacks are the only constraint authoring surface. Callback exceptions
85
- must preserve actionable Python tracebacks. Callback solution views must expose
86
- ordinary solution-level lookup context while projecting entity/fact collections
87
- from Rust-owned state. Callback code may be called many times and from multiple
88
- worker threads on CPython 3.14 free-threaded, so treat solution-level lookup
89
- context as immutable during a solve.
90
-
91
- `@candidate_metric` callbacks are the Python surface for named sorted or
92
- probabilistic selector metrics. Register them through
93
- `@planning_solution(..., candidate_metrics=[...])`; they receive the callback
94
- solution view plus a canonical candidate identity and must return finite numeric
95
- values. `selection_metric` is valid only with `sorted` or `probabilistic`
96
- selection order, and probabilistic weights must be non-negative.
97
-
98
- Ordinary dynamic scalar construction supports `first_fit` and
99
- `cheapest_insertion`. Assignment-group construction also supports the decreasing,
100
- weakest-fit, and strongest-fit scalar variants when their declared `entity_order`
101
- and `value_order` capabilities satisfy the upstream compiler. Dynamic list
102
- construction supports round-robin, cheapest/regret insertion, Clarke-Wright, and
103
- K-opt; route-aware variants require their explicit savings or route metadata.
104
-
105
- Candidate traces are bounded, opt-in retained diagnostics. Keep them out of
106
- synchronous `Solver.solve`, ordinary statuses, and events; expose them only
107
- through the atomic `SolverManager.telemetry_detail` payload. Qualified traces
108
- require an explicit per-job `QualifiedCandidateTraceProvenance` with five
109
- lowercase SHA-256 digests and a non-blank external producer. Never infer those
110
- values from a solution, environment, callback, or file, and never accept
111
- qualified provenance through serializable `SolverConfig`.
112
-
113
- Do not fake unsupported behavior. Top-level `ConstraintFactory.join`,
114
- `group_by`, `if_exists`, `if_not_exists`, and `flattened` remain explicit
115
- unsupported methods until public bridge support exists for those top-level
116
- semantics. Rust-only custom search and partitioner registration cannot be
117
- claimed as Python-bindable without a public upstream seam.
118
-
119
- ## Release Responsibilities
120
-
121
- `pyproject.toml` owns PyPI metadata, version, Python requirement, optional
122
- example dependencies, project URLs, classifiers, and maturin module settings.
123
- `Cargo.toml` owns native crate metadata and the SolverForge Rust dependency
124
- base; the package version must match `pyproject.toml`. `Cargo.lock` locks
125
- reproducible Rust builds. The current release line is package/crate `0.6.0` on
126
- the six SolverForge `0.18.0` registry crates and `solverforge-ui` `0.7.0`;
127
- `make release-base-check` must stay green. The `Makefile` owns local release targets,
128
- dependency-base checks, distribution builds, artifact validation, browser system
129
- dependency setup, and `pre-release`. `.github/workflows/ci.yml` validates source
130
- checkouts on GitHub and Forgejo, installs Playwright system dependencies on
131
- Linux, and retries network toolchain bootstraps for transient runner DNS misses.
132
- `.github/workflows/release.yml` builds sdists/wheels, verifies release
133
- artifacts, publishes to TestPyPI only from manual workflow dispatch, and
134
- publishes to PyPI automatically from a matching `v*.*.*` tag.
135
- `scripts/verify_release_artifacts.py` checks deterministic artifact
136
- metadata/content, and
137
- `tests/python/test_release_metadata.py` guards release metadata drift.
138
-
139
- ## Commit & Pull Request Guidelines
140
-
141
- The history uses concise Conventional Commit-style subjects such as
142
- `fix(runtime): preserve scalar snapshots` or `test(manager): cover retained jobs`.
143
- Pull requests should include the motivation, user-visible behavior, tests run,
144
- and any linked issue. Include screenshots or short recordings for changes under
145
- `examples/solverforge_hospital/static/` or
146
- `examples/solverforge_deliveries/static/`.
147
-
148
- ## Agent-Specific Instructions
149
-
150
- Keep changes scoped to the requested surface. Do not rewrite runtime, callback,
151
- manager, or API payload paths for a simple documentation, UI, naming, or wiring
152
- task unless live evidence proves that path is the failing layer. Verify assumptions
153
- from the repo before changing critical integration code.
@@ -1,61 +0,0 @@
1
- # Changelog
2
-
3
- All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
-
5
- ## [0.6.0](///compare/v0.5.0...v0.6.0) (2026-07-13)
6
-
7
-
8
- ### Features
9
-
10
- * **manager:** retain qualified solve diagnostics c6445ec
11
- * **model:** declare explicit runtime metadata ad41f94
12
-
13
- ## [0.5.0](https://github.com/SolverForge/solverforge-py/compare/v0.4.1...v0.5.0) (2026-07-03)
14
-
15
-
16
- ### Features
17
-
18
- * **examples:** add deliveries Python app 0179084
19
- * **model:** carry dynamic route and shadow hooks 83a8d41
20
- * **runtime:** bind Python list route hooks fd51788
21
- * **runtime:** broaden dynamic Python planning surface f04eefa
22
- * **ui:** embed shared frontend assets ab30697
23
-
24
-
25
- ### Bug Fixes
26
-
27
- * **ci:** bootstrap Forgejo toolchains in workflow 8e5f791
28
- * **ci:** install Playwright system dependencies b249fd1
29
- * **ci:** retry toolchain bootstrap downloads cd60f76
30
- * **ci:** run workflow from checkout root 8733fc3
31
- * **ci:** select Forgejo runner labels 56ff4fc
32
- * **deliveries:** recommend assigned-route insertions d59daea
33
- * **examples:** report snapshot score in payloads 0bfcaa0
34
- * **examples:** report solution scores in events bdcddd8
35
- * **model:** validate scalar group names cfa2070
36
- * **runtime:** align dynamic construction with core semantics 7cacda0
37
- * **runtime:** cap first-fit required construction candidates 3666c20
38
- * **runtime:** resolve dynamic slots against descriptors a2544be
39
- * **runtime:** reuse required assignment construction streams 0caf06d
40
- * **runtime:** use direct cursor for first-fit assignments 769a081
41
- * **scoring:** return true shadow update deltas 88dc500
42
- * **state:** preserve callback root fields 0aacef5
43
-
44
-
45
- ### Tests
46
-
47
- * **examples:** stabilize hospital browser smoke f11efd6
48
- * **examples:** stub map tiles in browser smoke d69ca3e
49
-
50
-
51
- ### Documentation and release
52
-
53
- * **docs:** remove standalone docs surface b1c6e1f
54
- * **release:** cut 0.5.0 metadata 4728014
55
-
56
- ## [0.4.1](https://github.com/SolverForge/solverforge-py/compare/v0.4.0...v0.4.1) (2026-06-02)
57
-
58
-
59
- ### Bug Fixes
60
-
61
- * **deps:** resolve SolverForge crates from crates.io 73bfe4a