cellpycore 0.2.0__tar.gz → 0.2.2__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 (250) hide show
  1. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/rules/issueflow-rules.mdc +10 -0
  2. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow/SKILL.md +1 -1
  3. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-cleanup/SKILL.md +3 -1
  4. cellpycore-0.2.2/.cursor/skills/iflow-cycle/SKILL.md +131 -0
  5. cellpycore-0.2.2/.cursor/skills/iflow-epic/SKILL.md +137 -0
  6. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-pick/SKILL.md +2 -1
  7. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-status/SKILL.md +2 -0
  8. cellpycore-0.2.2/.gitattributes +14 -0
  9. cellpycore-0.2.2/.issueflows/03-solved-issues/issue136_original.md +60 -0
  10. cellpycore-0.2.2/.issueflows/03-solved-issues/issue136_plan.md +87 -0
  11. cellpycore-0.2.2/.issueflows/03-solved-issues/issue136_status.md +18 -0
  12. cellpycore-0.2.2/.issueflows/04-designs-and-guides/legacy-bridge-test-id.md +15 -0
  13. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/this-project.md +10 -0
  14. {cellpycore-0.2.0 → cellpycore-0.2.2}/AGENTS.md +10 -0
  15. {cellpycore-0.2.0 → cellpycore-0.2.2}/HISTORY.md +28 -0
  16. {cellpycore-0.2.0 → cellpycore-0.2.2}/PKG-INFO +1 -1
  17. {cellpycore-0.2.0 → cellpycore-0.2.2}/graphify-out/.graphify_labels.json +31 -1
  18. {cellpycore-0.2.0 → cellpycore-0.2.2}/graphify-out/GRAPH_REPORT.md +250 -148
  19. cellpycore-0.2.2/graphify-out/graph.html +305 -0
  20. {cellpycore-0.2.0 → cellpycore-0.2.2}/graphify-out/graph.json +10586 -4989
  21. {cellpycore-0.2.0 → cellpycore-0.2.2}/graphify-out/manifest.json +66 -38
  22. {cellpycore-0.2.0 → cellpycore-0.2.2}/pyproject.toml +1 -1
  23. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/cell_core.py +64 -7
  24. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/legacy/headers.py +2 -0
  25. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/legacy/mapping.py +10 -8
  26. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/merge.py +28 -1
  27. cellpycore-0.2.2/src/cellpycore/py.typed +0 -0
  28. {cellpycore-0.2.0 → cellpycore-0.2.2}/uv.lock +1 -1
  29. cellpycore-0.2.0/graphify-out/graph.html +0 -305
  30. {cellpycore-0.2.0 → cellpycore-0.2.2}/.aliases +0 -0
  31. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/rules/cellpy-core-migration.mdc +0 -0
  32. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/rules/graphify.mdc +0 -0
  33. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/rules/kiss.mdc +0 -0
  34. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/rules/this-project.mdc +0 -0
  35. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/caveman/SKILL.md +0 -0
  36. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/grill-me/SKILL.md +0 -0
  37. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-archive/SKILL.md +0 -0
  38. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-close/SKILL.md +0 -0
  39. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-comments/SKILL.md +0 -0
  40. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-fix/SKILL.md +0 -0
  41. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-graphify/SKILL.md +0 -0
  42. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-history-update/SKILL.md +0 -0
  43. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-init/SKILL.md +0 -0
  44. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-pause/SKILL.md +0 -0
  45. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-plan/SKILL.md +0 -0
  46. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-start/SKILL.md +0 -0
  47. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-version-bump/SKILL.md +0 -0
  48. {cellpycore-0.2.0 → cellpycore-0.2.2}/.cursor/skills/iflow-yolo/SKILL.md +0 -0
  49. {cellpycore-0.2.0 → cellpycore-0.2.2}/.gitignore +0 -0
  50. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/00-tools/.gitkeep +0 -0
  51. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/00-tools/README.md +0 -0
  52. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/01-current-issues/.gitkeep +0 -0
  53. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/02-partly-solved-issues/.gitkeep +0 -0
  54. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/02-partly-solved-issues/issue100_original.md +0 -0
  55. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/02-partly-solved-issues/issue100_plan.md +0 -0
  56. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/02-partly-solved-issues/issue100_status.md +0 -0
  57. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/.gitkeep +0 -0
  58. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue10_original.md +0 -0
  59. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue10_plan.md +0 -0
  60. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue10_status.md +0 -0
  61. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue110_original.md +0 -0
  62. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue110_plan.md +0 -0
  63. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue110_status.md +0 -0
  64. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue112_original.md +0 -0
  65. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue112_plan.md +0 -0
  66. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue112_status.md +0 -0
  67. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue114_original.md +0 -0
  68. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue114_plan.md +0 -0
  69. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue114_status.md +0 -0
  70. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue115_original.md +0 -0
  71. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue115_plan.md +0 -0
  72. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue115_status.md +0 -0
  73. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue116_original.md +0 -0
  74. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue116_plan.md +0 -0
  75. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue116_status.md +0 -0
  76. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue117_original.md +0 -0
  77. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue117_plan.md +0 -0
  78. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue117_status.md +0 -0
  79. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue118_original.md +0 -0
  80. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue118_plan.md +0 -0
  81. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue118_status.md +0 -0
  82. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue121_original.md +0 -0
  83. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue121_plan.md +0 -0
  84. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue121_status.md +0 -0
  85. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue12_original.md +0 -0
  86. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue12_plan.md +0 -0
  87. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue12_status.md +0 -0
  88. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue13_original.md +0 -0
  89. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue13_plan.md +0 -0
  90. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue13_status.md +0 -0
  91. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue21_original.md +0 -0
  92. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue21_plan.md +0 -0
  93. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue21_status.md +0 -0
  94. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue22_original.md +0 -0
  95. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue22_plan.md +0 -0
  96. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue22_status.md +0 -0
  97. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue23_original.md +0 -0
  98. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue23_plan.md +0 -0
  99. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue23_status.md +0 -0
  100. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue24_original.md +0 -0
  101. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue24_status.md +0 -0
  102. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue29_original.md +0 -0
  103. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue29_plan.md +0 -0
  104. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue29_status.md +0 -0
  105. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue30_original.md +0 -0
  106. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue30_plan.md +0 -0
  107. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue30_status.md +0 -0
  108. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue32_original.md +0 -0
  109. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue32_plan.md +0 -0
  110. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue32_status.md +0 -0
  111. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue34_original.md +0 -0
  112. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue34_plan.md +0 -0
  113. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue36_original.md +0 -0
  114. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue36_status.md +0 -0
  115. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue39_original.md +0 -0
  116. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue39_plan.md +0 -0
  117. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue39_status.md +0 -0
  118. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue40_original.md +0 -0
  119. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue40_plan.md +0 -0
  120. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue40_status.md +0 -0
  121. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue41_original.md +0 -0
  122. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue41_plan.md +0 -0
  123. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue41_status.md +0 -0
  124. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue42_original.md +0 -0
  125. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue42_plan.md +0 -0
  126. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue42_status.md +0 -0
  127. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue43_original.md +0 -0
  128. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue43_plan.md +0 -0
  129. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue43_status.md +0 -0
  130. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue44_original.md +0 -0
  131. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue44_status.md +0 -0
  132. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue45_original.md +0 -0
  133. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue45_plan.md +0 -0
  134. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue45_status.md +0 -0
  135. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue50_original.md +0 -0
  136. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue50_plan.md +0 -0
  137. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue50_status.md +0 -0
  138. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue54_original.md +0 -0
  139. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue54_plan.md +0 -0
  140. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue54_status.md +0 -0
  141. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue55_original.md +0 -0
  142. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue55_plan.md +0 -0
  143. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue55_status.md +0 -0
  144. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue56_original.md +0 -0
  145. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue56_plan.md +0 -0
  146. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue56_status.md +0 -0
  147. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue62_original.md +0 -0
  148. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue62_plan.md +0 -0
  149. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue62_status.md +0 -0
  150. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue64_original.md +0 -0
  151. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue64_plan.md +0 -0
  152. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue64_status.md +0 -0
  153. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue66_original.md +0 -0
  154. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue66_plan.md +0 -0
  155. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue66_status.md +0 -0
  156. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue67_original.md +0 -0
  157. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue67_plan.md +0 -0
  158. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue67_status.md +0 -0
  159. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue68_original.md +0 -0
  160. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue68_plan.md +0 -0
  161. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue68_status.md +0 -0
  162. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue69_original.md +0 -0
  163. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue69_plan.md +0 -0
  164. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue69_status.md +0 -0
  165. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue70_original.md +0 -0
  166. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue70_plan.md +0 -0
  167. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue70_status.md +0 -0
  168. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue72_original.md +0 -0
  169. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue72_status.md +0 -0
  170. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue77_original.md +0 -0
  171. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue77_plan.md +0 -0
  172. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue77_status.md +0 -0
  173. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue82_original.md +0 -0
  174. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue82_status.md +0 -0
  175. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue84_original.md +0 -0
  176. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue84_plan.md +0 -0
  177. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue84_status.md +0 -0
  178. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue86_original.md +0 -0
  179. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue86_plan.md +0 -0
  180. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue86_status.md +0 -0
  181. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue91_original.md +0 -0
  182. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue91_plan.md +0 -0
  183. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue91_status.md +0 -0
  184. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue95_original.md +0 -0
  185. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue95_plan.md +0 -0
  186. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue95_status.md +0 -0
  187. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue96_original.md +0 -0
  188. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue96_plan.md +0 -0
  189. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue96_status.md +0 -0
  190. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue97_original.md +0 -0
  191. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue97_plan.md +0 -0
  192. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue97_status.md +0 -0
  193. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue98_original.md +0 -0
  194. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue98_plan.md +0 -0
  195. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue98_status.md +0 -0
  196. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue99_original.md +0 -0
  197. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue99_plan.md +0 -0
  198. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/03-solved-issues/issue99_status.md +0 -0
  199. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/.gitkeep +0 -0
  200. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/bdf-io-placement.md +0 -0
  201. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/cellpy-core-integration-into-cellpy.md +0 -0
  202. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/cellpy-core-integration-roadmap.md +0 -0
  203. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/cellpy-core-migration.md +0 -0
  204. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/code-review-2026-07.md +0 -0
  205. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/column-headers-review.md +0 -0
  206. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/metadata-scaffolding.md +0 -0
  207. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/nom-cap-naming.md +0 -0
  208. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/rawcols-dtype-map.md +0 -0
  209. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/release-procedure.md +0 -0
  210. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/selector-dead-code-deferral.md +0 -0
  211. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/step-c-rate-split.md +0 -0
  212. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/step-table-polars-migration.md +0 -0
  213. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/summary-extractors.md +0 -0
  214. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/test-data-and-fixtures.md +0 -0
  215. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/test-metadata-and-merging.md +0 -0
  216. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/04-designs-and-guides/zensical-docs.md +0 -0
  217. /cellpycore-0.2.0/src/cellpycore/py.typed → /cellpycore-0.2.2/.issueflows/05-epics/.gitkeep +0 -0
  218. {cellpycore-0.2.0 → cellpycore-0.2.2}/.issueflows/config.toml +0 -0
  219. {cellpycore-0.2.0 → cellpycore-0.2.2}/.pre-commit-config.yaml +0 -0
  220. {cellpycore-0.2.0 → cellpycore-0.2.2}/.python-version +0 -0
  221. {cellpycore-0.2.0 → cellpycore-0.2.2}/.readthedocs.yaml +0 -0
  222. {cellpycore-0.2.0 → cellpycore-0.2.2}/.vscode/settings.json +0 -0
  223. {cellpycore-0.2.0 → cellpycore-0.2.2}/LICENSE +0 -0
  224. {cellpycore-0.2.0 → cellpycore-0.2.2}/README.md +0 -0
  225. {cellpycore-0.2.0 → cellpycore-0.2.2}/ROADMAP.md +0 -0
  226. {cellpycore-0.2.0 → cellpycore-0.2.2}/SCRATCHPAD.md +0 -0
  227. {cellpycore-0.2.0 → cellpycore-0.2.2}/graphify-out/.graphify_root +0 -0
  228. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/__init__.py +0 -0
  229. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/config.py +0 -0
  230. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/curves.py +0 -0
  231. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/exceptions.py +0 -0
  232. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/extractors.py +0 -0
  233. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/legacy/__init__.py +0 -0
  234. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/legacy/limits.py +0 -0
  235. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/legacy/meta.py +0 -0
  236. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/legacy/meta_mapping.py +0 -0
  237. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/legacy/mock_core.py +0 -0
  238. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/legacy/selectors.py +0 -0
  239. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/metadata/__init__.py +0 -0
  240. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/metadata/io.py +0 -0
  241. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/metadata/models.py +0 -0
  242. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/settings_base.py +0 -0
  243. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/summarizers.py +0 -0
  244. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/testing/__init__.py +0 -0
  245. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/testing/mock_data.py +0 -0
  246. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/timestamps.py +0 -0
  247. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/units/__init__.py +0 -0
  248. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/units/converters.py +0 -0
  249. {cellpycore-0.2.0 → cellpycore-0.2.2}/src/cellpycore/units/spec.py +0 -0
  250. {cellpycore-0.2.0 → cellpycore-0.2.2}/zensical.toml +0 -0
