cellpycore 0.1.2__tar.gz → 0.1.3__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 (198) hide show
  1. cellpycore-0.1.3/.cursor/rules/graphify.mdc +11 -0
  2. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/rules/issueflow-rules.mdc +5 -1
  3. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-close/SKILL.md +10 -4
  4. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-pick/SKILL.md +5 -1
  5. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-yolo/SKILL.md +5 -4
  6. {cellpycore-0.1.2 → cellpycore-0.1.3}/.gitignore +5 -1
  7. cellpycore-0.1.3/.issueflows/03-solved-issues/issue62_original.md +13 -0
  8. cellpycore-0.1.3/.issueflows/03-solved-issues/issue62_plan.md +22 -0
  9. cellpycore-0.1.3/.issueflows/03-solved-issues/issue62_status.md +14 -0
  10. cellpycore-0.1.3/.issueflows/03-solved-issues/issue64_original.md +7 -0
  11. cellpycore-0.1.3/.issueflows/03-solved-issues/issue64_plan.md +28 -0
  12. cellpycore-0.1.3/.issueflows/03-solved-issues/issue64_status.md +17 -0
  13. cellpycore-0.1.3/.issueflows/03-solved-issues/issue66_original.md +9 -0
  14. cellpycore-0.1.3/.issueflows/03-solved-issues/issue66_plan.md +140 -0
  15. cellpycore-0.1.3/.issueflows/03-solved-issues/issue66_status.md +42 -0
  16. cellpycore-0.1.3/.issueflows/03-solved-issues/issue67_original.md +15 -0
  17. cellpycore-0.1.3/.issueflows/03-solved-issues/issue67_plan.md +114 -0
  18. cellpycore-0.1.3/.issueflows/03-solved-issues/issue67_status.md +19 -0
  19. cellpycore-0.1.3/.issueflows/03-solved-issues/issue68_original.md +13 -0
  20. cellpycore-0.1.3/.issueflows/03-solved-issues/issue68_plan.md +90 -0
  21. cellpycore-0.1.3/.issueflows/03-solved-issues/issue68_status.md +16 -0
  22. cellpycore-0.1.3/.issueflows/03-solved-issues/issue69_original.md +11 -0
  23. cellpycore-0.1.3/.issueflows/03-solved-issues/issue69_plan.md +22 -0
  24. cellpycore-0.1.3/.issueflows/03-solved-issues/issue69_status.md +14 -0
  25. cellpycore-0.1.3/.issueflows/03-solved-issues/issue70_original.md +15 -0
  26. cellpycore-0.1.3/.issueflows/03-solved-issues/issue70_plan.md +127 -0
  27. cellpycore-0.1.3/.issueflows/03-solved-issues/issue70_status.md +15 -0
  28. cellpycore-0.1.3/.issueflows/03-solved-issues/issue72_original.md +9 -0
  29. cellpycore-0.1.3/.issueflows/03-solved-issues/issue72_status.md +9 -0
  30. cellpycore-0.1.3/.issueflows/03-solved-issues/issue77_original.md +13 -0
  31. cellpycore-0.1.3/.issueflows/03-solved-issues/issue77_plan.md +176 -0
  32. cellpycore-0.1.3/.issueflows/03-solved-issues/issue77_status.md +16 -0
  33. cellpycore-0.1.3/.issueflows/03-solved-issues/issue82_original.md +9 -0
  34. cellpycore-0.1.3/.issueflows/03-solved-issues/issue82_status.md +13 -0
  35. cellpycore-0.1.3/.issueflows/03-solved-issues/issue84_original.md +7 -0
  36. cellpycore-0.1.3/.issueflows/03-solved-issues/issue84_plan.md +71 -0
  37. cellpycore-0.1.3/.issueflows/03-solved-issues/issue84_status.md +17 -0
  38. cellpycore-0.1.3/.issueflows/03-solved-issues/issue86_original.md +60 -0
  39. cellpycore-0.1.3/.issueflows/03-solved-issues/issue86_plan.md +169 -0
  40. cellpycore-0.1.3/.issueflows/03-solved-issues/issue86_status.md +22 -0
  41. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/cellpy-core-migration.md +1 -1
  42. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/code-review-2026-07.md +11 -0
  43. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/step-table-polars-migration.md +3 -3
  44. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/summary-extractors.md +3 -3
  45. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/test-data-and-fixtures.md +5 -5
  46. cellpycore-0.1.3/.issueflows/04-designs-and-guides/this-project.md +81 -0
  47. cellpycore-0.1.3/.pre-commit-config.yaml +13 -0
  48. {cellpycore-0.1.2 → cellpycore-0.1.3}/AGENTS.md +14 -1
  49. {cellpycore-0.1.2 → cellpycore-0.1.3}/HISTORY.md +41 -0
  50. cellpycore-0.1.3/PKG-INFO +101 -0
  51. cellpycore-0.1.3/README.md +81 -0
  52. cellpycore-0.1.3/ROADMAP.md +57 -0
  53. {cellpycore-0.1.2 → cellpycore-0.1.3}/cellpy-core.code-workspace +3 -1
  54. cellpycore-0.1.3/graphify-out/.graphify_labels.json +266 -0
  55. cellpycore-0.1.3/graphify-out/.graphify_root +1 -0
  56. cellpycore-0.1.3/graphify-out/GRAPH_REPORT.md +1125 -0
  57. cellpycore-0.1.3/graphify-out/graph.html +307 -0
  58. cellpycore-0.1.3/graphify-out/graph.json +55732 -0
  59. cellpycore-0.1.3/graphify-out/manifest.json +932 -0
  60. {cellpycore-0.1.2 → cellpycore-0.1.3}/pyproject.toml +25 -9
  61. cellpycore-0.1.3/src/cellpycore/__init__.py +47 -0
  62. {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/cell_core.py +244 -58
  63. {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/config.py +34 -2
  64. cellpycore-0.1.3/src/cellpycore/exceptions.py +13 -0
  65. {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/extractors.py +1 -3
  66. cellpycore-0.1.3/src/cellpycore/legacy/__init__.py +41 -0
  67. cellpycore-0.1.2/src/cellpycore/legacy.py → cellpycore-0.1.3/src/cellpycore/legacy/headers.py +2 -138
  68. cellpycore-0.1.3/src/cellpycore/legacy/limits.py +34 -0
  69. cellpycore-0.1.2/src/cellpycore/header_mapping.py → cellpycore-0.1.3/src/cellpycore/legacy/mapping.py +142 -51
  70. cellpycore-0.1.3/src/cellpycore/legacy/meta.py +22 -0
  71. cellpycore-0.1.3/src/cellpycore/legacy/mock_core.py +66 -0
  72. {cellpycore-0.1.2/src/cellpycore → cellpycore-0.1.3/src/cellpycore/legacy}/selectors.py +19 -19
  73. cellpycore-0.1.3/src/cellpycore/merge.py +459 -0
  74. {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/settings_base.py +5 -3
  75. {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/summarizers.py +107 -18
  76. cellpycore-0.1.3/src/cellpycore/testing/__init__.py +4 -0
  77. cellpycore-0.1.2/src/cellpycore/_helpers.py → cellpycore-0.1.3/src/cellpycore/testing/mock_data.py +3 -1
  78. {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/timestamps.py +3 -1
  79. cellpycore-0.1.3/src/cellpycore/units/__init__.py +19 -0
  80. cellpycore-0.1.3/src/cellpycore/units/converters.py +322 -0
  81. cellpycore-0.1.3/src/cellpycore/units/spec.py +87 -0
  82. {cellpycore-0.1.2 → cellpycore-0.1.3}/uv.lock +179 -76
  83. cellpycore-0.1.2/.cursor/rules/graphify.mdc +0 -10
  84. cellpycore-0.1.2/.issueflows/04-designs-and-guides/this-project.md +0 -32
  85. cellpycore-0.1.2/PKG-INFO +0 -104
  86. cellpycore-0.1.2/README.md +0 -80
  87. cellpycore-0.1.2/graphify-out/.graphify_labels.json +0 -76
  88. cellpycore-0.1.2/graphify-out/.graphify_root +0 -1
  89. cellpycore-0.1.2/graphify-out/GRAPH_REPORT.md +0 -329
  90. cellpycore-0.1.2/graphify-out/graph.html +0 -305
  91. cellpycore-0.1.2/graphify-out/graph.json +0 -21426
  92. cellpycore-0.1.2/graphify-out/manifest.json +0 -198
  93. cellpycore-0.1.2/scratch.db +0 -0
  94. cellpycore-0.1.2/src/cellpycore/units.py +0 -257
  95. {cellpycore-0.1.2 → cellpycore-0.1.3}/.aliases +0 -0
  96. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/rules/cellpy-core-migration.mdc +0 -0
  97. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/rules/kiss.mdc +0 -0
  98. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/rules/this-project.mdc +0 -0
  99. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/caveman/SKILL.md +0 -0
  100. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/grill-me/SKILL.md +0 -0
  101. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow/SKILL.md +0 -0
  102. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-cleanup/SKILL.md +0 -0
  103. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-comments/SKILL.md +0 -0
  104. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-fix/SKILL.md +0 -0
  105. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-graphify/SKILL.md +0 -0
  106. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-history-update/SKILL.md +0 -0
  107. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-init/SKILL.md +0 -0
  108. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-pause/SKILL.md +0 -0
  109. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-plan/SKILL.md +0 -0
  110. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-start/SKILL.md +0 -0
  111. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-status/SKILL.md +0 -0
  112. {cellpycore-0.1.2 → cellpycore-0.1.3}/.cursor/skills/iflow-version-bump/SKILL.md +0 -0
  113. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/00-tools/.gitkeep +0 -0
  114. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/00-tools/README.md +0 -0
  115. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/01-current-issues/.gitkeep +0 -0
  116. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/02-partly-solved-issues/.gitkeep +0 -0
  117. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/.gitkeep +0 -0
  118. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue10_original.md +0 -0
  119. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue10_plan.md +0 -0
  120. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue10_status.md +0 -0
  121. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue12_original.md +0 -0
  122. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue12_plan.md +0 -0
  123. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue12_status.md +0 -0
  124. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue13_original.md +0 -0
  125. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue13_plan.md +0 -0
  126. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue13_status.md +0 -0
  127. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue21_original.md +0 -0
  128. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue21_plan.md +0 -0
  129. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue21_status.md +0 -0
  130. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue22_original.md +0 -0
  131. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue22_plan.md +0 -0
  132. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue22_status.md +0 -0
  133. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue23_original.md +0 -0
  134. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue23_plan.md +0 -0
  135. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue23_status.md +0 -0
  136. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue24_original.md +0 -0
  137. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue24_status.md +0 -0
  138. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue29_original.md +0 -0
  139. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue29_plan.md +0 -0
  140. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue29_status.md +0 -0
  141. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue30_original.md +0 -0
  142. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue30_plan.md +0 -0
  143. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue30_status.md +0 -0
  144. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue32_original.md +0 -0
  145. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue32_plan.md +0 -0
  146. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue32_status.md +0 -0
  147. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue34_original.md +0 -0
  148. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue34_plan.md +0 -0
  149. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue36_original.md +0 -0
  150. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue36_status.md +0 -0
  151. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue39_original.md +0 -0
  152. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue39_plan.md +0 -0
  153. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue39_status.md +0 -0
  154. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue40_original.md +0 -0
  155. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue40_plan.md +0 -0
  156. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue40_status.md +0 -0
  157. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue41_original.md +0 -0
  158. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue41_plan.md +0 -0
  159. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue41_status.md +0 -0
  160. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue42_original.md +0 -0
  161. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue42_plan.md +0 -0
  162. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue42_status.md +0 -0
  163. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue43_original.md +0 -0
  164. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue43_plan.md +0 -0
  165. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue43_status.md +0 -0
  166. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue44_original.md +0 -0
  167. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue44_status.md +0 -0
  168. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue45_original.md +0 -0
  169. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue45_plan.md +0 -0
  170. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue45_status.md +0 -0
  171. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue50_original.md +0 -0
  172. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue50_plan.md +0 -0
  173. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue50_status.md +0 -0
  174. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue54_original.md +0 -0
  175. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue54_plan.md +0 -0
  176. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue54_status.md +0 -0
  177. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue55_original.md +0 -0
  178. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue55_plan.md +0 -0
  179. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue55_status.md +0 -0
  180. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue56_original.md +0 -0
  181. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue56_plan.md +0 -0
  182. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/03-solved-issues/issue56_status.md +0 -0
  183. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/.gitkeep +0 -0
  184. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/cellpy-core-integration-into-cellpy.md +0 -0
  185. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/cellpy-core-integration-roadmap.md +0 -0
  186. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/column-headers-review.md +0 -0
  187. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/metadata-scaffolding.md +0 -0
  188. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/release-procedure.md +0 -0
  189. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/selector-dead-code-deferral.md +0 -0
  190. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/04-designs-and-guides/test-metadata-and-merging.md +0 -0
  191. {cellpycore-0.1.2 → cellpycore-0.1.3}/.issueflows/config.toml +0 -0
  192. {cellpycore-0.1.2 → cellpycore-0.1.3}/.python-version +0 -0
  193. {cellpycore-0.1.2 → cellpycore-0.1.3}/.vscode/settings.json +0 -0
  194. {cellpycore-0.1.2 → cellpycore-0.1.3}/LICENSE +0 -0
  195. {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/metadata/__init__.py +7 -7
  196. {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/metadata/io.py +0 -0
  197. {cellpycore-0.1.2 → cellpycore-0.1.3}/src/cellpycore/metadata/models.py +0 -0
  198. /cellpycore-0.1.2/src/cellpycore/__init__.py → /cellpycore-0.1.3/src/cellpycore/py.typed +0 -0
@@ -0,0 +1,11 @@
1
+ ---
2
+ description: graphify knowledge graph context
3
+ alwaysApply: true
4
+ ---
5
+
6
+ This project has a graphify knowledge graph at graphify-out/.
7
+
8
+ - For codebase or architecture questions, when `graphify-out/graph.json` exists, first run `graphify query "<question>"` (or `graphify path "<A>" "<B>"` / `graphify explain "<concept>"`). These return a scoped subgraph, usually much smaller than `GRAPH_REPORT.md` or raw grep output.
9
+ - If graphify-out/wiki/index.md exists, navigate it instead of reading raw files
10
+ - Read graphify-out/GRAPH_REPORT.md only for broad architecture review or when query/path/explain do not surface enough context
11
+ - After modifying code files in this session, run `graphify update .` to keep the graph current (AST-only, no API cost)
@@ -118,7 +118,11 @@ The full slash-command lifecycle is:
118
118
  5. **`/iflow-close`** — tests, optional `uv version --bump`, status update, commit, push, PR. Does not delete branches.
119
119
  6. **`/iflow-cleanup`** — post-merge: switch to default, `git pull --ff-only`, `git fetch --prune`, `git branch -d` on merged local branches under a single consolidated confirm. Never `-D`.
120
120
 
121
- `/iflow-yolo` chains `init → plan → start → close` for small, low-risk issues with up-front safeguards (clean tree, passing tests, single consolidated confirm).
121
+ `/iflow-yolo` chains `init → plan → start → close yolo` for small, low-risk issues with up-front safeguards (clean tree, passing tests, single consolidated confirm). Its close step is hands-off: changelog decided without a prompt, PR merged (`gh pr merge --squash`, `--auto` fallback), then default-branch switch + pull.
122
+
123
+
124
+ Issue labels can select the flow: when an issue picked via `/iflow-pick` carries the **`yolo`** label, it is routed through `/iflow-yolo` (one combined confirmation). Controlled by `label_flows` (default `true`) and `yolo_label` (default `"yolo"`) under `[issueflow]` in `.issueflows/config.toml`; re-run `issue-flow update` after changing them.
125
+
122
126
 
123
127
  `/iflow-fix` opens an interactive iterative-fixes session: it creates one GitHub issue + long-lived branch, then loops over many small fixes (each gets a short plan and is implemented only on confirmation, recorded as a dated bullet in `issue<N>_status.md`), and ends with `/iflow-close`. It is off-path (never auto-dispatched); while a session is active, drive it with `/iflow-fix` + `/iflow-close`, not `/iflow`.
124
128
 
@@ -38,13 +38,17 @@ When a bump applies: read `.cursor/skills/iflow-version-bump/SKILL.md`, run the
38
38
 
39
39
  - **`stay`**, **`stay on branch`**, **`don't switch`**, or **`dont switch to main`** → after the PR step, stay on the issue branch instead of switching back to the default branch.
40
40
 
41
+ ## Hands-off token (command input)
42
+
43
+ - **`yolo`** (used by `/iflow-yolo`) → close the loop without user input: write the `HISTORY.md` bullet without a confirm prompt (step 3), **merge the PR** right after opening it (step 8a), then switch back to the default branch and `git pull --ff-only` (step 9, unless `stay` was also passed).
44
+
41
45
  ## Instructions
42
46
 
43
47
  1. **Sanity check** — Run the project test suite (e.g. `uv run pytest`) and any checks the repo relies on. Skim the diff; avoid bundling unrelated changes. Confirm that any design decisions or good practices that emerged from this issue are captured under `.issueflows/04-designs-and-guides/` before committing.
44
48
 
45
49
  2. **Optional version bump** — If the user asked for a bump (see above), follow `.cursor/skills/iflow-version-bump/SKILL.md` and run `uv version --bump <patch|minor|major>`. If there is no bumpable `pyproject.toml`, skip and continue.
46
50
 
47
- 3. **Update `HISTORY.md`** — Unless the user passed `nohistory`, follow `.cursor/skills/iflow-history-update/SKILL.md`. If step 2 did not bump the version, append a bullet to the `## [Unreleased]` section. If step 2 bumped the version, promote `## [Unreleased]` to `## [<new_version>] - <YYYY-MM-DD>` and open a fresh empty `## [Unreleased]` above it. Show the diff and confirm once before writing. Skip with a note if `HISTORY.md` does not exist at the project root.
51
+ 3. **Update `HISTORY.md`** — Unless the user passed `nohistory`, follow `.cursor/skills/iflow-history-update/SKILL.md`. If step 2 did not bump the version, append a bullet to the `## [Unreleased]` section. If step 2 bumped the version, promote `## [Unreleased]` to `## [<new_version>] - <YYYY-MM-DD>` and open a fresh empty `## [Unreleased]` above it. Show the diff and confirm once before writing. Skip with a note if `HISTORY.md` does not exist at the project root. With the `yolo` token, do not ask — decide yourself and write the bullet (issue title, or `log "..."` text) directly.
48
52
 
49
53
  4. **Issue tracking** — Under `.issueflows/01-current-issues/`, update the status file: remaining work, checklists, and **`- [x] Done`** only when the issue is fully resolved. If fully resolved, move that issue's markdown files (`issue<n>_*`) to `.issueflows/03-solved-issues/`. If partially resolved, move to `.issueflows/02-partly-solved-issues/`. Follow any stricter rules in `.cursor/rules/issueflow-rules.mdc` if present.
50
54
 
@@ -56,11 +60,13 @@ When a bump applies: read `.cursor/skills/iflow-version-bump/SKILL.md`, run the
56
60
 
57
61
  8. **Pull request** — Open (or update) a PR against the default branch. Body should explain the change, how to test, and link the GitHub issue (`Closes #n` / `Refs #n`).
58
62
 
59
- 9. **Switch back when safe** — Detect the default branch (prefer `gh repo view --json defaultBranchRef -q .defaultBranchRef.name`, else `git symbolic-ref --quiet --short refs/remotes/origin/HEAD`, else `main`). If the input included `stay`, `stay on branch`, `don't switch`, or `dont switch to main`, stay on the issue branch and report that opt-out. Otherwise run `git status --porcelain` after the PR is open or updated. If it is clean, run `git switch <default>` and then `git pull --ff-only`; a clean tree here means the branch work has been committed and pushed to the PR branch. If dirty, stay on the current branch, list the uncommitted paths, and explain that switching is unsafe until those changes are committed, stashed, or discarded by the user. Never delete the issue branch here.
63
+ 8a. **Merge the PR (`yolo` token only)** — Merge immediately with `gh pr merge <number> --squash` (never `--delete-branch`; branch deletion stays in `/iflow-cleanup`). If GitHub refuses (branch protection, pending checks), fall back to `gh pr merge <number> --squash --auto` and report the merge as queued. If even `--auto` fails, stop the hands-off behaviour, report the error, and leave the PR open. Without the `yolo` token, skip this step merging stays a user decision (step 10).
64
+
65
+ 9. **Switch back when safe** — Detect the default branch (prefer `gh repo view --json defaultBranchRef -q .defaultBranchRef.name`, else `git symbolic-ref --quiet --short refs/remotes/origin/HEAD`, else `main`). If the input included `stay`, `stay on branch`, `don't switch`, or `dont switch to main`, stay on the issue branch and report that opt-out. Otherwise run `git status --porcelain` after the PR is open or updated. If it is clean, run `git switch <default>` and then `git pull --ff-only`; a clean tree here means the branch work has been committed and pushed to the PR branch. If dirty, stay on the current branch, list the uncommitted paths, and explain that switching is unsafe until those changes are committed, stashed, or discarded by the user. Never delete the issue branch here. With the `yolo` token this step runs **after** the merge from step 8a so the pull brings the squash commit into the local default branch (a queued auto-merge arrives later; note that).
60
66
 
61
- 10. **After review** — Address feedback, push updates, and merge when approved and CI is green. If step 9 switched back to the default branch, switch to the PR branch again before making review fixes. Tell the user to run **`/iflow-cleanup`** once the PR is merged so the standard post-merge cleanup runs (`git fetch --prune`, `git branch -d` on merged local branches under a single consolidated confirm).
67
+ 10. **After review** — With the `yolo` token the PR was already merged in step 8a; skip to the `/iflow-cleanup` reminder. Otherwise address feedback, push updates, and merge when approved and CI is green. If step 9 switched back to the default branch, switch to the PR branch again before making review fixes. Tell the user to run **`/iflow-cleanup`** once the PR is merged so the standard post-merge cleanup runs (`git fetch --prune`, `git branch -d` on merged local branches under a single consolidated confirm).
62
68
 
63
- 11. **Output** — Summarize commit, push result, PR URL, whether the working copy switched back to the default branch or stayed on the issue branch, and next step (`/iflow-cleanup` after merge, or "blocked on …" if stuck).
69
+ 11. **Output** — Summarize commit, push result, PR URL, whether the working copy switched back to the default branch or stayed on the issue branch, the merge result when `yolo` applied (merged, or queued via `--auto`), and next step (`/iflow-cleanup` after merge, or "blocked on …" if stuck).
64
70
 
65
71
  ## Constraints
66
72
 
@@ -40,7 +40,8 @@ Do **not** use this skill from `/iflow`, `/iflow-start`, or `/iflow-close`. `/if
40
40
  5. **Create a `fix` issue (only when requested).** Use `gh issue create` (e.g. `chore: general fixes`), confirm title/body first, capture the new number. A fresh issue is created each time — never reuse an existing open general-fixes issue.
41
41
  6. **Over-large issue (note only).** If the chosen issue is too big for one PR, **mention** that breaking it into sub-issues is possible and tracked as a follow-up (Phase B of issue #63). Do **not** auto-create sub-issues here.
42
42
 
43
- ### Phase 2 create the branch
43
+ 7. **Label-driven yolo flow.** If the chosen issue carries the **`yolo`** label (case-insensitive), announce it and fold `/iflow-yolo`'s consolidated confirm into the pick confirmation (one prompt: branch + full `init → plan → start → close yolo` chain). On yes, run Phase 2 then follow the `iflow-yolo` skill **instead of** the Phase 3 handoff — its preflight still applies, but do not re-ask its confirm. Configurable via `label_flows` / `yolo_label` under `[issueflow]` in `.issueflows/config.toml` (re-run `issue-flow update` after changing).
44
+
44
45
 
45
46
  1. **Require a clean tree** (`git status --porcelain`). If dirty, **stop** and ask the user to commit/stash.
46
47
  2. **Branch off the default** — switch to default, fast-forward, then `git switch -c <N>-<short-slug>` (GitHub numeric convention). Confirm a non-obvious slug.
@@ -50,6 +51,9 @@ Do **not** use this skill from `/iflow`, `/iflow-start`, or `/iflow-close`. `/if
50
51
 
51
52
  1. **Ask** whether to continue with `/iflow-plan`. Do not auto-run it.
52
53
 
54
+ 2. **Exception:** when the `yolo`-label routing was confirmed in Phase 1, skip this handoff — the `iflow-yolo` chain (which includes `/iflow-init`) takes over after the branch is created.
55
+
56
+
53
57
  ## Constraints
54
58
 
55
59
  - Off-path: never auto-dispatch from `/iflow`, `/iflow-start`, or `/iflow-close`.
@@ -3,7 +3,8 @@ name: iflow-yolo
3
3
  description: >-
4
4
  Run the /iflow-yolo workflow: preflight (no default branch, clean tree,
5
5
  passing tests), single consolidated confirm, then chain init → plan → start
6
- → close for small, low-risk issues. Stops on any ambiguity.
6
+ → close yolo (hands-off close: auto changelog, PR merge, default-branch
7
+ pull) for small, low-risk issues. Stops on any ambiguity.
7
8
  disable-model-invocation: true
8
9
  ---
9
10
 
@@ -26,7 +27,7 @@ Use only for minor fixes, doc tweaks, and similar low-risk changes. Anything non
26
27
 
27
28
  3. **Tests must pass up front.** Run `uv run pytest` (or the repo's documented test command). On any failure, **stop** before the chain starts.
28
29
 
29
- 4. **Single consolidated confirm.** Present the full planned chain explicitly (issue reference, target branch, repo, downstream commands including any `bump` / `patch` / `draft` / `stay` flags). Require an explicit yes; any other input aborts.
30
+ 4. **Single consolidated confirm.** Present the full planned chain explicitly (issue reference, target branch, repo, downstream commands including any `bump` / `patch` / `draft` / `stay` flags). Require an explicit yes; any other input aborts. (When `/iflow-pick` routed here via the yolo issue label, its combined confirmation already covered this — do not ask twice.)
30
31
 
31
32
  ## Chain
32
33
 
@@ -36,11 +37,11 @@ Once preflight has passed and the user confirmed:
36
37
  2. **`/iflow-plan`** — write a **short** `issue<N>_plan.md` (Goal + Approach + Files to touch + Test strategy). Auto-confirm — the consolidated confirm above covered it. If the scope check reveals the change is not actually small, **abort the yolo chain** and tell the user to run the commands individually.
37
38
  3. **`/iflow-start`** — implement the plan without an additional plan-mode prompt.
38
39
  4. **Re-run tests.** `uv run pytest` again. On failure, **stop** before commit / push / PR.
39
- 5. **`/iflow-close`** — run the full close flow (optional version bump if the user passed `bump` / `patch` / `minor` / `major`, issue-folder update, commit, push, PR, and the default-branch switch unless `stay` / `don't switch` text was passed). Do **not** chain `/iflow-cleanup` automatically — the PR has not merged yet.
40
+ 5. **`/iflow-close yolo`** — run the close flow with the `yolo` token (plus forwarded `bump` / `log` / `nohistory` / `draft` / `stay` tokens). The `yolo` token makes close hands-off: changelog bullet written without a confirm prompt, PR **merged** via `gh pr merge --squash` (fall back to `--squash --auto` when branch protection or pending checks block it), then default-branch switch + `git pull --ff-only`. `draft` conflicts with auto-merge — when passed, skip the merge and say so. Do **not** chain `/iflow-cleanup` automatically — local branch deletion stays a user decision.
40
41
 
41
42
  ## Post-run
42
43
 
43
- Report the PR URL and final branch. By default `/iflow-close` switches back to the default branch when the tree is clean; forwarded `stay` text leaves the user on the issue branch instead. Remind them to re-run `/iflow-cleanup` once the PR merges.
44
+ Report the PR URL, the merge result (merged, or queued via `--auto`), and the final branch. By default `/iflow-close yolo` merges the PR and switches back to the default branch with a pull; forwarded `stay` text leaves the user on the issue branch instead. Remind them that `/iflow-cleanup` will delete the now-merged local branch when they are ready.
44
45
 
45
46
  ## Constraints
46
47
 
@@ -179,4 +179,8 @@ local/
179
179
  __marimo__/
180
180
 
181
181
  # graphify
182
- graphify-out/cache/
182
+ graphify-out/cache/
183
+
184
+ # scratch / throwaway artifacts
185
+ scratch.db
186
+ tmp/
@@ -0,0 +1,13 @@
1
+ # Issue #62 — readme links not working on pypi
2
+
3
+ - **URL:** https://github.com/cellpy/cellpy-core/issues/62
4
+ - **State:** open
5
+ - **Labels:** yolo
6
+ - **Captured:** 2026-07-02
7
+
8
+ ## Original description
9
+
10
+ The links in the readme do not work on pypi. I guess the docs folder is not a
11
+ part of the package. If so, consider either linking to the locations in the
12
+ github repo or include those three files that have links on readme into the
13
+ package.
@@ -0,0 +1,22 @@
1
+ # Issue #62 — plan
2
+
3
+ ## Goal
4
+
5
+ Make the documentation links in `README.md` work when rendered on PyPI.
6
+
7
+ ## Approach
8
+
9
+ Relative links (`docs/...`) break on PyPI because the docs folder is not part
10
+ of the rendered page context. Replace the three relative doc links in the
11
+ README with absolute GitHub URLs pointing at `main`
12
+ (`https://github.com/cellpy/cellpy-core/blob/main/docs/...`). No packaging
13
+ changes — simplest fix, keeps the sdist/wheel lean.
14
+
15
+ ## Files to touch
16
+
17
+ - `README.md`
18
+
19
+ ## Test strategy
20
+
21
+ - `uv run pytest` (no code changes, suite must stay green).
22
+ - Visual check that the rewritten URLs resolve on GitHub.
@@ -0,0 +1,14 @@
1
+ # Issue #62 — status
2
+
3
+ - [x] Done
4
+
5
+ ## What was done
6
+
7
+ - 2026-07-02: Replaced the three relative doc links in `README.md` with
8
+ absolute GitHub URLs (`https://github.com/cellpy/cellpy-core/blob/main/docs/...`)
9
+ so they render correctly on PyPI. Verified all three target files exist.
10
+ Full test suite green (107 passed). No packaging changes needed.
11
+
12
+ ## Remaining work
13
+
14
+ None.
@@ -0,0 +1,7 @@
1
+ # Issue #64: small update in readme
2
+
3
+ Source: https://github.com/cellpy/cellpy-core/issues/64
4
+
5
+ ## Original issue text
6
+
7
+ The developer section in readme mentions running "uv venv". We should instead use the built in project manager in uv (so, developers should run "uv sync" after cloning the repo, and "uv add some-package" when adding new dependencies).
@@ -0,0 +1,28 @@
1
+ # Issue #64 plan: small update in readme
2
+
3
+ ## Goal
4
+
5
+ The Developing section in `README.md` tells developers to run `uv venv` +
6
+ `uv pip install -e ".[dev]"`. Switch to uv's built-in project workflow:
7
+ `uv sync` after cloning, `uv add` for new dependencies.
8
+
9
+ ## Approach
10
+
11
+ Rewrite the "Development Workflow" and "Common Commands" parts of the
12
+ Developing section:
13
+
14
+ - Drop `uv venv` + activate + `uv pip install -e ".[dev]"`; replace with a
15
+ single `uv sync` step (creates `.venv` and installs all locked deps).
16
+ - Keep `uv add` / `uv add --dev` for adding dependencies.
17
+ - Run tests via `uv run pytest`.
18
+ - Update "Common Commands" to project-manager equivalents (`uv remove`,
19
+ `uv sync --upgrade`, `uv tree`).
20
+
21
+ ## Files to touch
22
+
23
+ - `README.md` (only)
24
+
25
+ ## Test strategy
26
+
27
+ Docs-only change; run `uv run pytest` before commit to confirm the suite is
28
+ still green (yolo chain requirement).
@@ -0,0 +1,17 @@
1
+ # Issue #64 status: small update in readme
2
+
3
+ - [x] Done
4
+
5
+ ## What was done
6
+
7
+ - Rewrote the "Development Workflow" part of `README.md` Developing section:
8
+ replaced `uv venv` + activate + `uv pip install -e ".[dev]"` with a single
9
+ `uv sync` step; kept `uv add` / `uv add --dev`; tests now via `uv run pytest`.
10
+ - Updated "Common Commands" to project-manager equivalents (`uv sync`,
11
+ `uv remove`, `uv sync --upgrade`, `uv tree`), dropping the `uv pip ...`
12
+ commands.
13
+ - Added a `HISTORY.md` bullet under `[Unreleased]`.
14
+
15
+ ## Remaining work
16
+
17
+ None. Docs-only change; test suite green (107 passed).
@@ -0,0 +1,9 @@
1
+ # Issue #66: code cleaning and test completion
2
+
3
+ Source: https://github.com/cellpy/cellpy-core/issues/66
4
+
5
+ ## Original issue text
6
+
7
+ Do some refactoring and cleaning up in the codebase. Check .issueflows\04-designs-and-guides\code-review-2026-07.md
8
+ Create appropriate e2e tests.
9
+ Create appropriate profiling tests.
@@ -0,0 +1,140 @@
1
+ # Issue #66 plan: code cleaning and test completion
2
+
3
+ Source issue: [issue66_original.md](issue66_original.md)
4
+ Driving doc: [code-review-2026-07.md](../04-designs-and-guides/code-review-2026-07.md)
5
+ Branch: `66-code-cleaning-and-test-completion`
6
+
7
+ ## Goal
8
+
9
+ Land the mechanical cleanup from the 2026-07 code review (hygiene, API truthing,
10
+ engine guards) and close the test gaps with native-path e2e tests and opt-in
11
+ profiling benchmarks.
12
+
13
+ ## Constraints
14
+
15
+ - **In scope (grilled + confirmed):** review-doc items D1 (hygiene), D2 (API
16
+ truthing), D5 (engine guards), D7 (test gaps) + e2e + profiling tests.
17
+ - **Out of scope (deferred, filed):** D3 selectors decision (#67, see
18
+ `selector-dead-code-deferral.md`), D4 units fallback (A2, #68), CI coverage
19
+ reporting (#69), B1/B2 design pass (#70), structural refactors (no module
20
+ splits/moves — review verdict: engine is healthy; avoid churn before cellpy
21
+ pins a tag).
22
+ - Parity is enforced by tests (migration doc): golden tests must stay green
23
+ byte-for-byte; no changes to computed values.
24
+ - Legacy bridge (`OldCellpyCellCore`) behavior unchanged — cellpy imports only
25
+ this (verified: `cellpy/readers/cellreader.py:72` is the sole entry).
26
+ - Google-style docstrings; project loggers, not root `logging` calls.
27
+
28
+ ### Prior art
29
+
30
+ - `tests/test_golden.py` — legacy-bridge e2e on vendored Arbin parquet with
31
+ golden numbers (`ARBIN_N_STEPS=103`, `ARBIN_N_CYCLES=18`); new native e2e
32
+ mirrors this oracle, does not duplicate the legacy path.
33
+ - `tests/test_harmonized_fixture.py` + `tests/data/arbin_cc_harmonized_raw.parquet`
34
+ — harmonized (native-naming) fixture already vendored; reuse for native e2e.
35
+ - `Data.from_raw_frame` (issue #55) — existing validating front door; native
36
+ e2e drives through it, engine guards (B3) extend the same validation spirit
37
+ into `make_step_table` / `make_summary`.
38
+ - Exclude-types support (issue #54) — covered by `tests/test_exclude_types.py`;
39
+ e2e exercises it as a pipeline variant only.
40
+ - `.issueflows/00-tools/` — only README, no reusable helper applies.
41
+ - graphify: not installed for this repo state (no `graphify-out/` consulted
42
+ beyond rules; grep-based discovery used).
43
+
44
+ ## Approach
45
+
46
+ Phased commits on the issue branch, one concern per commit (Conventional
47
+ Commits), tests green after each phase.
48
+
49
+ ### Phase 1 — hygiene (D1)
50
+
51
+ 1. `pyproject.toml`: remove `duckdb`, `duckdb-engine`, `sqlalchemy`, `narwhals`
52
+ (keep `pyarrow`); drop `uv-dynamic-versioning` from `[build-system]`; real
53
+ description; fix wrong classifier; `uv sync` to refresh lock.
54
+ 2. Delete tracked junk: `scratch.db`, `tmp/simple.csv`, `tmp/simple.parquet`
55
+ (+ `.gitignore` entries for `scratch.db`, `tmp/`).
56
+ 3. Replace root-logger calls with module loggers (`logger = logging.getLogger(__name__)`)
57
+ in `summarizers.py`, `settings_base.py`, `units.py`.
58
+ 4. **A3 falsy-override fix** in `summarizers._classify_steps`: membership test
59
+ (`key in orl`) instead of `or`-fallback for all four override keys +
60
+ regression test with `0.0` override.
61
+ 5. **A5**: `make_step_table(raw_limits=None)` → build fresh
62
+ `asdict(CellpyLimits())` per call; keep `DEFAULT_RAW_LIMITS` as a frozen
63
+ `MappingProxyType` for introspection/back-compat (`test_limits.py` uses it).
64
+ 6. **A6**: delete `Data.cycle` / `Data.step` dead fields (verified unused in
65
+ cellpy).
66
+ 7. CI: add ruff step (`ruff check` + `ruff format --check`) to
67
+ `.github/workflows/simpletest.yml`; minimal `[tool.ruff]` config.
68
+
69
+ ### Phase 2 — API truthing (D2)
70
+
71
+ 1. `src/cellpycore/__init__.py`: minimal curated exports —
72
+ `CellpyCellCore`, `OldCellpyCellCore`, `Data`, `make_step_table`,
73
+ `make_summary`, `default_schema` + schema types, `NoDataFound`;
74
+ `__version__` via `importlib.metadata.version("cellpy-core")` with
75
+ `PackageNotFoundError` fallback. `metadata` stays a submodule import.
76
+ 2. **A4**: delete unused `selector` / `select_columns` / `find_end_voltage`
77
+ params from native `make_core_summary` (legacy bridge keeps its
78
+ `find_end_voltage`).
79
+ 3. Add `py.typed` marker (+ ensure hatch includes it).
80
+ 4. Docs: fill `this-project.md` stubs; README project description.
81
+
82
+ ### Phase 3 — engine guards (D5/B3)
83
+
84
+ - `make_step_table` / `make_summary`: raise `NoDataFound` when `data.raw`
85
+ (resp. `data.steps`) is `None`/missing; raise `ValueError` naming the missing
86
+ required columns. Tests for both.
87
+
88
+ ### Phase 4 — tests (D7 + e2e + profiling)
89
+
90
+ 1. `tests/test_e2e.py` — native pipeline via public API only
91
+ (`from cellpycore import ...`): harmonized raw parquet →
92
+ `Data.from_raw_frame` → `make_step_table` → `make_summary` →
93
+ exclude-types and scaled-columns variants; assert golden cycle/step counts
94
+ and spot values. Edge cases: empty raw frame, cycle without charge step,
95
+ `override_raw_limits={"current_hard": 0.0}`; thread-safety smoke (two
96
+ schemas, parallel `make_step_table` via `ThreadPoolExecutor`).
97
+ 2. `tests/test_benchmarks.py` — `pytest-benchmark` (new dev dep):
98
+ `make_step_table` + `make_summary` on Arbin fixture + small fixture;
99
+ `@pytest.mark.benchmark`, excluded from default run via addopts
100
+ (`-m "not benchmark"`); run manually: `uv run pytest -m benchmark`.
101
+
102
+ ## Files to touch
103
+
104
+ - `pyproject.toml` — deps, build-system, metadata, ruff config, addopts, dev dep
105
+ - `uv.lock` — regenerated
106
+ - `scratch.db`, `tmp/` — deleted; `.gitignore` — updated
107
+ - `.github/workflows/simpletest.yml` — ruff step
108
+ - `src/cellpycore/__init__.py` — public API + `__version__`
109
+ - `src/cellpycore/py.typed` — new marker
110
+ - `src/cellpycore/summarizers.py` — A3, A5, logger, guards
111
+ - `src/cellpycore/cell_core.py` — A6, A4
112
+ - `src/cellpycore/settings_base.py`, `src/cellpycore/units.py` — logger only
113
+ - `tests/test_e2e.py`, `tests/test_benchmarks.py` — new
114
+ - `tests/test_limits.py` — adjust for frozen `DEFAULT_RAW_LIMITS`
115
+ - `README.md`, `.issueflows/04-designs-and-guides/this-project.md` — docs
116
+
117
+ ## Test strategy
118
+
119
+ - Full suite: `uv run pytest` (must stay green after every phase; golden tests
120
+ are the parity gate).
121
+ - New: A3 regression (`0.0` override), guard tests (`NoDataFound`,
122
+ missing-column `ValueError`), native e2e, thread-safety smoke.
123
+ - Benchmarks opt-in: `uv run pytest -m benchmark` (not in CI).
124
+ - Lint locally before push: `uv run ruff check` + `uv run ruff format --check`.
125
+
126
+ ## Open questions
127
+
128
+ - None — resolved via grilling 2026-07-03 (scope split, minimal public API,
129
+ native-path e2e, pytest-benchmark opt-in, no structural refactor).
130
+
131
+ ## Follow-ups (filed as GitHub issues, not this issue)
132
+
133
+ - [#67](https://github.com/cellpy/cellpy-core/issues/67) — D3: selectors module
134
+ decision (port vs bridge-only).
135
+ - [#68](https://github.com/cellpy/cellpy-core/issues/68) — D4/A2: units
136
+ fallback → explicit values or `metadata.CellMeta`.
137
+ - [#69](https://github.com/cellpy/cellpy-core/issues/69) — CI coverage
138
+ reporting.
139
+ - [#70](https://github.com/cellpy/cellpy-core/issues/70) — B1/B2 design pass
140
+ (schema-agnostic stat columns; cycle_mode polarity default).
@@ -0,0 +1,42 @@
1
+ # Issue #66 status: code cleaning and test completion
2
+
3
+ - [x] Done
4
+
5
+ Plan: [issue66_plan.md](issue66_plan.md) (confirmed 2026-07-03, deferred items filed as #67–#70)
6
+
7
+ ## What's done
8
+
9
+ All four plan phases implemented on branch `66-code-cleaning-and-test-completion`
10
+ (one commit per phase, suite green after each; 120 passed + 3 opt-in benchmarks):
11
+
12
+ - **Phase 1 — hygiene** (`chore:` commit): removed unused deps (duckdb,
13
+ duckdb-engine, sqlalchemy, narwhals) + uv-dynamic-versioning; real pyproject
14
+ description/classifier; deleted tracked `scratch.db` / `tmp/*` (+ gitignore);
15
+ module loggers replace root `logging.*` calls; **A3** falsy-override fix
16
+ (explicit `0.0` wins) + regression test; **A5** `DEFAULT_RAW_LIMITS` frozen
17
+ (`MappingProxyType`), `make_step_table` builds fresh limits per call;
18
+ **A6** dead `Data.cycle` / `Data.step` removed; ruff config + CI lint step;
19
+ ruff check --fix + format applied repo-wide.
20
+ - **Phase 2 — API truthing** (`feat:` commit): curated public API in
21
+ `cellpycore/__init__.py` + `__version__` (importlib.metadata); `py.typed`;
22
+ **A4** dead `find_end_voltage`/`select_columns` removed from *native*
23
+ `make_core_summary` (legacy bridge keeps them — cellpy passes
24
+ `select_columns`); README description + example; `this-project.md` filled.
25
+ - **Phase 3 — engine guards** (`feat:` commit): `NoDataFound` for missing
26
+ `raw`/`steps`, `ValueError` naming every missing required column at
27
+ `make_step_table` / `make_summary`; guard tests.
28
+ - **Phase 4 — tests** (`test:` commit): `tests/test_e2e.py` native pipeline
29
+ via public API on the harmonized Arbin fixture (golden counts 103/18/1457,
30
+ exclude-types + scaled-columns variants, empty-frame and discharge-only
31
+ edge cases, thread-safety smoke with parallel schemas);
32
+ `tests/test_benchmarks.py` (pytest-benchmark, opt-in via
33
+ `uv run pytest -m benchmark`). Engine fix: Null-dtype raw signal columns
34
+ skipped in `make_step_table` (all-null placeholders crashed polars).
35
+ - Deferred issues filed: #67 (selectors), #68 (units fallback), #69 (CI
36
+ coverage), #70 (B1/B2 design pass).
37
+ - graphify graph refreshed.
38
+
39
+ ## Remaining work
40
+
41
+ - None. Closed via `/iflow-close` 2026-07-03 (HISTORY.md bullet added, no
42
+ version bump requested). Deferred follow-ups live in issues #67–#70.
@@ -0,0 +1,15 @@
1
+ # Issue #67: Selectors: port remaining functions to native schema or make bridge-only
2
+
3
+ Source: https://github.com/cellpy/cellpy-core/issues/67
4
+
5
+ ## Original issue text
6
+
7
+ Deferred from #66 (code review 2026-07, item D3/A1).
8
+
9
+ `selectors.py` is broken with its own default schema: `get_step_numbers`, `get_cycle_numbers`, `get_rates` default to `default_schema()` but dereference legacy-only attribute names (`data_point_txt`, `voltage_txt`, `cycle_index_txt`, ...), so they raise `AttributeError` unless legacy headers are injected. Module is also pandas-only and has zero test coverage.
10
+
11
+ Decide and implement one of:
12
+ - port the functions to the native schema + polars, with tests, or
13
+ - move the module next to `legacy.py` and document it as bridge-only until removal.
14
+
15
+ See `.issueflows/04-designs-and-guides/code-review-2026-07.md` (A1, D3) and `selector-dead-code-deferral.md`.
@@ -0,0 +1,114 @@
1
+ # Issue #67 plan: selectors → bridge-only `legacy_selectors`
2
+
3
+ Confirmed via grill-me (2026-07-03).
4
+
5
+ ## Goal
6
+
7
+ Relocate the three remaining pandas selector helpers (`get_step_numbers`,
8
+ `get_cycle_numbers`, `get_rates`) to a clearly bridge-only module, fix the
9
+ `default_schema()` trap by defaulting to `legacy_schema()`, and add unit +
10
+ golden tests. No native polars port.
11
+
12
+ ## Grill decisions (locked)
13
+
14
+ | # | Decision |
15
+ |---|----------|
16
+ | 1 | **Bridge-only** — not a native polars port |
17
+ | 2 | **`legacy_selectors.py`** — delete `selectors.py`; no shim |
18
+ | 3 | **`legacy_schema()` default** — new helper in `config.py`, used when `schema is None` |
19
+ | 4 | **Tests: unit + golden** — handcrafted legacy frames always run; one golden smoke with parquet `skipif` |
20
+ | 5 | **Relocation + schema fix only** — preserve cellpy-parity behavior; do not fix dead code (e.g. unreachable `rate = 0.05` block) |
21
+
22
+ ## Constraints
23
+
24
+ - Read-only on cellpy repo; no cellpy changes required (cellpy owns its own
25
+ `cellreader.py` copies; #45 removed the last `cellpycore.selectors` import).
26
+ - Functions stay **pandas-only** (dict / `pandas.DataFrame` returns unchanged).
27
+ - Not part of the public API (`__init__.py` exports unchanged).
28
+ - Google-style docstrings on new/changed public helpers.
29
+
30
+ ### Prior art
31
+
32
+ - `src/cellpycore/selectors.py` — current broken module (legacy attr names +
33
+ `default_schema()`).
34
+ - `src/cellpycore/legacy.py` — `HeadersNormal`, `HeadersStepTable`,
35
+ `HeadersSummary` (target neighbourhood).
36
+ - `config.default_schema()` — native `RawCols`/`StepCols`/`CycleCols` bundle.
37
+ - `tests/test_golden._legacy_schema()` — private duplicate; replace with shared
38
+ `config.legacy_schema()`.
39
+ - `tests/test_schema.py` — imports `selectors`, asserts removed #45 functions
40
+ absent; update import path.
41
+ - `cellpy/readers/cellreader.py` — verbatim upstream copies of the three
42
+ functions (parity reference, not imported).
43
+ - `.issueflows/04-designs-and-guides/this-project.md` — already notes selectors
44
+ as bridge-only/broken; update wording post-fix.
45
+ - Graph community (selectors): `get_step_numbers`, `get_cycle_numbers`,
46
+ `get_rates` — isolated, no engine callers.
47
+
48
+ ## Approach
49
+
50
+ 1. **Add `legacy_schema()` to `config.py`**
51
+ - `Schema(raw=HeadersNormal(), cycle=HeadersSummary(), step=HeadersStepTable())`.
52
+ - Docstring: bridge/legacy callers only; engine uses `default_schema()`.
53
+ - Import header classes from `cellpycore.legacy` (lazy or top-level — match
54
+ existing `config.py` style).
55
+
56
+ 2. **Move `selectors.py` → `legacy_selectors.py`**
57
+ - Move the three functions verbatim (only change: `default_schema()` →
58
+ `legacy_schema()` in each `if schema is None` block).
59
+ - Module-level docstring: bridge-only, pandas + legacy column names required,
60
+ not for native `CellpyCellCore` / `default_schema()` consumers.
61
+ - Delete `src/cellpycore/selectors.py`.
62
+
63
+ 3. **Deduplicate test helper**
64
+ - `tests/test_golden.py`: replace `_legacy_schema()` with
65
+ `config.legacy_schema()`.
66
+
67
+ 4. **Update `tests/test_schema.py`**
68
+ - Drop `selectors` import.
69
+ - Move `test_no_legacy_selector_functions` to new test file (or delete if
70
+ module gone — function removal is already covered by #45; optional thin
71
+ assert that `legacy_selectors` has no `create_selector`).
72
+
73
+ 5. **Add `tests/test_legacy_selectors.py`**
74
+ - **Unit (always run):** minimal legacy-named pandas raw + step tables;
75
+ assert `get_step_numbers` dict keys/values, `get_cycle_numbers` without
76
+ rate filter, `get_rates` columns; confirm `schema=None` uses
77
+ `legacy_schema()` (no `AttributeError`).
78
+ - **Golden (skipif parquet missing):** reuse `test_golden._step_table()` +
79
+ `CYCLER_CC_*` constants; call `get_step_numbers("charge")`,
80
+ `get_cycle_numbers()`, `get_rates()` on real legacy-shaped step table;
81
+ assert cycle count matches `CYCLER_CC_N_CYCLES` and charge steps exist
82
+ for cycle 1.
83
+
84
+ 6. **Docs touch-up**
85
+ - `this-project.md`: selectors line → "bridge-only in `legacy_selectors.py`,
86
+ requires `legacy_schema()`".
87
+ - Optional one-liner in `code-review-2026-07.md` A1 noting resolution via #67
88
+ (no rewrite of the report).
89
+
90
+ ## Files to touch
91
+
92
+ | File | Change |
93
+ |------|--------|
94
+ | `src/cellpycore/config.py` | Add `legacy_schema()` |
95
+ | `src/cellpycore/legacy_selectors.py` | New — moved functions + module docstring |
96
+ | `src/cellpycore/selectors.py` | Delete |
97
+ | `tests/test_legacy_selectors.py` | New — unit + golden tests |
98
+ | `tests/test_golden.py` | Use `legacy_schema()` |
99
+ | `tests/test_schema.py` | Remove `selectors` import; adjust/remove selector asserts |
100
+ | `.issueflows/04-designs-and-guides/this-project.md` | Update non-goals line |
101
+
102
+ ## Test strategy
103
+
104
+ ```bash
105
+ uv run pytest tests/test_legacy_selectors.py -v
106
+ uv run pytest # full suite green
107
+ ```
108
+
109
+ Golden test uses same `pytest.mark.skipif` + `CYCLER_CC_RAW` pattern as
110
+ `test_golden.py`.
111
+
112
+ ## Open questions
113
+
114
+ None — all branches resolved in grill-me.
@@ -0,0 +1,19 @@
1
+ # Issue #67 status: selectors → bridge-only `legacy_selectors`
2
+
3
+ - [x] Done
4
+
5
+ Plan: [issue67_plan.md](issue67_plan.md) (confirmed 2026-07-03, grill-me)
6
+
7
+ ## What's done
8
+
9
+ - Added `config.legacy_schema()` (lazy import of legacy header classes).
10
+ - Moved three functions to `src/cellpycore/legacy_selectors.py`; deleted `selectors.py`.
11
+ - `tests/test_legacy_selectors.py` — unit tests (always run) + golden smoke (`skipif`).
12
+ - `tests/test_golden.py` — uses shared `legacy_schema()`; dropped private `_legacy_schema()`.
13
+ - `tests/test_schema.py` — removed `selectors` import and selector asserts.
14
+ - Docs: `this-project.md`, `code-review-2026-07.md` A1 resolution note.
15
+ - Suite green: 123 passed (+ 3 deselected benchmarks).
16
+
17
+ ## Remaining work
18
+
19
+ None.
@@ -0,0 +1,13 @@
1
+ # Issue #68: Units fallback: replace crashing data.<attr> fallback with explicit values or CellMeta
2
+
3
+ Source: https://github.com/cellpy/cellpy-core/issues/68
4
+
5
+ ## Original issue text
6
+
7
+ Deferred from #66 (code review 2026-07, item D4/A2).
8
+
9
+ `units.get_converter_to_specific` reads `data.raw_units`, `data.mass`, `data.active_electrode_area`, `data.volume`; `nominal_capacity_as_absolute` reads `data.nom_cap_specifics`, `data.nom_cap`. The core `Data` class has none of these attributes, so the fallback path (taken whenever a caller omits `specific_converters` in `add_scaled_summary_columns`) raises `AttributeError` for standalone cellpy-core users.
10
+
11
+ Make these functions take explicit values or a `metadata.CellMeta` (which already has `mass`, `active_electrode_area`, `nom_cap`, `nom_cap_specifics`) — a natural fit with the metadata-boundary decision. Also remove the pointless `try/except Exception: raise` block in `nominal_capacity_as_absolute`.
12
+
13
+ See `.issueflows/04-designs-and-guides/code-review-2026-07.md` (A2, D4).