solverforge 0.3.0__tar.gz → 0.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. solverforge-0.5.0/.github/workflows/ci.yml +69 -0
  2. solverforge-0.5.0/.github/workflows/release.yml +200 -0
  3. solverforge-0.5.0/.gitignore +11 -0
  4. solverforge-0.5.0/.pre-commit-config.yaml +31 -0
  5. solverforge-0.5.0/.python-version +1 -0
  6. solverforge-0.5.0/AGENTS.md +121 -0
  7. solverforge-0.5.0/CHANGELOG.md +53 -0
  8. solverforge-0.5.0/Cargo.lock +1003 -0
  9. solverforge-0.5.0/Cargo.toml +49 -0
  10. solverforge-0.5.0/LICENSE +201 -0
  11. solverforge-0.5.0/Makefile +408 -0
  12. solverforge-0.5.0/PKG-INFO +336 -0
  13. solverforge-0.5.0/README.md +304 -0
  14. solverforge-0.5.0/WIREFRAME.md +306 -0
  15. solverforge-0.5.0/examples/list_tsp.py +20 -0
  16. solverforge-0.5.0/examples/mixed_job_shop.py +30 -0
  17. solverforge-0.5.0/examples/nqueens.py +36 -0
  18. solverforge-0.5.0/examples/shift_scheduling.py +45 -0
  19. solverforge-0.5.0/examples/solverforge_deliveries/README.md +85 -0
  20. solverforge-0.5.0/examples/solverforge_deliveries/__init__.py +23 -0
  21. solverforge-0.5.0/examples/solverforge_deliveries/__main__.py +32 -0
  22. solverforge-0.5.0/examples/solverforge_deliveries/solver.toml +51 -0
  23. solverforge-0.5.0/examples/solverforge_deliveries/src/__init__.py +1 -0
  24. solverforge-0.5.0/examples/solverforge_deliveries/src/api/__init__.py +1 -0
  25. solverforge-0.5.0/examples/solverforge_deliveries/src/api/dto.py +215 -0
  26. solverforge-0.5.0/examples/solverforge_deliveries/src/api/mod.py +3 -0
  27. solverforge-0.5.0/examples/solverforge_deliveries/src/api/routes.py +239 -0
  28. solverforge-0.5.0/examples/solverforge_deliveries/src/api/sse.py +42 -0
  29. solverforge-0.5.0/examples/solverforge_deliveries/src/constraints/__init__.py +5 -0
  30. solverforge-0.5.0/examples/solverforge_deliveries/src/constraints/mod.py +47 -0
  31. solverforge-0.5.0/examples/solverforge_deliveries/src/data/__init__.py +5 -0
  32. solverforge-0.5.0/examples/solverforge_deliveries/src/data/data_seed/__init__.py +5 -0
  33. solverforge-0.5.0/examples/solverforge_deliveries/src/data/data_seed/entrypoints.py +213 -0
  34. solverforge-0.5.0/examples/solverforge_deliveries/src/data/data_seed/locations.json +1472 -0
  35. solverforge-0.5.0/examples/solverforge_deliveries/src/data/mod.py +1 -0
  36. solverforge-0.5.0/examples/solverforge_deliveries/src/domain/__init__.py +33 -0
  37. solverforge-0.5.0/examples/solverforge_deliveries/src/domain/delivery.py +32 -0
  38. solverforge-0.5.0/examples/solverforge_deliveries/src/domain/metrics.py +404 -0
  39. solverforge-0.5.0/examples/solverforge_deliveries/src/domain/mod.py +1 -0
  40. solverforge-0.5.0/examples/solverforge_deliveries/src/domain/plan.py +84 -0
  41. solverforge-0.5.0/examples/solverforge_deliveries/src/domain/vehicle.py +41 -0
  42. solverforge-0.5.0/examples/solverforge_deliveries/src/lib.py +34 -0
  43. solverforge-0.5.0/examples/solverforge_deliveries/src/main.py +22 -0
  44. solverforge-0.5.0/examples/solverforge_deliveries/src/solver/__init__.py +5 -0
  45. solverforge-0.5.0/examples/solverforge_deliveries/src/solver/mod.py +1 -0
  46. solverforge-0.5.0/examples/solverforge_deliveries/src/solver/service/__init__.py +196 -0
  47. solverforge-0.5.0/examples/solverforge_deliveries/src/solver/service/mod.py +7 -0
  48. solverforge-0.5.0/examples/solverforge_deliveries/src/solver/service/payload.py +86 -0
  49. solverforge-0.5.0/examples/solverforge_deliveries/static/app/main.mjs +287 -0
  50. solverforge-0.5.0/examples/solverforge_deliveries/static/app/models/core.mjs +57 -0
  51. solverforge-0.5.0/examples/solverforge_deliveries/static/app/models/formatters.mjs +53 -0
  52. solverforge-0.5.0/examples/solverforge_deliveries/static/app/models/preview.mjs +154 -0
  53. solverforge-0.5.0/examples/solverforge_deliveries/static/app/models/timeline.mjs +94 -0
  54. solverforge-0.5.0/examples/solverforge_deliveries/static/app/models.mjs +8 -0
  55. solverforge-0.5.0/examples/solverforge_deliveries/static/app/ui/api-guide.mjs +29 -0
  56. solverforge-0.5.0/examples/solverforge_deliveries/static/app/ui/components.mjs +44 -0
  57. solverforge-0.5.0/examples/solverforge_deliveries/static/app/ui/data-tables.mjs +98 -0
  58. solverforge-0.5.0/examples/solverforge_deliveries/static/app/ui/layout.mjs +123 -0
  59. solverforge-0.5.0/examples/solverforge_deliveries/static/app/ui/lifecycle.mjs +23 -0
  60. solverforge-0.5.0/examples/solverforge_deliveries/static/app/ui/modals.mjs +63 -0
  61. solverforge-0.5.0/examples/solverforge_deliveries/static/app/ui/overview.mjs +172 -0
  62. solverforge-0.5.0/examples/solverforge_deliveries/static/app.css +196 -0
  63. solverforge-0.5.0/examples/solverforge_deliveries/static/app.js +3 -0
  64. solverforge-0.5.0/examples/solverforge_deliveries/static/generated/ui-model.json +25 -0
  65. solverforge-0.5.0/examples/solverforge_deliveries/static/index.html +22 -0
  66. solverforge-0.5.0/examples/solverforge_deliveries/static/sf-config.json +4 -0
  67. solverforge-0.5.0/examples/solverforge_hospital/README.md +81 -0
  68. solverforge-0.5.0/examples/solverforge_hospital/__init__.py +43 -0
  69. solverforge-0.5.0/examples/solverforge_hospital/__main__.py +32 -0
  70. solverforge-0.5.0/examples/solverforge_hospital/solver.toml +38 -0
  71. solverforge-0.5.0/examples/solverforge_hospital/src/__init__.py +41 -0
  72. solverforge-0.5.0/examples/solverforge_hospital/src/api/__init__.py +20 -0
  73. solverforge-0.5.0/examples/solverforge_hospital/src/api/dto.py +281 -0
  74. solverforge-0.5.0/examples/solverforge_hospital/src/api/mod.py +20 -0
  75. solverforge-0.5.0/examples/solverforge_hospital/src/api/routes.py +193 -0
  76. solverforge-0.5.0/examples/solverforge_hospital/src/api/sse.py +42 -0
  77. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/__init__.py +3 -0
  78. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/assigned_shift.py +14 -0
  79. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/balance_assignments.py +20 -0
  80. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/desired_day.py +24 -0
  81. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/minimum_rest.py +33 -0
  82. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/mod.py +42 -0
  83. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/one_shift_per_day.py +16 -0
  84. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/overlapping_shift.py +28 -0
  85. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/required_skill.py +20 -0
  86. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/unavailable_employee.py +32 -0
  87. solverforge-0.5.0/examples/solverforge_hospital/src/constraints/undesired_day.py +24 -0
  88. solverforge-0.5.0/examples/solverforge_hospital/src/data/__init__.py +23 -0
  89. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/LARGE.json +1 -0
  90. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/__init__.py +13 -0
  91. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/availability.py +16 -0
  92. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/cohorts.py +14 -0
  93. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/coverage.py +14 -0
  94. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/demand.py +9 -0
  95. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/employees.py +18 -0
  96. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/entrypoints.py +32 -0
  97. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/large.py +16 -0
  98. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/preferences.py +17 -0
  99. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/shifts.py +20 -0
  100. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/skills.py +15 -0
  101. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/time_utils.py +5 -0
  102. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/validation.py +12 -0
  103. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/vocabulary.py +10 -0
  104. solverforge-0.5.0/examples/solverforge_hospital/src/data/data_seed/witness.py +10 -0
  105. solverforge-0.5.0/examples/solverforge_hospital/src/data/mod.py +3 -0
  106. solverforge-0.5.0/examples/solverforge_hospital/src/domain/__init__.py +59 -0
  107. solverforge-0.5.0/examples/solverforge_hospital/src/domain/care_hub.py +63 -0
  108. solverforge-0.5.0/examples/solverforge_hospital/src/domain/employee.py +32 -0
  109. solverforge-0.5.0/examples/solverforge_hospital/src/domain/mod.py +19 -0
  110. solverforge-0.5.0/examples/solverforge_hospital/src/domain/plan.py +256 -0
  111. solverforge-0.5.0/examples/solverforge_hospital/src/lib.py +56 -0
  112. solverforge-0.5.0/examples/solverforge_hospital/src/main.py +22 -0
  113. solverforge-0.5.0/examples/solverforge_hospital/src/solver/__init__.py +8 -0
  114. solverforge-0.5.0/examples/solverforge_hospital/src/solver/mod.py +8 -0
  115. solverforge-0.5.0/examples/solverforge_hospital/src/solver/service/__init__.py +202 -0
  116. solverforge-0.5.0/examples/solverforge_hospital/src/solver/service/mod.py +8 -0
  117. solverforge-0.5.0/examples/solverforge_hospital/src/solver/service/payload.py +86 -0
  118. solverforge-0.5.0/examples/solverforge_hospital/static/app/main.mjs +130 -0
  119. solverforge-0.5.0/examples/solverforge_hospital/static/app/schedule/analysis-modal.mjs +79 -0
  120. solverforge-0.5.0/examples/solverforge_hospital/static/app/schedule/datetime.mjs +60 -0
  121. solverforge-0.5.0/examples/solverforge_hospital/static/app/schedule/employee-view.mjs +95 -0
  122. solverforge-0.5.0/examples/solverforge_hospital/static/app/schedule/grouping.mjs +77 -0
  123. solverforge-0.5.0/examples/solverforge_hospital/static/app/schedule/identity.mjs +33 -0
  124. solverforge-0.5.0/examples/solverforge_hospital/static/app/schedule/location-view.mjs +42 -0
  125. solverforge-0.5.0/examples/solverforge_hospital/static/app/schedule/presentation.mjs +116 -0
  126. solverforge-0.5.0/examples/solverforge_hospital/static/app/schedule/rail-renderer.mjs +154 -0
  127. solverforge-0.5.0/examples/solverforge_hospital/static/app/shell/api-guide.mjs +104 -0
  128. solverforge-0.5.0/examples/solverforge_hospital/static/app/shell/app-shell.mjs +103 -0
  129. solverforge-0.5.0/examples/solverforge_hospital/static/app/shell/app-state.mjs +7 -0
  130. solverforge-0.5.0/examples/solverforge_hospital/static/app/shell/config-loader.mjs +63 -0
  131. solverforge-0.5.0/examples/solverforge_hospital/static/app/shell/data-panel.mjs +22 -0
  132. solverforge-0.5.0/examples/solverforge_hospital/static/app/shell/solver-controller.mjs +134 -0
  133. solverforge-0.5.0/examples/solverforge_hospital/static/app/views/registry.mjs +10 -0
  134. solverforge-0.5.0/examples/solverforge_hospital/static/generated/ui-model.json +41 -0
  135. solverforge-0.5.0/examples/solverforge_hospital/static/index.html +23 -0
  136. solverforge-0.5.0/examples/solverforge_hospital/static/sf-config.json +5 -0
  137. solverforge-0.5.0/examples/vrp_owner_hooks.py +21 -0
  138. solverforge-0.5.0/pyproject.toml +61 -0
  139. solverforge-0.5.0/python/solverforge/__init__.py +64 -0
  140. solverforge-0.5.0/python/solverforge/_native.pyi +30 -0
  141. solverforge-0.5.0/python/solverforge/config.py +160 -0
  142. solverforge-0.5.0/python/solverforge/console.py +7 -0
  143. solverforge-0.5.0/python/solverforge/constraints.py +505 -0
  144. solverforge-0.5.0/python/solverforge/decorators.py +146 -0
  145. solverforge-0.5.0/python/solverforge/errors.py +15 -0
  146. solverforge-0.5.0/python/solverforge/events.py +13 -0
  147. solverforge-0.5.0/python/solverforge/fields.py +133 -0
  148. solverforge-0.5.0/python/solverforge/groups.py +99 -0
  149. solverforge-0.5.0/python/solverforge/joiner.py +28 -0
  150. solverforge-0.5.0/python/solverforge/manager.py +58 -0
  151. solverforge-0.5.0/python/solverforge/model.py +165 -0
  152. solverforge-0.5.0/python/solverforge/py.typed +1 -0
  153. solverforge-0.5.0/python/solverforge/score.py +171 -0
  154. solverforge-0.5.0/python/solverforge/solver.py +19 -0
  155. solverforge-0.5.0/python/solverforge/typing.py +17 -0
  156. solverforge-0.5.0/python/solverforge/ui.py +29 -0
  157. solverforge-0.5.0/rust-toolchain.toml +3 -0
  158. solverforge-0.5.0/scripts/verify_release_artifacts.py +211 -0
  159. solverforge-0.5.0/scripts/verify_solverforge_release_base.py +109 -0
  160. solverforge-0.5.0/src/bindings.rs +34 -0
  161. solverforge-0.5.0/src/callbacks/call.rs +5 -0
  162. solverforge-0.5.0/src/callbacks/mod.rs +3 -0
  163. solverforge-0.5.0/src/callbacks/registry.rs +14 -0
  164. solverforge-0.5.0/src/callbacks/threading.rs +3 -0
  165. solverforge-0.5.0/src/config.rs +58 -0
  166. solverforge-0.5.0/src/constraints/evaluate.rs +159 -0
  167. solverforge-0.5.0/src/constraints/incremental.rs +6 -0
  168. solverforge-0.5.0/src/constraints/list_precedence.rs +767 -0
  169. solverforge-0.5.0/src/constraints/matches.rs +5 -0
  170. solverforge-0.5.0/src/constraints/mod.rs +24 -0
  171. solverforge-0.5.0/src/constraints/state.rs +2594 -0
  172. solverforge-0.5.0/src/constraints/stream_plan.rs +7 -0
  173. solverforge-0.5.0/src/descriptor/extractor.rs +89 -0
  174. solverforge-0.5.0/src/descriptor/mod.rs +2 -0
  175. solverforge-0.5.0/src/descriptor/variable.rs +5 -0
  176. solverforge-0.5.0/src/error.rs +9 -0
  177. solverforge-0.5.0/src/intern.rs +3 -0
  178. solverforge-0.5.0/src/lib.rs +17 -0
  179. solverforge-0.5.0/src/manager/events.rs +154 -0
  180. solverforge-0.5.0/src/manager/jobs.rs +168 -0
  181. solverforge-0.5.0/src/manager/mod.rs +4 -0
  182. solverforge-0.5.0/src/proxy/entity.rs +10 -0
  183. solverforge-0.5.0/src/proxy/list.rs +2 -0
  184. solverforge-0.5.0/src/proxy/mod.rs +3 -0
  185. solverforge-0.5.0/src/proxy/solution.rs +2 -0
  186. solverforge-0.5.0/src/runtime/distance.rs +17 -0
  187. solverforge-0.5.0/src/runtime/dynamic_scalar_search.rs +6307 -0
  188. solverforge-0.5.0/src/runtime/list_slots.rs +28 -0
  189. solverforge-0.5.0/src/runtime/mod.rs +32 -0
  190. solverforge-0.5.0/src/runtime/scalar_slots.rs +29 -0
  191. solverforge-0.5.0/src/runtime/static_fns.rs +21 -0
  192. solverforge-0.5.0/src/runtime/thread_local.rs +21 -0
  193. solverforge-0.5.0/src/schema/build.rs +43 -0
  194. solverforge-0.5.0/src/schema/mod.rs +8 -0
  195. solverforge-0.5.0/src/schema/parse.rs +260 -0
  196. solverforge-0.5.0/src/schema/python.rs +15 -0
  197. solverforge-0.5.0/src/schema/types.rs +112 -0
  198. solverforge-0.5.0/src/schema/validate.rs +38 -0
  199. solverforge-0.5.0/src/score.rs +132 -0
  200. solverforge-0.5.0/src/solver/api.rs +122 -0
  201. solverforge-0.5.0/src/solver/console.rs +78 -0
  202. solverforge-0.5.0/src/solver/mod.rs +7 -0
  203. solverforge-0.5.0/src/solver/progress.rs +5 -0
  204. solverforge-0.5.0/src/solver/result.rs +6 -0
  205. solverforge-0.5.0/src/solver/solvable.rs +60 -0
  206. solverforge-0.5.0/src/state/callback_view.rs +294 -0
  207. solverforge-0.5.0/src/state/clone.rs +5 -0
  208. solverforge-0.5.0/src/state/entity_table.rs +51 -0
  209. solverforge-0.5.0/src/state/marshal.rs +349 -0
  210. solverforge-0.5.0/src/state/mod.rs +8 -0
  211. solverforge-0.5.0/src/state/solution.rs +465 -0
  212. solverforge-0.5.0/src/state/variables.rs +22 -0
  213. solverforge-0.5.0/src/ui.rs +194 -0
  214. solverforge-0.5.0/src/value.rs +64 -0
  215. solverforge-0.5.0/tests/python/test_config.py +196 -0
  216. solverforge-0.5.0/tests/python/test_constraints.py +638 -0
  217. solverforge-0.5.0/tests/python/test_decorators.py +53 -0
  218. solverforge-0.5.0/tests/python/test_deliveries_example.py +329 -0
  219. solverforge-0.5.0/tests/python/test_deliveries_frontend_app.py +255 -0
  220. solverforge-0.5.0/tests/python/test_examples_import_surface.py +63 -0
  221. solverforge-0.5.0/tests/python/test_examples_playwright.py +296 -0
  222. solverforge-0.5.0/tests/python/test_hospital_example.py +169 -0
  223. solverforge-0.5.0/tests/python/test_hospital_frontend_app.py +365 -0
  224. solverforge-0.5.0/tests/python/test_list_solving.py +1472 -0
  225. solverforge-0.5.0/tests/python/test_manager.py +82 -0
  226. solverforge-0.5.0/tests/python/test_mixed_solving.py +8 -0
  227. solverforge-0.5.0/tests/python/test_release_metadata.py +197 -0
  228. solverforge-0.5.0/tests/python/test_scalar_solving.py +1530 -0
  229. solverforge-0.5.0/tests/python/test_threading.py +11 -0
  230. solverforge-0.5.0/tests/python/test_tracebacks.py +40 -0
  231. solverforge-0.5.0/tests/python/test_ui_assets.py +125 -0
  232. solverforge-0.5.0/tests/rust/constraint_set.rs +38 -0
  233. solverforge-0.5.0/tests/rust/descriptor.rs +79 -0
  234. solverforge-0.5.0/tests/rust/manager.rs +6 -0
  235. solverforge-0.5.0/tests/rust/runtime_slots.rs +108 -0
  236. solverforge-0.5.0/tests/rust/score.rs +8 -0
  237. solverforge-0.5.0/tests/rust/state_clone.rs +226 -0
  238. solverforge-0.5.0/tests/rust.rs +16 -0
  239. solverforge-0.3.0/Cargo.lock +0 -2437
  240. solverforge-0.3.0/Cargo.toml +0 -59
  241. solverforge-0.3.0/PKG-INFO +0 -232
  242. solverforge-0.3.0/README.md +0 -208
  243. solverforge-0.3.0/pyproject.toml +0 -36
  244. solverforge-0.3.0/python/solverforge/__init__.py +0 -162
  245. solverforge-0.3.0/python/solverforge/solver/__init__.py +0 -379
  246. solverforge-0.3.0/python/solverforge/solver/config.py +0 -221
  247. solverforge-0.3.0/python/solverforge/solver/domain.py +0 -45
  248. solverforge-0.3.0/python/solverforge/solver/score.py +0 -51
  249. solverforge-0.3.0/python/solverforge/test/__init__.py +0 -746
  250. solverforge-0.3.0/solverforge-core/Cargo.toml +0 -43
  251. solverforge-0.3.0/solverforge-core/README.md +0 -118
  252. solverforge-0.3.0/solverforge-core/src/analysis/explanation.rs +0 -406
  253. solverforge-0.3.0/solverforge-core/src/analysis/manager.rs +0 -323
  254. solverforge-0.3.0/solverforge-core/src/analysis/mod.rs +0 -5
  255. solverforge-0.3.0/solverforge-core/src/bridge.rs +0 -315
  256. solverforge-0.3.0/solverforge-core/src/constraints/collectors.rs +0 -739
  257. solverforge-0.3.0/solverforge-core/src/constraints/constraint.rs +0 -541
  258. solverforge-0.3.0/solverforge-core/src/constraints/joiners.rs +0 -632
  259. solverforge-0.3.0/solverforge-core/src/constraints/mod.rs +0 -11
  260. solverforge-0.3.0/solverforge-core/src/constraints/named_expr.rs +0 -221
  261. solverforge-0.3.0/solverforge-core/src/constraints/stream.rs +0 -1048
  262. solverforge-0.3.0/solverforge-core/src/domain/annotations.rs +0 -1057
  263. solverforge-0.3.0/solverforge-core/src/domain/class.rs +0 -422
  264. solverforge-0.3.0/solverforge-core/src/domain/constraint_config.rs +0 -100
  265. solverforge-0.3.0/solverforge-core/src/domain/listener.rs +0 -981
  266. solverforge-0.3.0/solverforge-core/src/domain/mod.rs +0 -19
  267. solverforge-0.3.0/solverforge-core/src/domain/model.rs +0 -520
  268. solverforge-0.3.0/solverforge-core/src/domain/shadow.rs +0 -331
  269. solverforge-0.3.0/solverforge-core/src/entity_context.rs +0 -193
  270. solverforge-0.3.0/solverforge-core/src/error.rs +0 -100
  271. solverforge-0.3.0/solverforge-core/src/handles.rs +0 -171
  272. solverforge-0.3.0/solverforge-core/src/lib.rs +0 -85
  273. solverforge-0.3.0/solverforge-core/src/score/bendable.rs +0 -554
  274. solverforge-0.3.0/solverforge-core/src/score/hard_soft.rs +0 -583
  275. solverforge-0.3.0/solverforge-core/src/score/hard_soft_decimal.rs +0 -481
  276. solverforge-0.3.0/solverforge-core/src/score/mod.rs +0 -25
  277. solverforge-0.3.0/solverforge-core/src/score/simple.rs +0 -168
  278. solverforge-0.3.0/solverforge-core/src/score/simple_decimal.rs +0 -188
  279. solverforge-0.3.0/solverforge-core/src/solver/builder.rs +0 -806
  280. solverforge-0.3.0/solverforge-core/src/solver/change.rs +0 -1139
  281. solverforge-0.3.0/solverforge-core/src/solver/client.rs +0 -191
  282. solverforge-0.3.0/solverforge-core/src/solver/config.rs +0 -216
  283. solverforge-0.3.0/solverforge-core/src/solver/environment.rs +0 -195
  284. solverforge-0.3.0/solverforge-core/src/solver/factory.rs +0 -277
  285. solverforge-0.3.0/solverforge-core/src/solver/manager.rs +0 -253
  286. solverforge-0.3.0/solverforge-core/src/solver/mod.rs +0 -29
  287. solverforge-0.3.0/solverforge-core/src/solver/request.rs +0 -622
  288. solverforge-0.3.0/solverforge-core/src/solver/response.rs +0 -467
  289. solverforge-0.3.0/solverforge-core/src/solver/termination.rs +0 -273
  290. solverforge-0.3.0/solverforge-core/src/traits.rs +0 -488
  291. solverforge-0.3.0/solverforge-core/src/value.rs +0 -402
  292. solverforge-0.3.0/solverforge-core/src/wasm/expression/builder.rs +0 -672
  293. solverforge-0.3.0/solverforge-core/src/wasm/expression/mod.rs +0 -349
  294. solverforge-0.3.0/solverforge-core/src/wasm/expression/substitution.rs +0 -199
  295. solverforge-0.3.0/solverforge-core/src/wasm/expression/tests.rs +0 -761
  296. solverforge-0.3.0/solverforge-core/src/wasm/generator/codegen.rs +0 -317
  297. solverforge-0.3.0/solverforge-core/src/wasm/generator/compiler.rs +0 -801
  298. solverforge-0.3.0/solverforge-core/src/wasm/generator/mod.rs +0 -469
  299. solverforge-0.3.0/solverforge-core/src/wasm/generator/predicate.rs +0 -38
  300. solverforge-0.3.0/solverforge-core/src/wasm/generator/tests.rs +0 -280
  301. solverforge-0.3.0/solverforge-core/src/wasm/host_functions.rs +0 -302
  302. solverforge-0.3.0/solverforge-core/src/wasm/memory.rs +0 -300
  303. solverforge-0.3.0/solverforge-core/src/wasm/mod.rs +0 -12
  304. solverforge-0.3.0/solverforge-python/Cargo.toml +0 -38
  305. solverforge-0.3.0/solverforge-python/README.md +0 -208
  306. solverforge-0.3.0/solverforge-python/python/solverforge/__init__.py +0 -162
  307. solverforge-0.3.0/solverforge-python/python/solverforge/solver/__init__.py +0 -379
  308. solverforge-0.3.0/solverforge-python/python/solverforge/solver/config.py +0 -221
  309. solverforge-0.3.0/solverforge-python/python/solverforge/solver/domain.py +0 -45
  310. solverforge-0.3.0/solverforge-python/python/solverforge/solver/score.py +0 -51
  311. solverforge-0.3.0/solverforge-python/python/solverforge/test/__init__.py +0 -746
  312. solverforge-0.3.0/solverforge-python/src/analysis.rs +0 -414
  313. solverforge-0.3.0/solverforge-python/src/annotations.rs +0 -758
  314. solverforge-0.3.0/solverforge-python/src/bridge.rs +0 -1063
  315. solverforge-0.3.0/solverforge-python/src/collectors.rs +0 -630
  316. solverforge-0.3.0/solverforge-python/src/decorators.rs +0 -922
  317. solverforge-0.3.0/solverforge-python/src/joiners.rs +0 -274
  318. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/ast_convert/guards.rs +0 -116
  319. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/ast_convert/inference.rs +0 -549
  320. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/ast_convert/mod.rs +0 -1035
  321. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/ast_convert/types.rs +0 -65
  322. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/conditionals.rs +0 -491
  323. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/constants.rs +0 -370
  324. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/lambda_parsing.rs +0 -183
  325. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/loops.rs +0 -729
  326. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/method_analysis.rs +0 -248
  327. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/mod.rs +0 -269
  328. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/patterns.rs +0 -36
  329. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/registry.rs +0 -155
  330. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/sequential.rs +0 -353
  331. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/tests.rs +0 -428
  332. solverforge-0.3.0/solverforge-python/src/lambda_analyzer/type_inference.rs +0 -447
  333. solverforge-0.3.0/solverforge-python/src/lib.rs +0 -201
  334. solverforge-0.3.0/solverforge-python/src/score.rs +0 -1714
  335. solverforge-0.3.0/solverforge-python/src/service.rs +0 -325
  336. solverforge-0.3.0/solverforge-python/src/solver.rs +0 -2174
  337. solverforge-0.3.0/solverforge-python/src/stream.rs +0 -4089
  338. solverforge-0.3.0/solverforge-service/Cargo.toml +0 -33
  339. solverforge-0.3.0/solverforge-service/README.md +0 -89
  340. solverforge-0.3.0/solverforge-service/src/config.rs +0 -106
  341. solverforge-0.3.0/solverforge-service/src/error.rs +0 -51
  342. solverforge-0.3.0/solverforge-service/src/jar.rs +0 -348
  343. solverforge-0.3.0/solverforge-service/src/lib.rs +0 -18
  344. solverforge-0.3.0/solverforge-service/src/service.rs +0 -309
  345. solverforge-0.3.0/solverforge-service/src/util.rs +0 -146
  346. solverforge-0.3.0/solverforge-service/tests/employee_scheduling_integration.rs +0 -943
  347. solverforge-0.3.0/solverforge-service/tests/integration.rs +0 -61
  348. solverforge-0.3.0/solverforge-service/tests/solve_integration.rs +0 -393