@@ -88,6 +88,8 @@ cellpycore/
88
88
  02-partly-solved-issues/
89
89
  03-solved-issues/
90
90
  04-designs-and-guides/
91
+ 05-epics/
92
+ epicXX_plan.md
91
93
  pyproject.toml
92
94
  readme.md
93
95
  ...
@@ -124,6 +126,10 @@ When the user message is **exactly** one of these forms, or **starts with** it f
124
126
 
125
127
  | `iflow close`, `iflow-close`, `/iflow-close`, `/iflow close` | `iflow-close` |
126
128
 
129
+ | `iflow cycle`, `iflow-cycle`, `/iflow-cycle`, `/iflow cycle` | `iflow-cycle` |
130
+
131
+ | `iflow epic`, `iflow-epic`, `/iflow-epic`, `/iflow epic` | `iflow-epic` |
132
+
127
133
  | `iflow fix`, `iflow-fix`, `/iflow-fix`, `/iflow fix` | `iflow-fix` |
128
134
 
129
135
  | `iflow graphify`, `iflow-graphify`, `/iflow-graphify`, `/iflow graphify` | `iflow-graphify` |
@@ -174,6 +180,10 @@ Lifecycle skills include a **`### MODEL & EXECUTION DIRECTIVE`** section that te
174
180
 
175
181
  `/iflow-status` prints a **read-only** overview of where every issue stands — the local tracking state under `.issueflows/` (focus / parked / solved) plus open GitHub issues cross-referenced against it. It is off-path (never auto-dispatched) and changes nothing.
176
182
 
183
+ `/iflow-epic <N>` plans a change **too large for one issue** as a staged epic: it drafts `.issueflows/05-epics/epic<N>_plan.md` (anchored to GitHub issue `<N>`), dividing the work into sequential stages of manageable issue specs with explicit dependencies and a per-issue yolo-fitness judgment. Drafting writes nothing on GitHub; **`/iflow-epic <N> publish [stage <k>]`** creates a confirmed stage's issues behind one consolidated confirm (yolo labels per the recorded judgment, task list maintained on the anchor issue, `Published: #<M>` recorded back into the plan so re-runs are idempotent). Off-path (never auto-dispatched); epics decompose into the normal single-issue lifecycle, never around it.
184
+
185
+ `/iflow-cycle <queue-spec>` processes **many issues hands-off in a row** under a single up-front confirmation — the batch equivalent of `/iflow-yolo`. It resolves a queue via `issue-flow agent queue` (explicit numbers, `label:<L>`, or `epic <N> [stage <k>]`), then runs each issue through the full yolo chain (PR auto-merged), interrupting you only when input is **strictly necessary** (unfixable failure, refused merge / non-fast-forward pull, ambiguous or not-actually-small spec, or anything outside the confirmed queue). It stops the whole cycle on the first such condition, leaving the repo clean on the default branch. Off-path (never auto-dispatched); never weakens a yolo safeguard to keep moving.
186
+
177
187
  `/iflow-archive` condenses old solved issue groups under `.issueflows/03-solved-issues/` into a single dated `YYYY-MM-DD_archived_issues.md` summary file (recording the pre-archive git ref for recovery via `git show <ref>:<path>`), then deletes the original `issue<N>_*` files. It is off-path and destructive: nothing is deleted before one consolidated confirmation.
178
188
 
179
189
  > On tools without project slash commands (e.g. Codex CLI), invoke the mirrored Agent Skills instead (for example `iflow-init` in place of `/iflow-init`).
@@ -92,7 +92,7 @@ When `.issueflows/04-designs-and-guides/multi-repo-workspaces.md` exists, read i
92
92
 
93
93
  ## Constraints
94
94
 
95
- - Never auto-dispatch to `/iflow-pick`, `/iflow-pause`, `/iflow-cleanup`, `/iflow-yolo`, or `/iflow-fix`.
95
+ - Never auto-dispatch to `/iflow-pick`, `/iflow-pause`, `/iflow-cleanup`, `/iflow-yolo`, `/iflow-fix`, `/iflow-epic`, or `/iflow-cycle`.
96
96
  - If the focus issue cannot be resolved (multiple groups, branch ambiguous), stop and ask.
97
97
  - Do not modify files beyond what the downstream command would normally modify. `/iflow` itself writes nothing — all file changes come from the dispatched command.
98
98
  - Dispatch to at most one command per `/iflow` invocation.
@@ -71,7 +71,9 @@ When `.issueflows/04-designs-and-guides/multi-repo-workspaces.md` exists, read i
71
71
 
72
72
  5. **Optional folder sweep** (safe; no destructive git). In `.issueflows/01-current-issues/`, for each `issue<N>_*` group whose status file contains `- [x] Done` (case-insensitive on `done`), move the group to `.issueflows/03-solved-issues/`. Leave groups without a checked `Done` in place — routing them to `.issueflows/02-partly-solved-issues/` is `/iflow-pause`'s job.
73
73
 
74
- 6. **Report.** Summarize: default branch, PR/merge status, commands run, branches deleted, branches skipped (with reason), folder sweep result. If `issue-flow agent resolve --json` reports `sibling_roots`, list them and remind the user that **each scaffolded repo needs its own `/iflow-cleanup`** do not loop automatically in this step.
74
+ 6. **Epic stage gate (offer only).** If the just-merged issue belongs to an epic its number appears in a `- Published: #<N>` line of an `epic<M>_plan.md` under `.issueflows/05-epics/` — check whether that closed the stage: run `issue-flow agent epic-status <M> --json` and see if the issue's stage now has no open issues left. If the stage just completed, **offer** (do not do automatically) to (a) post a short stage-summary comment on the epic anchor issue and (b) run `/iflow-epic <M> publish` to publish the next stage. Both are the user's explicit call — never auto-publish or auto-comment.
75
+
76
+ 7. **Report.** Summarize: default branch, PR/merge status, commands run, branches deleted, branches skipped (with reason), folder sweep result, and any epic stage-gate offer. If `issue-flow agent resolve --json` reports `sibling_roots`, list them and remind the user that **each scaffolded repo needs its own `/iflow-cleanup`** — do not loop automatically in this step.
75
77
 
76
78
  ## Constraints
77
79
 