@@ -0,0 +1,69 @@
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
@@ -0,0 +1,200 @@
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
+ sdist:
18
+ name: source distribution
19
+ if: github.server_url == 'https://github.com'
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - name: Checkout solverforge-py
23
+ uses: actions/checkout@v6
24
+ with:
25
+ path: solverforge-py
26
+
27
+ - name: Set up Python
28
+ uses: actions/setup-python@v6
29
+ with:
30
+ python-version: ${{ env.PYTHON_VERSION }}
31
+
32
+ - name: Set up Rust
33
+ uses: dtolnay/rust-toolchain@stable
34
+ with:
35
+ toolchain: ${{ env.RUST_VERSION }}
36
+ components: rustfmt, clippy
37
+
38
+ - name: Build sdist
39
+ working-directory: solverforge-py
40
+ run: make build-sdist
41
+
42
+ - name: Upload sdist
43
+ uses: actions/upload-artifact@v7
44
+ with:
45
+ name: sdist
46
+ path: solverforge-py/dist/*.tar.gz
47
+
48
+ wheels:
49
+ name: wheel ${{ matrix.os }} ${{ matrix.target }}
50
+ if: github.server_url == 'https://github.com'
51
+ runs-on: ${{ matrix.os }}
52
+ strategy:
53
+ fail-fast: false
54
+ matrix:
55
+ include:
56
+ - os: ubuntu-latest
57
+ target: x86_64
58
+ manylinux: "2014"
59
+ interpreter: python3.14
60
+ - os: macos-14
61
+ target: aarch64
62
+ manylinux: ""
63
+ interpreter: python3.14
64
+ - os: windows-latest
65
+ target: x64
66
+ manylinux: ""
67
+ interpreter: python
68
+ steps:
69
+ - name: Checkout solverforge-py
70
+ uses: actions/checkout@v6
71
+ with:
72
+ path: solverforge-py
73
+
74
+ - name: Set up Python
75
+ uses: actions/setup-python@v6
76
+ with:
77
+ python-version: ${{ env.PYTHON_VERSION }}
78
+
79
+ - name: Build wheels
80
+ uses: PyO3/maturin-action@v1
81
+ with:
82
+ command: build
83
+ args: --release --locked --strip --compatibility pypi -i ${{ matrix.interpreter }} --out dist
84
+ manylinux: ${{ matrix.manylinux }}
85
+ target: ${{ matrix.target }}
86
+ rust-toolchain: ${{ env.RUST_VERSION }}
87
+ working-directory: solverforge-py
88
+
89
+ - name: Upload wheels
90
+ uses: actions/upload-artifact@v7
91
+ with:
92
+ name: wheels-${{ matrix.os }}-${{ matrix.target }}
93
+ path: solverforge-py/dist/*.whl
94
+
95
+ verify:
96
+ name: verify artifacts
97
+ if: github.server_url == 'https://github.com'
98
+ runs-on: ubuntu-latest
99
+ needs: [sdist, wheels]
100
+ steps:
101
+ - name: Checkout solverforge-py
102
+ uses: actions/checkout@v6
103
+
104
+ - name: Set up Python
105
+ uses: actions/setup-python@v6
106
+ with:
107
+ python-version: ${{ env.PYTHON_VERSION }}
108
+
109
+ - name: Download artifacts
110
+ uses: actions/download-artifact@v8
111
+ with:
112
+ path: artifact-download
113
+
114
+ - name: Collect distributions
115
+ run: |
116
+ mkdir dist
117
+ find artifact-download -type f \( -name '*.whl' -o -name '*.tar.gz' \) -exec cp '{}' dist/ \;
118
+
119
+ - name: Install release tools
120
+ run: python -m pip install --disable-pip-version-check twine
121
+
122
+ - name: Check metadata
123
+ run: |
124
+ python -m twine check dist/*
125
+ python scripts/verify_release_artifacts.py --dist dist
126
+
127
+ - name: Upload verified distributions
128
+ uses: actions/upload-artifact@v7
129
+ with:
130
+ name: release-dist
131
+ path: dist/*
132
+
133
+ publish-testpypi:
134
+ name: publish to TestPyPI
135
+ runs-on: ubuntu-latest
136
+ needs: verify
137
+ if: >-
138
+ github.server_url == 'https://github.com' &&
139
+ github.event_name == 'workflow_dispatch'
140
+ environment: testpypi
141
+ permissions:
142
+ contents: read
143
+ id-token: write
144
+ steps:
145
+ - name: Download verified distributions
146
+ uses: actions/download-artifact@v8
147
+ with:
148
+ name: release-dist
149
+ path: dist
150
+
151
+ - name: Publish to TestPyPI
152
+ uses: pypa/gh-action-pypi-publish@release/v1
153
+ with:
154
+ repository-url: https://test.pypi.org/legacy/
155
+
156
+ publish-pypi:
157
+ name: publish to PyPI
158
+ runs-on: ubuntu-latest
159
+ needs: verify
160
+ if: >-
161
+ github.server_url == 'https://github.com' &&
162
+ github.event_name == 'push' &&
163
+ startsWith(github.ref, 'refs/tags/v')
164
+ environment: pypi
165
+ permissions:
166
+ contents: read
167
+ steps:
168
+ - name: Checkout solverforge-py
169
+ uses: actions/checkout@v6
170
+
171
+ - name: Set up Python
172
+ uses: actions/setup-python@v6
173
+ with:
174
+ python-version: ${{ env.PYTHON_VERSION }}
175
+
176
+ - name: Validate tag version
177
+ run: |
178
+ python - <<'PY'
179
+ import os
180
+ import tomllib
181
+
182
+ with open("pyproject.toml", "rb") as handle:
183
+ version = tomllib.load(handle)["project"]["version"]
184
+
185
+ expected = f"v{version}"
186
+ actual = os.environ["GITHUB_REF_NAME"]
187
+ if actual != expected:
188
+ raise SystemExit(f"tag {actual} does not match package version {expected}")
189
+ PY
190
+
191
+ - name: Download verified distributions
192
+ uses: actions/download-artifact@v8
193
+ with:
194
+ name: release-dist
195
+ path: dist
196
+
197
+ - name: Publish to PyPI
198
+ uses: pypa/gh-action-pypi-publish@release/v1
199
+ with:
200
+ password: ${{ secrets.PYPI_API_TOKEN }}
@@ -0,0 +1,11 @@
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
@@ -0,0 +1,31 @@
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"]
@@ -0,0 +1 @@
1
+ 3.14t
@@ -0,0 +1,121 @@
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
+ Python callbacks are the only constraint authoring surface. Callback exceptions
77
+ must preserve actionable Python tracebacks. Callback solution views must expose
78
+ ordinary solution-level lookup context while projecting entity/fact collections
79
+ from Rust-owned state. Callback code may be called many times and from multiple
80
+ worker threads on CPython 3.14 free-threaded, so treat solution-level lookup
81
+ context as immutable during a solve.
82
+
83
+ Do not fake unsupported behavior. Top-level `ConstraintFactory.join`,
84
+ `group_by`, `if_exists`, `if_not_exists`, and `flattened` remain explicit
85
+ unsupported methods until public bridge support exists for those top-level
86
+ semantics. Rust-only custom search and partitioner registration cannot be
87
+ claimed as Python-bindable without a public upstream seam.
88
+
89
+ ## Release Responsibilities
90
+
91
+ `pyproject.toml` owns PyPI metadata, version, Python requirement, optional
92
+ example dependencies, project URLs, classifiers, and maturin module settings.
93
+ `Cargo.toml` owns native crate metadata and the SolverForge Rust dependency
94
+ base; the package version must match `pyproject.toml`. `Cargo.lock` locks
95
+ reproducible Rust builds. The `Makefile` owns local release targets,
96
+ dependency-base checks, distribution builds, artifact validation, browser system
97
+ dependency setup, and `pre-release`. `.github/workflows/ci.yml` validates source
98
+ checkouts on GitHub and Forgejo, installs Playwright system dependencies on
99
+ Linux, and retries network toolchain bootstraps for transient runner DNS misses.
100
+ `.github/workflows/release.yml` builds sdists/wheels, verifies release
101
+ artifacts, publishes to TestPyPI only from manual workflow dispatch, and
102
+ publishes to PyPI only from a matching `v*.*.*` tag after the reviewed `pypi`
103
+ environment approves the job. `scripts/verify_release_artifacts.py` checks
104
+ deterministic artifact metadata/content, and
105
+ `tests/python/test_release_metadata.py` guards release metadata drift.
106
+
107
+ ## Commit & Pull Request Guidelines
108
+
109
+ The history uses concise Conventional Commit-style subjects such as
110
+ `fix(runtime): preserve scalar snapshots` or `test(manager): cover retained jobs`.
111
+ Pull requests should include the motivation, user-visible behavior, tests run,
112
+ and any linked issue. Include screenshots or short recordings for changes under
113
+ `examples/solverforge_hospital/static/` or
114
+ `examples/solverforge_deliveries/static/`.
115
+
116
+ ## Agent-Specific Instructions
117
+
118
+ Keep changes scoped to the requested surface. Do not rewrite runtime, callback,
119
+ manager, or API payload paths for a simple documentation, UI, naming, or wiring
120
+ task unless live evidence proves that path is the failing layer. Verify assumptions
121
+ from the repo before changing critical integration code.
@@ -0,0 +1,53 @@
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.5.0](https://github.com/SolverForge/solverforge-py/compare/v0.4.1...v0.5.0) (2026-07-03)
6
+
7
+
8
+ ### Features
9
+
10
+ * **examples:** add deliveries Python app 0179084
11
+ * **model:** carry dynamic route and shadow hooks 83a8d41
12
+ * **runtime:** bind Python list route hooks fd51788
13
+ * **runtime:** broaden dynamic Python planning surface f04eefa
14
+ * **ui:** embed shared frontend assets ab30697
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+ * **ci:** bootstrap Forgejo toolchains in workflow 8e5f791
20
+ * **ci:** install Playwright system dependencies b249fd1
21
+ * **ci:** retry toolchain bootstrap downloads cd60f76
22
+ * **ci:** run workflow from checkout root 8733fc3
23
+ * **ci:** select Forgejo runner labels 56ff4fc
24
+ * **deliveries:** recommend assigned-route insertions d59daea
25
+ * **examples:** report snapshot score in payloads 0bfcaa0
26
+ * **examples:** report solution scores in events bdcddd8
27
+ * **model:** validate scalar group names cfa2070
28
+ * **runtime:** align dynamic construction with core semantics 7cacda0
29
+ * **runtime:** cap first-fit required construction candidates 3666c20
30
+ * **runtime:** resolve dynamic slots against descriptors a2544be
31
+ * **runtime:** reuse required assignment construction streams 0caf06d
32
+ * **runtime:** use direct cursor for first-fit assignments 769a081
33
+ * **scoring:** return true shadow update deltas 88dc500
34
+ * **state:** preserve callback root fields 0aacef5
35
+
36
+
37
+ ### Tests
38
+
39
+ * **examples:** stabilize hospital browser smoke f11efd6
40
+ * **examples:** stub map tiles in browser smoke d69ca3e
41
+
42
+
43
+ ### Documentation and release
44
+
45
+ * **docs:** remove standalone docs surface b1c6e1f
46
+ * **release:** cut 0.5.0 metadata 4728014
47
+
48
+ ## [0.4.1](https://github.com/SolverForge/solverforge-py/compare/v0.4.0...v0.4.1) (2026-06-02)
49
+
50
+
51
+ ### Bug Fixes
52
+
53
+ * **deps:** resolve SolverForge crates from crates.io 73bfe4a