@@ -0,0 +1,131 @@
1
+ ---
2
+ name: iflow-cycle
3
+ description: >-
4
+ Process many issues hands-off in a row: resolve a queue, then run each
5
+ through the yolo chain under one up-front confirm. Stops only when input is
6
+ strictly necessary.
7
+ disable-model-invocation: true
8
+ issue-flow-version: 0.4.2a4
9
+ ---
10
+
11
+ # issue-flow — issue cycle (`/iflow-cycle`)
12
+
13
+ Follow this skill to **process a queue of issues hands-off**, one after another, with a **single up-front confirmation** — the batch equivalent of `/iflow-yolo`. Each issue runs the full yolo chain (`init → plan → start → close yolo`, PR auto-merged, switch back to default); the cycle interrupts you only when input is **strictly necessary**.
14
+
15
+ Use only when every queued issue is genuinely yolo-fit (small, low-risk, well-specified, test-guarded). A queue of risky changes belongs in the individual commands.
16
+
17
+ ## Input — queue spec
18
+
19
+ - **explicit numbers** — e.g. `12 15 18`.
20
+ - **`label:<L>`** — every open issue carrying label `<L>`.
21
+ - **`epic <N> [stage <k>]`** — the current stage of epic `<N>` (or stage `<k>`).
22
+ - **`resume`** — pick up an interrupted cycle from its state file (see **Resuming** below).
23
+ - **`onfail:stop`** (default) / **`onfail:skip`** — failure policy (see step 7).
24
+ - **`max:<n>`** — raise the safety cap (default 10) for this run.
25
+ - **`stay`** — forward `stay` to each close so the working copy stays on each issue branch (rarely wanted in a cycle).
26
+
27
+
28
+ **Invoke:** type `iflow cycle` in chat, or `/iflow-cycle` from the slash menu (`iflow-cycle` also works).
29
+
30
+
31
+
32
+
33
+ ### MODEL & EXECUTION DIRECTIVE
34
+
35
+
36
+ **Profile: reasoning** — Prioritize deep thinking and careful trade-offs over speed or token economy.
37
+
38
+ In Cursor: switch to a thinking-capable model before invoking this step (not Auto-only).
39
+
40
+
41
+
42
+ Keep scope tight to what this step requires.
43
+
44
+
45
+
46
+
47
+ ### Resolve project root (multi-root workspaces)
48
+
49
+ Before any `git`, `gh`, or `.issueflows/` path operation in this workflow:
50
+
51
+ **Resolution order** (stop when unambiguous):
52
+
53
+ 1. **Explicit hints** in slash input — `root:<path>`, `repo:<folder-basename>` (directory name, e.g. `cellpy-core`), or `repo:owner/name`.
54
+ 2. **CLI fast path** — `issue-flow agent resolve [-C <start>] [--from-file <active-file>] [--json]`. Use the returned `project_root` and `repo`; pass `-C <project_root>` to other `issue-flow agent …` subcommands. When the answer came from the workspace registry, the payload sets `resolved_via_workspace_default: true`.
55
+ 3. **Branch context** — exactly one workspace repo whose branch matches `^\d+-` → that root.
56
+ 4. **Single scaffold** — exactly one `.issueflows/` tree visible in the workspace → that root.
57
+ 5. **Workspace default** — an `issueflow-workspace.toml` at the workspace root (created with `issue-flow workspace init`) may name a `default` member repo; use it when no scaffold matched above. Tell the user the default was used.
58
+ 6. **Ambiguous** → **stop and ask**; never guess between sibling repos.
59
+
60
+ After resolution, treat the result as `<project_root>` and `<owner/repo>`:
61
+
62
+ - **Git:** `git -C <project_root> …` (or `issue-flow agent … -C <project_root>` for supported ops).
63
+ - **GitHub:** always `gh … --repo <owner/repo>` — never rely on `gh`'s implicit cwd default.
64
+ - **Paths:** all `.issueflows/…` paths are under `<project_root>`.
65
+
66
+ When `.issueflows/04-designs-and-guides/multi-repo-workspaces.md` exists, read it for layout and cross-repo guidance.
67
+
68
+ ## Instructions
69
+
70
+ 1. **Resolve the queue.** Run `issue-flow agent queue <spec> --json` (numbers, `--label`, or `--epic`). Use its `queue` (ordered), `blocked`, and `skipped_closed` output as the source of truth — do not re-derive the order by hand. If it reports a dependency `cycle`, **stop** and show it; nothing runs. If the CLI is unavailable, fall back to reading the issues and ordering by `Depends on #N` lines yourself, but prefer the CLI.
71
+
72
+ 2. **Cap check.** If the ordered queue is longer than **10** and the input did not pass `max:<n>` raising the limit, **stop** and ask the user to confirm a larger run explicitly. Long unattended runs compound risk.
73
+
74
+ 3. **One consolidated confirm** (the only planned interruption). Present, in normal prose:
75
+ - the **ordered** queue (numbers + titles), and which issues are **skipped** (closed) or **blocked** (open dependency outside the queue) with the reason;
76
+ - that each issue runs the **full yolo chain** and its PR is **auto-merged**;
77
+ - the failure policy (`onfail:stop`, the default, or `onfail:skip` — see step 7);
78
+ - the default-branch preflight that must hold before starting (clean tree, tests passing).
79
+ Require an explicit yes; anything else aborts before any work.
80
+
81
+ 4. **Write the cycle state file.** After the confirm, write `.issueflows/01-current-issues/cycle_status.md` — the durable record that makes the run resumable and visible to `/iflow-status`. Include: the queue spec, the `onfail` policy, an ISO timestamp, and the ordered queue as a checklist with one line per issue (`- [ ] #<N> — <title> — pending`). Update this file as the loop progresses (see step 5); it is a normal tracking file (not an `issue<N>_*` group), so the folder sweep never touches it.
82
+
83
+ 5. **Per-issue loop.** For each issue in order, from a clean default branch:
84
+ - mark it `in-progress` in `cycle_status.md`, then create/switch to its `<N>-<slug>` branch and follow `.cursor/skills/iflow-yolo/SKILL.md` **verbatim** — including its own preflight (refuse on default branch, refuse with dirty unrelated changes, tests pass up front) and its consolidated-confirm step, which the up-front batch confirm in step 3 satisfies (do not re-ask per issue).
85
+ - after the yolo close merges and switches back to the default branch, record the outcome in `cycle_status.md` (`- [x] #<N> — <title> — merged <PR-url>`) and continue to the next issue.
86
+ - Every yolo safeguard stays in force. A safeguard that trips is a **stop condition** (step 6), never a guard to skip.
87
+
88
+ 6. **Strictly-necessary-input rule.** Between issues the cycle runs unattended. **Stop and ask only** when:
89
+ a. tests or lint fail in a way you cannot fix within the current issue's scope;
90
+ b. a merge is refused or a `git pull --ff-only` will not fast-forward (divergence);
91
+ c. the issue spec is ambiguous, contradictory, or turns out **not** small (yolo's scope check aborts);
92
+ d. an action would fall **outside the confirmed queue** (touching an unlisted issue, an unrelated dirty file, a destructive op).
93
+ Anything else — routine implementation choices, passing tests, clean merges — proceeds without asking.
94
+
95
+ 7. **Failure policy** (from the `onfail:` token; default **stop**). When a stop condition (step 6) trips on an issue:
96
+ - **`onfail:stop`** (default) — **halt the cycle**: finish no further issues, leave the repo on the **default branch, clean** (the in-flight issue's branch stays as-is for the user to inspect), record the stop reason and the not-reached issues in `cycle_status.md`, and report. Do not attempt the rest of the queue.
97
+ - **`onfail:skip`** — **park and continue**: record the failure against that issue in `cycle_status.md` (`- [~] #<N> — <title> — failed: <reason>`), park its work per `.cursor/skills/iflow-pause/SKILL.md` conventions (status note + move to `02-partly-solved-issues/`), return to a clean default branch, and proceed to the next queued issue. A skip never bypasses a yolo safeguard — it records the trip and moves on.
98
+
99
+ 8. **Finish.** When the queue is exhausted (or halted), finalize `cycle_status.md` (mark it `- [x] Done`) and move it to `.issueflows/03-solved-issues/cycle_status_<YYYY-MM-DD>.md` so it is archived, not re-detected as in-flight.
100
+
101
+ 9. **Batch report.** Summarize the whole run: per issue — number, title, PR URL, merge result (merged / queued via `--auto` / failed-and-skipped / not reached), and duration if tracked; then the queue items **skipped** (closed), **blocked** (with blockers), and — on a halt — the **stop reason** and which issues were **not reached**. End by reminding the user to run `/iflow-cleanup` once to prune the merged local branches.
102
+
103
+ ## Resuming
104
+
105
+ `/iflow-cycle resume` picks up an interrupted cycle:
106
+
107
+ 1. Read `.issueflows/01-current-issues/cycle_status.md`. If it is missing, tell the user there is no in-flight cycle and stop.
108
+ 2. Take the **remaining** issues (those still `pending` / `in-progress`) and **re-verify** them with `issue-flow agent queue <original-spec> --json` — an issue that has since closed, or become blocked, is dropped/deferred with a note (state can move while a cycle is paused).
109
+ 3. **Do not re-ask the original consolidated confirm** for the unchanged remaining items — the batch was already authorized. Ask again only if the re-verified queue differs materially from what was confirmed (new blockers, added issues), and only about the delta.
110
+ 4. Continue the per-issue loop (step 5) with the same `onfail` policy recorded in the file.
111
+
112
+ ## Parallel dispatch (experimental, opt-in)
113
+
114
+ By default the cycle is **sequential** — one issue fully lands before the next starts. When the input passes **`parallel:<n>`** *and* the harness supports background execution, provably independent issues may run concurrently (up to `n` at a time). This is experimental; the sequential path above is always the default and is never weakened to enable it.
115
+
116
+ - **Only independent issues qualify.** Use `issue-flow agent queue`'s **`independent`** list — issues with *no* dependency relation (either direction) to any other queue member. Everything else runs sequentially.
117
+ - **Harness gate.** If you cannot confirm the harness supports background execution (worktrees + parallel agents/subagents), **refuse `parallel:<n>` and run sequentially** — never pretend to parallelize.
118
+ - **Worktree per issue.** `git worktree add ../<repo>-<N> <N>-<slug>` so each issue has an isolated tree; run the yolo work there.
119
+ - **Serialize merges.** Never merge PRs concurrently — the coordinating session merges them one at a time on the default branch, pulling between merges and rebasing/retrying on a non-fast-forward or CI refusal.
120
+ - **Shared files via the coordinator only.** Parallel workers must **not** each edit `HISTORY.md`; each leaves its changelog bullet in its issue status file / PR body, and the coordinator appends them in **merge order** during the serial merge step.
121
+
122
+ When in doubt, prefer the sequential run — parallel dispatch trades safety for speed and every one of the rules above must hold.
123
+
124
+ ## Constraints
125
+
126
+ - **Off-path**: `/iflow` never auto-dispatches to `/iflow-cycle`; it is an explicit, deliberate batch action.
127
+ - **Sequential is the default and floor.** Parallelism (`parallel:<n>`) is opt-in and experimental; refusing it must always leave a working sequential run.
128
+ - Never weaken a yolo safeguard to keep the cycle moving — safeguards are stop conditions, not obstacles.
129
+ - Never run `/iflow-cleanup` from this skill; batch branch deletion still needs the user to see the merged PRs first.
130
+ - One consolidated confirm covers the batch; never silently expand the queue beyond what was confirmed.
131
+ - `cycle_status.md` is the single source of truth for an in-flight cycle: keep it current so `resume` and `/iflow-status` stay accurate. It is not an `issue<N>_*` group, so the folder sweep leaves it alone; archive it (step 8) when the run ends.
@@ -0,0 +1,137 @@
1
+ ---
2
+ name: iflow-epic
3
+ description: >-
4
+ Plan a larger change as a staged epic: draft epic<N>_plan.md with stages of
5
+ manageable issue specs, then publish confirmed stages as GitHub issues.
6
+ disable-model-invocation: true
7
+ issue-flow-version: 0.4.2a4
8
+ ---
9
+
10
+ # issue-flow — epic planning (`/iflow-epic`)
11
+
12
+ Follow this skill to plan a change that is **too large for one issue**: divide it into sequential **stages**, each stage into **manageable issues** that flow through the normal lifecycle (`/iflow-init` → `/iflow-plan` → `/iflow-start` → `/iflow-close`).
13
+
14
+ The surface has two actions. **Drafting** (the default) is write-free on GitHub: its deliverable is `.issueflows/05-epics/epic<N>_plan.md`, and it never creates GitHub issues, labels, or milestones. **`publish`** is the single exception — it turns a *confirmed* plan into real GitHub issues, stage by stage, behind one consolidated confirm.
15
+
16
+ ## Input
17
+
18
+ - **`<N>`** — the GitHub issue number of the **epic anchor** (an umbrella issue describing the large change). Required: an epic without an anchor has nowhere to track progress. If no anchor issue exists yet, stop and ask the user to create one (title prefixed `Epic:`, label `epic` when available) — creating it is the user's call, not this skill's.
19
+ - **`publish [stage <k>]`** — run the publish action (below) instead of drafting. Without a stage number, the earliest stage with unpublished specs is chosen.
20
+ - Optional free text — extra context, constraints, or a proposed stage split to seed the draft.
21
+
22
+
23
+ **Invoke:** type `iflow epic` in chat, or `/iflow-epic` from the slash menu (`iflow-epic` also works).
24
+
25
+
26
+
27
+
28
+ ### MODEL & EXECUTION DIRECTIVE
29
+
30
+
31
+ **Profile: reasoning** — Prioritize deep thinking and careful trade-offs over speed or token economy.
32
+
33
+ In Cursor: switch to a thinking-capable model before invoking this step (not Auto-only).
34
+
35
+
36
+
37
+ Keep scope tight to what this step requires.
38
+
39
+
40
+
41
+
42
+ ### Resolve project root (multi-root workspaces)
43
+
44
+ Before any `git`, `gh`, or `.issueflows/` path operation in this workflow:
45
+
46
+ **Resolution order** (stop when unambiguous):
47
+
48
+ 1. **Explicit hints** in slash input — `root:<path>`, `repo:<folder-basename>` (directory name, e.g. `cellpy-core`), or `repo:owner/name`.
49
+ 2. **CLI fast path** — `issue-flow agent resolve [-C <start>] [--from-file <active-file>] [--json]`. Use the returned `project_root` and `repo`; pass `-C <project_root>` to other `issue-flow agent …` subcommands. When the answer came from the workspace registry, the payload sets `resolved_via_workspace_default: true`.
50
+ 3. **Branch context** — exactly one workspace repo whose branch matches `^\d+-` → that root.
51
+ 4. **Single scaffold** — exactly one `.issueflows/` tree visible in the workspace → that root.
52
+ 5. **Workspace default** — an `issueflow-workspace.toml` at the workspace root (created with `issue-flow workspace init`) may name a `default` member repo; use it when no scaffold matched above. Tell the user the default was used.
53
+ 6. **Ambiguous** → **stop and ask**; never guess between sibling repos.
54
+
55
+ After resolution, treat the result as `<project_root>` and `<owner/repo>`:
56
+
57
+ - **Git:** `git -C <project_root> …` (or `issue-flow agent … -C <project_root>` for supported ops).
58
+ - **GitHub:** always `gh … --repo <owner/repo>` — never rely on `gh`'s implicit cwd default.
59
+ - **Paths:** all `.issueflows/…` paths are under `<project_root>`.
60
+
61
+ When `.issueflows/04-designs-and-guides/multi-repo-workspaces.md` exists, read it for layout and cross-repo guidance.
62
+
63
+ > **CLI fast path (optional).** If the `issue-flow` CLI is on `PATH`, run
64
+ > `issue-flow agent epic-status <N> --json` for a deterministic picture of an
65
+ > existing epic: stages, per-issue state and blockers, the current stage, and
66
+ > the next open, unblocked candidates. Use it before re-drafting a stage and
67
+ > in the publish action's stage selection. Read-only; add `--local` to skip
68
+ > the GitHub lookups.
69
+
70
+ ## Instructions
71
+
72
+ 1. **Gather context (read-only).** Read the epic anchor (`gh issue view <N> --repo <owner/repo>`), skim `.issueflows/04-designs-and-guides/` for relevant design docs (cite them in the plan when they shape the approach), and — when `graphify-out/GRAPH_REPORT.md` exists — skim it before grepping.
73
+
74
+ 2. **Draft the staged plan** at `.issueflows/05-epics/epic<N>_plan.md` using exactly this structure (the publish step parses it):
75
+
76
+ ```markdown
77
+ # Epic #<N>: <title>
78
+
79
+ Anchor: <GitHub issue URL>
80
+ Status: draft
81
+
82
+ ## Goal
83
+
84
+ <what the whole epic achieves, and how we know it is done>
85
+
86
+ ## Constraints
87
+
88
+ <hard boundaries, non-goals, ordering requirements>
89
+
90
+ ## Stage 1 — <stage title>
91
+
92
+ <one paragraph: what this stage proves or delivers>
93
+
94
+ ### Issue: <title as it will appear on GitHub>
95
+
96
+ - Spec: <self-contained paragraph: context, scope, acceptance criteria>
97
+ - Depends on: none | #<M> | stage <j> issue <k>
98
+ - yolo: yes | no — <one-line judgment against the yolo-fitness criteria>
99
+
100
+ ### Issue: <next issue title>
101
+ ...
102
+
103
+ ## Stage 2 — <stage title>
104
+ ...
105
+ ```
106
+
107
+ The `publish` action later appends a `- Published: #<M>` line to each spec it creates — never add those by hand.
108
+
109
+ 3. **Sizing rules for issue specs** — every issue must be *manageable*:
110
+ - one issue = one branch = one PR, implementable in roughly a day or less;
111
+ - a **crisp acceptance criterion** someone else could verify;
112
+ - dependencies stated explicitly: `#<M>` for already-published issues, `stage <j> issue <k>` placeholders for unpublished ones (the publish step resolves placeholders to real numbers);
113
+ - a **yolo-fitness judgment** per issue: `yes` only when it is well-specified, mechanical or pattern-following, low blast radius, and guarded by existing tests — umbrella work, design decisions, and flag-day changes are `no`.
114
+
115
+ 4. **Stage discipline** — stages are sequential milestones, each small enough that finishing it can change the plan for the next. Front-load the stage that retires the most risk. Do not plan more than 2–3 stages in detail; sketch later stages as bullets under a `## Later (unstaged)` heading instead of fake-precise issue specs.
116
+
117
+ 5. **Review with the user.** Present the draft (stage titles, issue titles, dependency graph, yolo flags) and iterate until they confirm. Record the confirmation by changing `Status: draft` to `Status: confirmed` in the plan file.
118
+
119
+ 6. **Stop.** Creating the GitHub issues is the `publish` action below, with its own consolidated confirm — never create them from the drafting flow, even if asked to "just create them": run `/iflow-epic <N> publish` explicitly so the confirm gates stay distinct.
120
+
121
+ ## Action: publish
122
+
123
+ Turn one stage of a **confirmed** plan into real GitHub issues. Requires `Status: confirmed` in `epic<N>_plan.md` — refuse drafts and point at the review step instead.
124
+
125
+ 1. **Select the stage.** A named `stage <k>` publishes exactly that stage; otherwise pick the earliest stage containing specs without a `Published:` line. Specs that already carry `- Published: #<M>` are **skipped** (this makes re-runs idempotent).
126
+ 2. **Dry-run listing.** Show what would be created: per spec — title, labels (`yolo` when the judgment says yes **and** the label exists per `gh label list`; otherwise note the gap), and the dependency lines after placeholder resolution. `stage <j> issue <k>` placeholders pointing at already-published specs are rewritten to their real `#<M>`; placeholders at still-unpublished specs stay verbatim with a note.
127
+ 3. **Consolidated confirm** (destructive-ish — outward-facing writes; normal prose, never shortened). One prompt covering exactly: which issues get created, with which labels, and that the anchor issue's task list will be updated. Do not proceed without a clear yes.
128
+ 4. **Create, in dependency order within the stage.** For each spec: `gh issue create --repo <owner/repo>` with the self-contained body (context, scope, acceptance criteria, resolved `Depends on: #<M>` lines, and a closing `Part of epic #<N>.` line). Immediately record the new number in the plan file as `- Published: #<M>` under that spec.
129
+ 5. **Update the anchor issue's task list** (append/patch only — never rewrite the user's own body text): fetch the body, append a `## Stage <k> — <title>` section (or extend it) with one `- [ ] #<M>` line per created issue, and write it back via `gh issue edit <N> --body-file`.
130
+ 6. **Report.** Created issues (numbers + titles + labels), skipped already-published specs, unresolved placeholders, and the reminder that the next stage publishes only after this one's issues close.
131
+
132
+ ## Constraints
133
+
134
+ - **Drafting writes nothing on GitHub**: no `gh issue create`, no label or milestone writes, no task-list edits on the anchor issue. Reading with `gh issue view` / `gh issue list` is always fine. The `publish` action is the single exception and never runs without its consolidated confirm.
135
+ - **Off-path**: `/iflow` never auto-dispatches to `/iflow-epic`; the user opts in explicitly.
136
+ - Epics decompose **into** the normal single-issue lifecycle, never around it — no issue spec may assume work happens outside a normal issue branch + PR.
137
+ - The plan file is user-owned working state under `.issueflows/`: `issue-flow update` never touches it.
@@ -68,8 +68,9 @@ When `.issueflows/04-designs-and-guides/multi-repo-workspaces.md` exists, read i
68
68
  2. **`fix` shortcut.** If the user passed `fix`, skip selection and go to step 5 (create a new general-fixes issue), then Phase 2.
69
69
  3. **Source candidates** (precedence):
70
70
  - **Parked work first** — list `issue<n>_*` groups in `.issueflows/02-partly-solved-issues/` as the primary candidates (already-started work to finish first).
71
+ - **Active epic next** — if an epic plan under `.issueflows/05-epics/` has open issues (or the user named one, e.g. `epic 144`), prefer its **current stage's unblocked issues**. Use the fast path `issue-flow agent epic-status <N> --json` when the CLI is on `PATH` — its `next_candidates` are exactly the open, dependency-satisfied issues of the current stage. Surface those at the top of the shortlist so an epic advances stage by stage instead of stalling.
71
72
  - **Else GitHub** — `gh issue list --state open --json number,title,labels,milestone,updatedAt` (add `--repo owner/repo` if ambiguous). Drop issues already captured under `01-current-issues/`, `02-partly-solved-issues/`, or `03-solved-issues/`.
72
- 4. **Rank and present.** Rank by **milestone** (nearest/active, honour any hint) + **labels** (match recent work / hint) + **topical similarity** to recently solved issues (skim `.issueflows/03-solved-issues/` and recent branch names). Show a numbered shortlist (~3–7) with number, title, labels, milestone, and **ask the user to confirm** the pick or override. Never pick silently.
73
+ 4. **Rank and present.** Rank by **epic membership** (an active epic's current-stage `next_candidates` first) + **milestone** (nearest/active, honour any hint) + **labels** (match recent work / hint) + **topical similarity** to recently solved issues (skim `.issueflows/03-solved-issues/` and recent branch names). Show a numbered shortlist (~3–7) with number, title, labels, milestone, and (for epic issues) the epic + stage, and **ask the user to confirm** the pick or override. Never pick silently.
73
74
  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.
74
75
  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.
75
76
 
@@ -75,6 +75,8 @@ When `.issueflows/04-designs-and-guides/multi-repo-workspaces.md` exists, read i
75
75
 
76
76
  4. **Solved archive** (`.issueflows/03-solved-issues/`). Report the count of distinct solved issue numbers and the most recent few.
77
77
 
78
+ 4a. **In-flight cycle.** If `.issueflows/01-current-issues/cycle_status.md` exists, a `/iflow-cycle` batch run is paused or active — report it and its progress (from the file's checklist), and note that `/iflow-cycle resume` continues it. (`issue-flow status --json` reports this as `cycle_active`.)
79
+
78
80
  5. **Open GitHub issues** (skip if the user passed `local`). Run `gh issue list --state open --json number,title,labels,milestone,updatedAt` and tag each issue's local state: **focus**, **parked**, **solved-locally**, or **untracked**. If `gh` is missing/unauthenticated, skip this section and note it (suggest `gh auth login`) — never fail.
79
81
 
80
82
  6. **Summary line.** One terse line, e.g. `Focus: #20 (start). Parked: 2. Solved: 31. Open on GitHub: 7 (5 untracked).`
@@ -0,0 +1,14 @@
1
+ # GitHub Linguist: keep language stats focused on library source.
2
+ # Without this, graphify-out/graph.html (~3.8MB) dominates as HTML.
3
+
4
+ graphify-out/** linguist-generated
5
+ docs/** linguist-documentation
6
+ tests/** linguist-documentation
7
+ .issueflows/** linguist-documentation
8
+ dev/** linguist-documentation
9
+ scripts/** linguist-documentation
10
+
11
+ # Cross-platform line endings for shell helpers
12
+ .aliases text eol=lf
13
+ *.sh text eol=lf
14
+ *.lock text eol=lf
@@ -0,0 +1,60 @@
1
+ # Issue #136: Legacy bridge: preserve test_id through steps/summary output; legacy-schema support for merge_data
2
+
3
+ Source: https://github.com/cellpy/cellpy-core/issues/136
4
+
5
+ ## Original issue text
6
+
7
+ ## Summary
8
+
9
+ The `OldCellpyCellCore` legacy bridge strips `test_id` from the outbound
10
+ step/summary frames, which degrades multi-test (campaign-merged) objects to
11
+ cycle-only summary grouping. cellpy #507 works around it; these requests make
12
+ the workaround unnecessary and unblock campaign merges that keep original
13
+ per-test cycle numbers.
14
+
15
+ ## Details
16
+
17
+ 1. **Outbound `test_id` stripping.** `_native_steps_to_legacy` re-projects to a
18
+ fixed legacy column order (cell_core.py ~781-815) and the summary path
19
+ filters to `_legacy_summary_column_order` (~928-1065); `test_id` is in
20
+ `NATIVE_ONLY_STEP` / `NATIVE_ONLY_CYCLE` (mapping.py ~191-196, 227-231). The
21
+ inbound side is fine: a raw `test_id` column passes through (exception
22
+ lists, mapping.py ~129-144) and `make_step_table` groups on
23
+ `(test_id, cycle_num, step_num)` (proven by the cycler_small golden).
24
+ 2. **Bridge summary rebuilds native steps from the stripped legacy steps**
25
+ (`make_core_summary`, cell_core.py ~1010-1012), so
26
+ `use_tid` (summarizers.py ~792) is always False through the bridge —
27
+ cycle-only grouping, no per-test windowing, and cross-test collision when
28
+ cycle numbers overlap. cellpy #507's workaround: re-stamp `test_id` onto the
29
+ legacy steps frame post-bridge (depends on the inbound step rename staying
30
+ rename-only with no column filtering — please treat that as a contract or
31
+ provide the fix below).
32
+ 3. **`_add_legacy_summary_cruft`** (cell_core.py ~960-978) does global pandas
33
+ cumsums (cumulated CE, shifted_*, cumulated_ric*) even when the engine
34
+ windowed per test — these columns are wrong for multi-test objects.
35
+ 4. **`merge_data(schema=<legacy Schema>)` raises `AttributeError`** —
36
+ `HeadersNormal` lacks the native attribute names (`datapoint_num`,
37
+ `cycle_num`, `test_id`), and passing the native schema instead silently
38
+ skips offsets on legacy-named frames (`_max_column` returns 0 for missing
39
+ columns). Either document legacy schemas as unsupported for merge/update, or
40
+ add attribute aliases so bridge consumers can call
41
+ `merge_data`/`update_data` directly (cellpy #507 mirrors the semantics in
42
+ pandas instead).
43
+
44
+ ## Requests
45
+
46
+ - [ ] Carry `test_id` through the legacy step output (or have
47
+ `make_core_summary` reuse the native steps it already computed instead of
48
+ rebuilding from the stripped legacy frame).
49
+ - [ ] Optionally expose `test_id` in the legacy summary output behind a flag.
50
+ - [ ] Window `_add_legacy_summary_cruft` per `test_id` when present.
51
+ - [ ] Resolve the `merge_data` legacy-schema story (docs or aliases).
52
+ - [ ] Together these unblock `renumber_cycles=False` (original per-test cycle
53
+ numbers) for cellpy's campaign merge ahead of the native-schema path
54
+ (cellpy #511).
55
+
56
+ ## Refs
57
+
58
+ cellpy jepegit/cellpy#507 (campaign merge + workaround), jepegit/cellpy#511
59
+ (native schema opt-in), core tests test_golden.py (cycler_small composite-key
60
+ golden), test_merge.py / test_e2e.py (native multi-test invariants).
@@ -0,0 +1,87 @@
1
+ # Issue #136 — plan
2
+
3
+ Source: https://github.com/cellpy/cellpy-core/issues/136
4
+
5
+ ## Goal
6
+
7
+ Legacy bridge keeps `test_id` on outbound steps (and summary when present) so
8
+ campaign-merged multi-test objects get per-test summary windowing through the
9
+ bridge — no cellpy #507 re-stamp workaround. Also fix legacy-cruft cumsums and
10
+ clarify `merge_data` + legacy schema.
11
+
12
+ ## Constraints
13
+
14
+ - Back-compat: single-test objects already have `test_id=0` on raw; emitting
15
+ `test_id` on steps/summary is **additive** (extra column). Goldens that pin
16
+ exact column sets may need updates.
17
+ - Mapping totality (`NATIVE_ONLY_*` / attr maps) must stay consistent.
18
+ - Do not change native engine behaviour; bridge-only (+ headers/mapping).
19
+ - Unblocks cellpy #510 V2-15 pin after a **new** cellpycore PyPI release.
20
+
21
+ ### Prior art
22
+
23
+ | Hit | Role | Plan |
24
+ |-----|------|------|
25
+ | [`OldCellpyCellCore._native_steps_to_legacy`](../../src/cellpycore/cell_core.py) / `_legacy_step_column_order` | Drops unknown cols via fixed order | **Extend** order with `test_id` when present |
26
+ | [`make_core_summary`](../../src/cellpycore/cell_core.py) rebuilds native steps from legacy `data.steps` | `use_tid` false after strip | Fixed once steps carry `test_id` through rename |
27
+ | [`_add_legacy_summary_cruft`](../../src/cellpycore/cell_core.py) | Global pandas cumsums | **Window** by `test_id` when column present |
28
+ | [`NATIVE_ONLY_STEP` / `NATIVE_ONLY_CYCLE`](../../src/cellpycore/legacy/mapping.py) | Declares `test_id` intentionally unbridged | **Remove** `test_id`; add identity scalar/cycle pairs |
29
+ | [`HeadersStepTable` / `HeadersSummary`](../../src/cellpycore/legacy/headers.py) | No `test_id` field today | **Add** `test_id: str = "test_id"` |
30
+ | cellpy [`cellreader.make_step_table` re-stamp](../../../cellpy/cellpy/readers/cellreader.py) (~2293) | Workaround | Becomes redundant after this; leave for a cellpy follow-up |
31
+ | [`merge_data`](../../src/cellpycore/merge.py) | Expects native `Schema` attrs | **Document + hard error** on legacy header schema (cellpy already uses pandas merge) |
32
+ | Toolbox `00-tools/` | Empty | None |
33
+ | Graph | Bridge / mapping communities | Touch `cell_core` + `legacy/mapping` + `legacy/headers` |
34
+
35
+ ## Approach
36
+
37
+ 1. **Steps outbound:** Add `HeadersStepTable.test_id`. Put `test_id` early in
38
+ `_legacy_step_column_order` (before cycle/step). Add identity
39
+ `STEP_SCALAR_PAIRS` entry `("test_id", "test_id")`; drop `test_id` from
40
+ `NATIVE_ONLY_STEP`. Update attr maps (`LEGACY_ATTR_TO_SCHEMA` /
41
+ `LEGACY_ATTR_UNMAPPED`) for the new header field.
42
+ 2. **Summary outbound:** Add `HeadersSummary.test_id`. Include in
43
+ `_legacy_summary_column_order` (near `cycle_index`) when present after rename.
44
+ Add identity `CYCLE_PAIRS` entry; drop `test_id` from `NATIVE_ONLY_CYCLE`.
45
+ No flag — always pass through when the native summary has it (single-test →
46
+ all `0`).
47
+ 3. **Cruft:** In `_add_legacy_summary_cruft`, if `test_id` in summary columns and
48
+ `nunique > 1` (or always when column present): compute cumsums / shifted /
49
+ ric **per group**; else keep today's global behaviour.
50
+ 4. **`merge_data` + legacy schema:** At entry, if `schema.raw` is
51
+ `HeadersNormal` (or lacks `datapoint_num` / `cycle_num` / `test_id`), raise
52
+ `TypeError` with a clear message: use `config.default_schema()` / native
53
+ `Schema`. Document in `merge_data` docstring. No full legacy-schema merge
54
+ implementation in this issue (cellpy does not call it).
55
+ 5. **Tests:** Bridge multi-test fixture (or reuse schema/e2e multi-test raw) →
56
+ `make_core_step_table` / `make_core_summary` → assert `test_id` on steps and
57
+ summary `{0,1}`; assert summary cumulatives restart per test. Mapping
58
+ totality tests update with the exception-set moves. One test that
59
+ `merge_data(..., schema=legacy.schema)` raises the new TypeError.
60
+
61
+ ## Files to touch
62
+
63
+ | Path | Change |
64
+ |------|--------|
65
+ | `src/cellpycore/legacy/headers.py` | `test_id` on step + summary headers |
66
+ | `src/cellpycore/legacy/mapping.py` | pairs / `NATIVE_ONLY_*` / attr maps + comments |
67
+ | `src/cellpycore/cell_core.py` | column order, cruft windowing |
68
+ | `tests/test_*.py` (bridge / mapping / merge) | new + update totality |
69
+ | `CHANGELOG` / HISTORY if present | note for 0.2.2 release |
70
+
71
+ ## Test strategy
72
+
73
+ ```bash
74
+ uv run pytest
75
+ uv run ruff check && uv run ruff format --check
76
+ ```
77
+
78
+ Focus: new bridge multi-test test + `tests/test_header_mapping.py` totality +
79
+ `tests/test_merge.py` legacy-schema error.
80
+
81
+ ## Decisions (confirmed 2026-07-17)
82
+
83
+ 1. **Summary `test_id`:** always when present (no flag).
84
+ 2. **`merge_data` legacy schema:** hard `TypeError` + docstring (also
85
+ `update_data`).
86
+ 3. **Cruft windowing:** when `test_id` column exists (groupby).
87
+ 4. **Goldens:** regenerate stage-B step/summary snapshots (additive `test_id`).
@@ -0,0 +1,18 @@
1
+ # Issue #136 — status
2
+
3
+ - [x] Done
4
+
5
+ ## What's done
6
+
7
+ - Plan confirmed (2026-07-17): carry `test_id` on steps+summary; window cruft;
8
+ hard-error legacy schema on merge/update; regenerate goldens.
9
+ - Implemented on `136-legacy-bridge-preserve-test-id`.
10
+ - Version bumped `0.2.1` → `0.2.2` (static `pyproject.toml`); HISTORY promoted.
11
+ - `uv run pytest` 261 passed; ruff clean.
12
+ - Close: commit + PR; PyPI release via `release` from `main` after merge
13
+ (see `release-procedure.md`).
14
+
15
+ ## Remaining work
16
+
17
+ - None for the code issue. Post-merge: `iflow cleanup` + cut GitHub/PyPI
18
+ release for `0.2.2`, then re-pin cellpy.
@@ -0,0 +1,15 @@
1
+ # Legacy bridge carries `test_id` (#136)
2
+
3
+ **Context.** `OldCellpyCellCore` used to drop `test_id` from outbound steps /
4
+ summary via fixed column orders + `NATIVE_ONLY_*` exceptions. That forced cellpy
5
+ #507 to re-stamp steps so campaign summaries could window per test.
6
+
7
+ **Decision.** Bridge `test_id` as an identity column on steps and summary when
8
+ present. Window `_add_legacy_summary_cruft` by `test_id`. `merge_data` /
9
+ `update_data` require native `config.Schema` (hard `TypeError` on `Headers*`).
10
+
11
+ **Alternatives.** Opt-in flag for summary `test_id` — rejected (additive is
12
+ enough). Full legacy-schema merge aliases — rejected (step/cycle attrs incomplete;
13
+ cellpy uses pandas merge).
14
+
15
+ **Refs.** cellpy #507 / #510 / #511; release after this → re-pin cellpy.
@@ -79,3 +79,13 @@ uv run pre-commit install
79
79
  the public API.
80
80
  - Per-step stat column names (`<signal>_<stat>`) are a fixed engine contract,
81
81
  not schema-injected (issue #70).
82
+
83
+ ## Release & version bump
84
+
85
+ Static version in ``pyproject.toml`` (``project.version``). Bump with::
86
+
87
+ uv version --bump patch|minor|major
88
+
89
+ Cut a GitHub release from ``main`` after merge (``release`` alias / see
90
+ ``release-procedure.md``) so ``release.yml`` publishes ``cellpycore`` to PyPI.
91
+
@@ -81,6 +81,8 @@ cellpycore/
81
81
  02-partly-solved-issues/
82
82
  03-solved-issues/
83
83
  04-designs-and-guides/
84
+ 05-epics/
85
+ epicXX_plan.md
84
86
  pyproject.toml
85
87
  readme.md
86
88
  ...
@@ -117,6 +119,10 @@ When the user message is **exactly** one of these forms, or **starts with** it f
117
119
 
118
120
  | `iflow close`, `iflow-close`, `/iflow-close`, `/iflow close` | `iflow-close` |
119
121
 
122
+ | `iflow cycle`, `iflow-cycle`, `/iflow-cycle`, `/iflow cycle` | `iflow-cycle` |
123
+
124
+ | `iflow epic`, `iflow-epic`, `/iflow-epic`, `/iflow epic` | `iflow-epic` |
125
+
120
126
  | `iflow fix`, `iflow-fix`, `/iflow-fix`, `/iflow fix` | `iflow-fix` |
121
127
 
122
128
  | `iflow graphify`, `iflow-graphify`, `/iflow-graphify`, `/iflow graphify` | `iflow-graphify` |
@@ -167,6 +173,10 @@ Lifecycle skills include a **`### MODEL & EXECUTION DIRECTIVE`** section that te
167
173
 
168
174
  `/iflow-status` prints a **read-only** overview of where every issue stands — the local tracking state under `.issueflows/` (focus / parked / solved) plus open GitHub issues cross-referenced against it. It is off-path (never auto-dispatched) and changes nothing.
169
175
 
176
+ `/iflow-epic <N>` plans a change **too large for one issue** as a staged epic: it drafts `.issueflows/05-epics/epic<N>_plan.md` (anchored to GitHub issue `<N>`), dividing the work into sequential stages of manageable issue specs with explicit dependencies and a per-issue yolo-fitness judgment. Drafting writes nothing on GitHub; **`/iflow-epic <N> publish [stage <k>]`** creates a confirmed stage's issues behind one consolidated confirm (yolo labels per the recorded judgment, task list maintained on the anchor issue, `Published: #<M>` recorded back into the plan so re-runs are idempotent). Off-path (never auto-dispatched); epics decompose into the normal single-issue lifecycle, never around it.
177
+
178
+ `/iflow-cycle <queue-spec>` processes **many issues hands-off in a row** under a single up-front confirmation — the batch equivalent of `/iflow-yolo`. It resolves a queue via `issue-flow agent queue` (explicit numbers, `label:<L>`, or `epic <N> [stage <k>]`), then runs each issue through the full yolo chain (PR auto-merged), interrupting you only when input is **strictly necessary** (unfixable failure, refused merge / non-fast-forward pull, ambiguous or not-actually-small spec, or anything outside the confirmed queue). It stops the whole cycle on the first such condition, leaving the repo clean on the default branch. Off-path (never auto-dispatched); never weakens a yolo safeguard to keep moving.
179
+
170
180
  `/iflow-archive` condenses old solved issue groups under `.issueflows/03-solved-issues/` into a single dated `YYYY-MM-DD_archived_issues.md` summary file (recording the pre-archive git ref for recovery via `git show <ref>:<path>`), then deletes the original `issue<N>_*` files. It is off-path and destructive: nothing is deleted before one consolidated confirmation.
171
181
 
172
182
  > On tools without project slash commands (e.g. Codex CLI), invoke the mirrored Agent Skills instead (for example `iflow-init` in place of `/iflow-init`).