openpkflow 2.3.0__tar.gz → 2.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. {openpkflow-2.3.0 → openpkflow-2.6.0}/.gitignore +24 -0
  2. openpkflow-2.3.0/CLAUDE.md → openpkflow-2.6.0/AGENTS.md +50 -44
  3. {openpkflow-2.3.0 → openpkflow-2.6.0}/CHANGELOG.md +128 -0
  4. {openpkflow-2.3.0 → openpkflow-2.6.0}/CITATION.cff +2 -2
  5. openpkflow-2.6.0/CLAUDE.md +376 -0
  6. {openpkflow-2.3.0 → openpkflow-2.6.0}/PKG-INFO +72 -44
  7. {openpkflow-2.3.0 → openpkflow-2.6.0}/README.md +69 -43
  8. {openpkflow-2.3.0 → openpkflow-2.6.0}/VALIDATION.md +47 -8
  9. openpkflow-2.6.0/docs/changelog.md +245 -0
  10. openpkflow-2.6.0/docs/index.md +102 -0
  11. openpkflow-2.6.0/docs/logo.png +0 -0
  12. openpkflow-2.6.0/docs/migration-cheatsheet.md +196 -0
  13. openpkflow-2.6.0/docs/openfit/CLAUDE.md +402 -0
  14. openpkflow-2.6.0/docs/openfit/OPENASSAYFLOW_CLAUDE.md +228 -0
  15. openpkflow-2.6.0/docs/openfit/ROADMAP.md +230 -0
  16. openpkflow-2.6.0/docs/positioning.md +104 -0
  17. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/be.md +53 -3
  18. openpkflow-2.6.0/docs/reference/pipeline.md +51 -0
  19. openpkflow-2.6.0/docs/theory.md +482 -0
  20. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/bayes.md +4 -0
  21. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/be.md +39 -4
  22. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/dissolution.md +5 -0
  23. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/ivivc.md +5 -0
  24. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/nca.md +5 -0
  25. openpkflow-2.6.0/docs/tutorials/pipeline.md +209 -0
  26. openpkflow-2.6.0/docs/tutorials/pop.md +225 -0
  27. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/tutorials/sim.md +5 -0
  28. openpkflow-2.6.0/docs/validation-matrix.md +53 -0
  29. openpkflow-2.6.0/examples/pipeline_walkthrough.py +105 -0
  30. openpkflow-2.6.0/examples/replicate_be_partial.csv +10 -0
  31. openpkflow-2.6.0/examples/study_pipeline_example.json +9 -0
  32. openpkflow-2.6.0/examples/study_pipeline_example.yaml +13 -0
  33. {openpkflow-2.3.0 → openpkflow-2.6.0}/mkdocs.yml +11 -1
  34. {openpkflow-2.3.0 → openpkflow-2.6.0}/pyproject.toml +49 -2
  35. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/conda-forge/meta.yaml +10 -5
  36. openpkflow-2.6.0/scripts/crossval_winnonlin.py +252 -0
  37. openpkflow-2.6.0/scripts/powertost_crossval.R +95 -0
  38. openpkflow-2.6.0/scripts/release_readiness.py +78 -0
  39. openpkflow-2.6.0/scripts/replicate_be_crossval.R +154 -0
  40. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/__init__.py +1 -1
  41. openpkflow-2.6.0/src/openpkflow/be/__init__.py +28 -0
  42. openpkflow-2.6.0/src/openpkflow/be/methods.py +309 -0
  43. openpkflow-2.6.0/src/openpkflow/be/replicate.py +311 -0
  44. openpkflow-2.6.0/src/openpkflow/be/reporting.py +289 -0
  45. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/cli.py +299 -0
  46. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/__init__.py +10 -0
  47. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/models.py +20 -3
  48. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/study.py +111 -47
  49. openpkflow-2.6.0/src/openpkflow/dissolution/supac.py +300 -0
  50. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ivivc/__init__.py +14 -0
  51. openpkflow-2.6.0/src/openpkflow/ivivc/level_bc.py +313 -0
  52. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ivivc/methods.py +129 -44
  53. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ivivc/reporting.py +13 -6
  54. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ivivc/results.py +11 -4
  55. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ivivc/study.py +38 -10
  56. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/__init__.py +2 -0
  57. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/loader.py +22 -3
  58. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/methods.py +83 -18
  59. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/study.py +20 -1
  60. openpkflow-2.6.0/src/openpkflow/pipeline/__init__.py +15 -0
  61. openpkflow-2.6.0/src/openpkflow/pipeline/config.py +253 -0
  62. openpkflow-2.6.0/src/openpkflow/pipeline/reporting.py +250 -0
  63. openpkflow-2.6.0/src/openpkflow/pipeline/study.py +374 -0
  64. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/omega.py +5 -5
  65. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/result.py +3 -2
  66. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/docx.py +9 -5
  67. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/pdf.py +9 -5
  68. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/dissolution_report.html +60 -16
  69. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/ivivc_report.html +8 -4
  70. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/multi_media_report.html +62 -18
  71. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/nca_single_report.html +65 -21
  72. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/nca_summary_report.html +58 -13
  73. openpkflow-2.6.0/src/openpkflow/report/templates/pipeline_report.html +479 -0
  74. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/__init__.py +4 -0
  75. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/methods.py +237 -0
  76. openpkflow-2.6.0/src/openpkflow/student/__init__.py +36 -0
  77. openpkflow-2.6.0/src/openpkflow/student/dissolution.py +509 -0
  78. openpkflow-2.6.0/src/openpkflow/student/nca.py +404 -0
  79. openpkflow-2.6.0/src/openpkflow/student/sim.py +497 -0
  80. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/be/test_methods.py +27 -0
  81. openpkflow-2.6.0/tests/be/test_methods_hypothesis.py +112 -0
  82. openpkflow-2.6.0/tests/be/test_replicate.py +150 -0
  83. openpkflow-2.6.0/tests/dissolution/test_bootstrap_hypothesis.py +68 -0
  84. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_m13b.py +36 -33
  85. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_models.py +1 -1
  86. openpkflow-2.6.0/tests/dissolution/test_similarity_hypothesis.py +107 -0
  87. openpkflow-2.6.0/tests/dissolution/test_supac.py +151 -0
  88. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/ivivc/test_ivivc.py +46 -19
  89. openpkflow-2.6.0/tests/ivivc/test_level_bc.py +186 -0
  90. openpkflow-2.6.0/tests/ivivc/test_methods_hypothesis.py +70 -0
  91. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_loader.py +25 -3
  92. openpkflow-2.6.0/tests/nca/test_methods_hypothesis.py +623 -0
  93. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_steady_state_urine.py +17 -4
  94. openpkflow-2.6.0/tests/pipeline/test_study_pipeline.py +237 -0
  95. openpkflow-2.6.0/tests/pop/test_omega.py +14 -0
  96. openpkflow-2.6.0/tests/sim/test_dosing_hypothesis.py +153 -0
  97. openpkflow-2.6.0/tests/sim/test_methods_hypothesis.py +313 -0
  98. openpkflow-2.6.0/tests/sim/test_models_hypothesis.py +118 -0
  99. openpkflow-2.6.0/tests/sim/test_simulate_hypothesis.py +133 -0
  100. openpkflow-2.6.0/tests/sim/test_steady_state_metrics.py +97 -0
  101. openpkflow-2.6.0/tests/sim/test_transit.py +103 -0
  102. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/test_cli.py +72 -0
  103. openpkflow-2.6.0/tests/test_student.py +357 -0
  104. openpkflow-2.6.0/tests/validation/__init__.py +0 -0
  105. openpkflow-2.6.0/tests/validation/test_be_power_reference.py +232 -0
  106. openpkflow-2.6.0/tests/validation/test_be_replicate_reference.py +133 -0
  107. openpkflow-2.6.0/tests/validation/test_ivivc_convolution_reference.py +268 -0
  108. openpkflow-2.6.0/tests/validation/test_nca_winnonlin_reference.py +788 -0
  109. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_pop_foce_reference.py +2 -0
  110. openpkflow-2.3.0/.github/ISSUE_TEMPLATE/bug_report.md +0 -25
  111. openpkflow-2.3.0/.github/ISSUE_TEMPLATE/feature_request.md +0 -18
  112. openpkflow-2.3.0/.github/PULL_REQUEST_TEMPLATE.md +0 -66
  113. openpkflow-2.3.0/.github/dependabot.yml +0 -46
  114. openpkflow-2.3.0/.github/workflows/ci.yml +0 -102
  115. openpkflow-2.3.0/.github/workflows/docs.yml +0 -29
  116. openpkflow-2.3.0/.github/workflows/publish.yml +0 -77
  117. openpkflow-2.3.0/.pre-commit-config.yaml +0 -37
  118. openpkflow-2.3.0/FUTURE_PLANS.md +0 -181
  119. openpkflow-2.3.0/HANDOFF.md +0 -135
  120. openpkflow-2.3.0/ROADMAP.md +0 -233
  121. openpkflow-2.3.0/V2_ARCHITECTURE_DECISION.md +0 -194
  122. openpkflow-2.3.0/demo.ipynb +0 -201
  123. openpkflow-2.3.0/docs/index.md +0 -72
  124. openpkflow-2.3.0/docs/logo.png +0 -0
  125. openpkflow-2.3.0/docs/tutorials/pop.md +0 -100
  126. openpkflow-2.3.0/src/openpkflow/be/__init__.py +0 -14
  127. openpkflow-2.3.0/src/openpkflow/be/methods.py +0 -157
  128. openpkflow-2.3.0/src/openpkflow/be/reporting.py +0 -133
  129. {openpkflow-2.3.0 → openpkflow-2.6.0}/CODE_OF_CONDUCT.md +0 -0
  130. {openpkflow-2.3.0 → openpkflow-2.6.0}/CONTRIBUTING.md +0 -0
  131. {openpkflow-2.3.0 → openpkflow-2.6.0}/LICENSE +0 -0
  132. {openpkflow-2.3.0 → openpkflow-2.6.0}/SECURITY.md +0 -0
  133. {openpkflow-2.3.0 → openpkflow-2.6.0}/codecov.yml +0 -0
  134. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/bayes.md +0 -0
  135. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/dissolution.md +0 -0
  136. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/ivivc.md +0 -0
  137. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/ml.md +0 -0
  138. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/nca.md +0 -0
  139. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/pop.md +0 -0
  140. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/sim.md +0 -0
  141. {openpkflow-2.3.0 → openpkflow-2.6.0}/docs/reference/validation.md +0 -0
  142. {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/be_report.html +0 -0
  143. {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/dissolution_advanced.py +0 -0
  144. {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/dissolution_basic.py +0 -0
  145. {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/dissolution_comparison.html +0 -0
  146. {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/ivivc_report.md +0 -0
  147. {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/openpkflow_tour.ipynb +0 -0
  148. {openpkflow-2.3.0 → openpkflow-2.6.0}/examples/report_dissolution.html +0 -0
  149. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/bootf2_dissolution_crossval.R +0 -0
  150. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/dissolution_models_crossval.R +0 -0
  151. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/ivivc_wn_lr_crossval.R +0 -0
  152. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/nlmixr2_popk_crossval.R +0 -0
  153. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/noncompart_theoph_crossval.R +0 -0
  154. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/pknca_ss_crossval.R +0 -0
  155. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/pknca_theoph_crossval.R +0 -0
  156. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/pknca_theoph_crossval_extended.R +0 -0
  157. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/probe_bootf2.R +0 -0
  158. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/probe_foce_i.py +0 -0
  159. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/probe_noncompart.R +0 -0
  160. {openpkflow-2.3.0 → openpkflow-2.6.0}/scripts/urine_nca_crossval.R +0 -0
  161. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/__init__.py +0 -0
  162. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/bayes_be.py +0 -0
  163. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/bayes_pk.py +0 -0
  164. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/map_pk.py +0 -0
  165. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/priors.py +0 -0
  166. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/reporting.py +0 -0
  167. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/bayes/results.py +0 -0
  168. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/be/results.py +0 -0
  169. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/be/study.py +0 -0
  170. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/__init__.py +0 -0
  171. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/example_dissolution.csv +0 -0
  172. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/example_not_similar.csv +0 -0
  173. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/example_similar.csv +0 -0
  174. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/ss_crossval.csv +0 -0
  175. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/datasets/theoph.csv +0 -0
  176. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/bootstrap.py +0 -0
  177. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/loader.py +0 -0
  178. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/multi_media.py +0 -0
  179. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/plotting.py +0 -0
  180. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/reporting.py +0 -0
  181. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/dissolution/similarity.py +0 -0
  182. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ml/__init__.py +0 -0
  183. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/ml/surrogate.py +0 -0
  184. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/reporting.py +0 -0
  185. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/results.py +0 -0
  186. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/nca/sparse.py +0 -0
  187. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/__init__.py +0 -0
  188. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/dataset.py +0 -0
  189. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/__init__.py +0 -0
  190. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/diagnostics.py +0 -0
  191. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/foce_i.py +0 -0
  192. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/foce_inner.py +0 -0
  193. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/model.py +0 -0
  194. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/objective.py +0 -0
  195. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/plotting.py +0 -0
  196. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/reporting.py +0 -0
  197. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/saem.py +0 -0
  198. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/estimation/saem_kernel.py +0 -0
  199. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/gof.py +0 -0
  200. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/plotting.py +0 -0
  201. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/reporting.py +0 -0
  202. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/pop/vpc.py +0 -0
  203. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/py.typed +0 -0
  204. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/__init__.py +0 -0
  205. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/html.py +0 -0
  206. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/bayes_be_report.html +0 -0
  207. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/be_report.html +0 -0
  208. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/fit_report.html +0 -0
  209. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/map_pk_report.html +0 -0
  210. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/pop_gof_report.html +0 -0
  211. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/pop_vpc_report.html +0 -0
  212. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/report/templates/sim_report.html +0 -0
  213. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/dosing.py +0 -0
  214. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/models.py +0 -0
  215. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/plotting.py +0 -0
  216. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/reporting.py +0 -0
  217. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/results.py +0 -0
  218. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/sim/simulate.py +0 -0
  219. {openpkflow-2.3.0 → openpkflow-2.6.0}/src/openpkflow/validation/__init__.py +0 -0
  220. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/__init__.py +0 -0
  221. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/bayes/__init__.py +0 -0
  222. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/bayes/test_bayes_be.py +0 -0
  223. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/bayes/test_map_pk.py +0 -0
  224. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/be/__init__.py +0 -0
  225. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/be/test_study.py +0 -0
  226. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/__init__.py +0 -0
  227. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_alternatives.py +0 -0
  228. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_bootstrap.py +0 -0
  229. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_excel_loader.py +0 -0
  230. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_model_comparison.py +0 -0
  231. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_multi_media.py +0 -0
  232. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_similarity.py +0 -0
  233. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/dissolution/test_study.py +0 -0
  234. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/ml/__init__.py +0 -0
  235. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/ml/test_surrogate.py +0 -0
  236. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/__init__.py +0 -0
  237. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_methods.py +0 -0
  238. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_nca_pdf_docx.py +0 -0
  239. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_nca_reporting.py +0 -0
  240. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_nca_results.py +0 -0
  241. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_sparse_nca.py +0 -0
  242. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_study.py +0 -0
  243. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/nca/test_theoph_reference.py +0 -0
  244. {openpkflow-2.3.0/tests/pop → openpkflow-2.6.0/tests/pipeline}/__init__.py +0 -0
  245. {openpkflow-2.3.0/tests/report → openpkflow-2.6.0/tests/pop}/__init__.py +0 -0
  246. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_dataset.py +0 -0
  247. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_estimation_diagnostics.py +0 -0
  248. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_estimation_model.py +0 -0
  249. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_estimation_objective.py +0 -0
  250. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_foce_i.py +0 -0
  251. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_gof.py +0 -0
  252. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_pop_vpc.py +0 -0
  253. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_saem.py +0 -0
  254. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/pop/test_vpc.py +0 -0
  255. {openpkflow-2.3.0/tests/sim → openpkflow-2.6.0/tests/report}/__init__.py +0 -0
  256. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/report/test_docx.py +0 -0
  257. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/report/test_pdf.py +0 -0
  258. {openpkflow-2.3.0/tests/validation → openpkflow-2.6.0/tests/sim}/__init__.py +0 -0
  259. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/sim/test_methods.py +0 -0
  260. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/sim/test_roundtrip_nca.py +0 -0
  261. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/sim/test_sim_models.py +0 -0
  262. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/sim/test_simulate.py +0 -0
  263. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/test_benchmark.py +0 -0
  264. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_dissolution_bootf2_reference.py +0 -0
  265. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_dissolution_models_reference.py +0 -0
  266. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_ivivc_wn_lr_reference.py +0 -0
  267. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_nca_noncompart_reference.py +0 -0
  268. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_nca_ss_reference.py +0 -0
  269. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_nca_theoph_reference.py +0 -0
  270. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_nca_urine_reference.py +0 -0
  271. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_nca_validation.py +0 -0
  272. {openpkflow-2.3.0 → openpkflow-2.6.0}/tests/validation/test_sim_validation.py +0 -0
@@ -22,6 +22,8 @@ ENV/
22
22
  .coverage
23
23
  htmlcov/
24
24
  .tox/
25
+ .hypothesis/
26
+ .ruff_cache/
25
27
 
26
28
  # Type checking
27
29
  .mypy_cache/
@@ -65,10 +67,32 @@ handout/
65
67
  !src/**/*.html
66
68
  !examples/**/*.html
67
69
  !docs/**
70
+ !webapp/index.html
68
71
 
69
72
  # MkDocs generated site
70
73
  site/
74
+ !site/
75
+ site/*
76
+ !site/app/
77
+ !site/app/index.html
71
78
 
72
79
  # Uploaded images
73
80
  *.png
74
81
  !docs/**/*.png
82
+
83
+ # Frontend tooling (never ship in sdist)
84
+ webapp/node_modules/
85
+ webapp/test-results/
86
+ webapp/playwright-report/
87
+ webapp/vite-dev.log
88
+ **/node_modules/
89
+
90
+ # Cloudflare / Wrangler local state (account metadata)
91
+ .wrangler/
92
+ wrangler.toml.bak
93
+
94
+ # Local handoff archives / extraction (not package source)
95
+ Untitled-handoff.zip
96
+ untitled-handoff-extracted/
97
+ *-handoff.zip
98
+ *-handoff-extracted/
@@ -1,19 +1,32 @@
1
- # CLAUDE.md
1
+ # AGENTS.md
2
2
 
3
- This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
3
+ This file provides guidance to Codex (Codex.ai/code) when working with code in this repository.
4
4
 
5
5
  ## Scope and boundary (read this first)
6
6
 
7
7
  **In scope — build, extend, polish:**
8
- - `dissolution/` — f1, f2, MSD, model fitting, multi-media (greenfield moat vs competitors)
8
+ - `dissolution/` — f1, f2, MSD, model fitting, multi-media, SUPAC screening, alcohol f2
9
9
  - `nca/` — sparse, steady-state, urinary, CDISC PP (greenfield moat)
10
- - `ivivc/` — Level A (greenfield moat)
11
- - `sim/` — analytical compartment models
10
+ - `ivivc/` — Level A + Level B/C helpers (MDT/MRT correlation)
11
+ - `sim/` — analytical compartment models, transit oral, SS metrics
12
+ - `pipeline/` — multi-stage study orchestration + unified reports (v2.6.0)
12
13
  - `bayes/` — MAP individual PK (scipy, screening tool, not regulatory primary)
13
- - `be/` — paired TOST convenience layer + BioEqPy export
14
+ - `be/` — paired TOST convenience layer + power/n + BioEqPy export
14
15
  - `report/` — HTML, PDF, DOCX, Markdown
15
16
  - `validation/` — cross-checks against published references
16
17
 
18
+ **Web app layer (same as CLAUDE.md):**
19
+ - `api/` — FastAPI REST adapter. Current routers: nca, dissolution (incl. multi-media),
20
+ sim, ivivc, be (incl. power / sample-size). Adding a new endpoint requires a schema
21
+ (schemas/), service (services/), router (routers/), and registration in main.py.
22
+ Follow the existing nca router pattern exactly.
23
+ - `webapp/` — React + Vite + Tailwind frontend. Current pages: Home, NCA, Dissolution
24
+ (single + multi-media tab), Sim, IVIVC, BE (analysis + power tab).
25
+ See `progress_web_app.md` for the full file map and next candidates.
26
+ - Do NOT add pharmacometric logic to api/ or webapp/. Add to src/openpkflow/ first.
27
+
28
+ **Takeover:** read `HANDOFF.md` first for branch/PR/release state.
29
+
17
30
  **Out of scope — do not extend (existing code is frozen at v2.3.0):**
18
31
  - `pop/estimation/` — FOCE-I and SAEM exist but must not be extended. Pharmpy and
19
32
  nlmixr2 are validated NLME engines. Bug fixes only. No IOV, no 3-cmt, no covariate
@@ -28,7 +41,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
28
41
  3. The former covariate API in `pop/estimation/` (`CovariateModel`, `apply_covariates`)
29
42
  was a non-functional v2.2.0 skeleton and was removed in v2.3.0. Do not reintroduce
30
43
  covariate estimation without a full external validation plan.
31
- 4. When ROADMAP.md and CLAUDE.md disagree, CLAUDE.md wins. Flag the conflict to the user.
44
+ 4. When ROADMAP.md and AGENTS.md disagree, AGENTS.md wins. Flag the conflict to the user.
32
45
  5. Never use `--no-verify` to bypass pre-commit hooks. Fix the underlying issue instead.
33
46
 
34
47
  ---
@@ -95,17 +108,19 @@ openpkflow dissolution compare data.csv --reference reference --test test --repo
95
108
  ### Module map
96
109
 
97
110
  ```
98
- dissolution/ -- f1, f2, bootstrap_f2, model fitting, loader, reporting <- DONE v0.1-v0.2
99
- nca/ -- AUC, lambda_z, PK parameters, steady-state, urine, tlast <- DONE v0.4.0, v1.3.0
100
- ivivc/ -- Wagner-Nelson, Loo-Riegelman, convolution, Levy, %PE <- DONE v1.2.0
101
- sim/ -- analytical compartment models, dosing, superposition <- DONE v0.5.0
102
- pop/ GOF plots (4-panel), VPC (simulation-based), dataset ← DONE v0.6.0
103
- bayes/ ImportError guards; [bayes] extras wired; PyMC deferred ← v0.8.0 deferred
104
- ml/ PKSurrogate (torch MLP, EXPERIMENTAL) ← DONE v0.9.0
105
- report/ Markdown, HTML, PDF (ReportLab), Word (python-docx)DONE v0.3.0
106
- datasets/ example CSVs (dissolution + theoph NCA reference)
107
- validation/ reference comparison utilities
108
- cli.py — Typer CLI entry point
111
+ dissolution/ -- f1, f2, bootstrap, MSD, models, multi_media, supac DONE (+ v2.6)
112
+ nca/ -- AUC, lambda_z, SS, urine, sparse, CDISC PP DONE
113
+ ivivc/ -- Level A WN/LR/convolution/Levy + Level B/C helpers DONE (+ v2.6)
114
+ sim/ -- 1/2-cmt, dosing, transit oral, SS metrics DONE (+ v2.6)
115
+ pipeline/ -- StudyPipeline multi-stage orchestration + reports DONE v2.6.0
116
+ pop/ -- GOF/VPC + estimation/ FROZEN (bug fixes only) DONE
117
+ bayes/ -- MAP + optional PyMC DONE
118
+ ml/ -- PKSurrogate (torch MLP, EXPERIMENTAL) DONE
119
+ report/ -- Markdown, HTML, PDF (ReportLab), Word (python-docx) DONE
120
+ datasets/ -- example CSVs (dissolution + theoph NCA reference)
121
+ validation/ -- reference comparison utilities
122
+ student/ -- simplified teaching APIs DONE v2.5
123
+ cli.py -- Typer: dissolution, be, ivivc, pop, study run
109
124
  ```
110
125
 
111
126
  ### NCA module layout
@@ -233,9 +248,15 @@ Each test cites a source: paper DOI, FDA guidance ID, or reference implementatio
233
248
 
234
249
  ## Current focus
235
250
 
236
- v2.3.0 is current Pop PK FOCE-I validated against nlme reference, covariate skeleton removed.
237
- Next focus: conda-forge distribution + PowerTOST cross-validation (nice-to-have).
238
- See `ROADMAP.md` for the full ladder.
251
+ **v2.6.0** is the current tree version (pipeline, SUPAC/alcohol, IVIVC B/C, transit sim,
252
+ webapp polish, convolution validation). Code lives on PR #27 until merge.
253
+
254
+ **Immediate next work (in order):**
255
+ 1. Merge PR #27 when CI is green; tag/release v2.6.0 (`RELEASE.md`, `HANDOFF.md`).
256
+ 2. Webapp: study pipeline page; sparse NCA / MAP adapters; SUPAC UI; deploy.
257
+ 3. Keep validation discipline; do not extend frozen `pop/estimation/`.
258
+
259
+ See `HANDOFF.md` for branch/PR state and `ROADMAP.md` for the full ladder.
239
260
 
240
261
  **Before any new feature:** run `python -m build && python -m twine check dist/*` to confirm the wheel is clean.
241
262
 
@@ -244,29 +265,14 @@ See `ROADMAP.md` for the full ladder.
244
265
  ## Release Ladder
245
266
 
246
267
  ```
247
- 0.1.0 f1, f2, input validation, CSV loader, CLI, Markdown+HTML report stub, tests DONE
248
- 0.1.1 bootstrap_f2, profile plots in HTML reports, CI, example datasets, py.typed DONE
249
- 0.1.2 PyPI publish, Trusted Publishing workflow DONE
250
- 0.1.3 README polish, f2_method="regulatory" option, CV% warning in compare()
251
- 0.2.0 dissolution model fitting (Weibull, Korsmeyer-Peppas, Higuchi, first-order,
252
- zero-order) scipy curve_fit, AIC/BIC/R2, fit overlay in HTML report
253
- 0.3.0 full Markdown + HTML + ReportLab PDF report generator
254
- 0.4.0 NCA engine (AUC, Cmax, Tmax, lambda_z, t1/2, CL/F, Vz/F)
255
- 0.5.0 PK simulation (1-comp, 2-comp, oral, IV, infusion, repeated dosing) DONE
256
- 0.6.0 population PK diagnostics, GOF plots, VPC helpers DONE
257
- 0.7.0 Pharmpy bridge SKIPPED (reserved)
258
- 0.8.0 Bayesian PK (PyMC, CmdStanPy) DEFERRED (extras wired)
259
- 0.9.0 ML surrogate (torch MLP, EXPERIMENTAL) DONE
260
- 1.0.0 stable public release DONE
261
- 1.1.0 dissolution regulatory toolkit: MSD, model-dependent comparison, RSD check DONE
262
- 1.2.0 IVIVC Level A: Wagner-Nelson, Loo-Riegelman, convolution predict, %PE DONE
263
- 1.3.0 NCA expansion: steady-state, urinary excretion, CDISC PP output DONE
264
- 1.4.0 multi-media dissolution: pH 1.2/4.5/6.8 panel, alcohol dose-dumping DONE
265
- 1.5.0 Sparse-sampling NCA: model-informed 1-cmt oral from 3-5 data points DONE
266
- 2.0.0 Bayesian PK: MAP individual estimation + full posterior + Bayesian BE (PyMC) DONE
267
- 2.1.0 FOCE-I & SAEM population PK (1-cmt, diagonal Omega) DONE
268
- 2.2.0 2-cmt models, full Omega matrix, covariate skeleton DONE
269
- 2.3.0 Remove covariate skeleton, FOCE-I nlme cross-validation, conda-forge prep DONE
268
+ 0.1.0 - 1.0.0 core dissolution, NCA, sim, reports, stable release DONE
269
+ 1.1.0 - 1.5.0 MSD, IVIVC Level A, SS/urine NCA, multi-media, sparse NCA DONE
270
+ 2.0.0 Bayesian MAP + PyMC BE DONE
271
+ 2.1.0 - 2.3.0 FOCE-I/SAEM, 2-cmt Omega, freeze pop estimation + nlme val DONE
272
+ 2.4.0 replicate BE screening + release credibility sprint DONE
273
+ 2.5.0 web app (api/ + webapp/) + student helpers DONE
274
+ 2.6.0 study pipeline, SUPAC/alcohol, IVIVC B/C, transit, web polish CODE DONE (tag pending)
275
+ 0.7.0 Pharmpy bridge SKIPPED (reserved)
270
276
  ```
271
277
 
272
278
  See `ROADMAP.md` for full milestone detail, scope rationale, and definition of done.
@@ -9,6 +9,134 @@ Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ The v2.6.0 release candidate passes the full standard suite (1275 passed),
13
+ API tests, frontend lint/build/browser tests, strict docs build, mypy, and
14
+ wheel/sdist validation. Tag/PyPI publish remains pending until the hardening
15
+ change is green on `main`.
16
+
17
+ ### Release hardening
18
+
19
+ - **CI**: added API, frontend lint/build/Playwright, Python 3.13 Linux/Windows
20
+ smoke, and enforced type-check jobs; recent Codecov uploads were verified.
21
+ - **API**: upload reads are bounded by the configured size limit; standard
22
+ anti-sniffing, framing, referrer, and browser-permission headers are added.
23
+ - **Population PK**: fixed full-Omega label generation, which reused a string
24
+ loop variable as an integer and crashed for `omega_type="full"`.
25
+ - **Student APIs**: typed dissolution comparison results and fail-closed PK
26
+ route validation; unsupported routes no longer fall through as IV bolus.
27
+ - **Typing**: non-frozen modules pass strict mypy. The frozen legacy
28
+ `pop.estimation` implementation has an explicit module override until it is
29
+ reactivated with external validation.
30
+
31
+ ### Fixed (correction sprint)
32
+
33
+ - **BE**: paired-design intra-subject CV now uses variance-halving
34
+ (`sigma_w^2 = s_d^2 / 2`) before log-normal CV back-transform.
35
+ - **NCA / pipeline**: fail-closed config (unknown keys rejected; explicit
36
+ AUC/BLQ methods required for NCA stages); `auc_tau` enforces times in
37
+ `[0, tau]` and rejects unknown methods; string BLQ markers such as
38
+ `<0.5` no longer become observed concentrations under `blq_method="none"`.
39
+ - **Sim transit**: Savic transit chain + absorption depot; `CL_F`/`Vz_F`
40
+ naming; MTT is applied for all `n_transit` including 1.
41
+ - **IVIVC**: dissolution minutes converted to hours when requested;
42
+ incomplete dissolution no longer renormalised to 100%; default `kel=0.1`
43
+ removed; single-formulation FDA overall-pass disabled (use multi-
44
+ formulation aggregate for Cmax and AUC separately).
45
+ - **Dissolution**: `compare(f2_method=...)` defaults to `regulatory`;
46
+ prerequisite warnings persisted on `ComparisonResult`; ICH M13B Step 2
47
+ absolute SD > 8% at any time point (not RSD only when mean <= 60%).
48
+ - **SUPAC-IR**: function-specific threshold tables (filler, binder,
49
+ disintegrants, stearates, glidants, film coat).
50
+ - **Packaging**: Hatch sdist allowlist excludes `node_modules`, Wrangler
51
+ state, Hypothesis caches, Playwright artifacts; `.gitignore` extended.
52
+ - **Webapp**: NCA/IVIVC snapshot request with result; stale forms disable
53
+ report download until re-run. Extended the same guard to the BE and
54
+ Dissolution analysis tabs (parameter/limit/alpha/sequence/column-mapping
55
+ changes now invalidate the on-screen result); Sim page disables report
56
+ download while a live re-fetch is in flight.
57
+ - **CI/CD**: `publish.yml` now refuses to publish to PyPI unless the pushed
58
+ tag's commit is reachable from `main`.
59
+
60
+ ---
61
+
62
+ ## [2.6.0] - 2026-07-09
63
+
64
+ ### Notes
65
+
66
+ - **Not a corrected release.** Feature merge (#27). Correction sprint must
67
+ land before any scientific claim or tag re-cut for this version line.
68
+
69
+
70
+ ### Added
71
+
72
+ - **Study pipeline** (`openpkflow.pipeline`): compose dissolution, NCA, and BE
73
+ stages into one run with audit metadata, HTML/Markdown multi-section reports,
74
+ and CLI `openpkflow study run config.json --report out.html`.
75
+ - **SUPAC-IR screening** helpers: `classify_supac_ir_level()` and
76
+ `alcohol_dose_dumping_assessment()` in `dissolution/supac.py` (screening only;
77
+ not a substitute for full guidance interpretation).
78
+ - **IVIVC Level B/C**: MDT, MRT, and linear correlation helpers
79
+ (`mean_dissolution_time`, `mean_residence_time`, `level_b_correlation`,
80
+ `level_c_correlation`).
81
+ - **Transit-compartment oral absorption**: `c_1cmt_oral_transit()` (Savic-style
82
+ n/MTT convention) and closed-form `steady_state_metrics_1cmt_oral()`.
83
+ - **Web API / app**: BE power and sample-size endpoints + calculator tab;
84
+ multi-media dissolution analyze/report + Dissolution page tab; IVIVC load
85
+ example and dose_diss/dose_iv UI; expanded Playwright smoke tests.
86
+ - **Validation**: analytical IVIVC convolution cross-check
87
+ (`tests/validation/test_ivivc_convolution_reference.py`); BE power edge
88
+ cases (boundary GMR ~ alpha, monotonicity in n).
89
+ - **Docs**: positioning page, pipeline tutorial, validation matrix updates,
90
+ Docker/compose polish, `examples/pipeline_walkthrough.py`.
91
+
92
+ ### Notes
93
+
94
+ - Pop PK estimation remains frozen (bug fixes only). Formal RSABE remains out
95
+ of scope (companion BioEqPy). SUPAC and replicate BE are screening tools.
96
+
97
+ ---
98
+
99
+ ## [2.5.0] - 2026-06-12
100
+
101
+ ### Added
102
+
103
+ - Student-friendly interface (`openpkflow.student`) with three one-call
104
+ functions: `analyze_pk()` for NCA, `fit_dissolution()` for dissolution
105
+ model fitting + f1/f2 comparison, and `fit_pk_model()` for 1/2-compartment
106
+ PK curve fitting.
107
+ - `student/sim.py` compartmental equations delegate to validated
108
+ `sim/methods.py` functions (c_1cmt_oral, c_1cmt_iv_bolus, c_2cmt_oral) --
109
+ no duplicate math.
110
+ - Hixson-Crowell model added to dissolution `_REGISTRY` (now 6 default
111
+ models: zero_order, first_order, higuchi, korsmeyer_peppas, weibull,
112
+ hixson_crowell).
113
+ - External validation of NCA engine against WinNonlin(r) (Kim et al. 2018,
114
+ PMC6989226, Table 3): all 8 parameters within 0.02% for Theoph Subject 8
115
+ (Cmax, Tmax, lambda_z, t1/2, AUClast, AUCinf, CL/F, Vz/F).
116
+
117
+ ### Fixed
118
+
119
+ - Mandated disclaimer text (CLAUDE.md rule 7) applied to all student module
120
+ report summaries.
121
+ - `test_all_default_models_fit` updated to expect 6 default models.
122
+
123
+ ---
124
+
125
+ ## [2.4.0] — 2026-05-30
126
+
127
+ ### Added
128
+
129
+ - Research-grade replicate bioequivalence screening via `replicate_be()`:
130
+ long-format full/partial replicate data parsing, GMR + conventional 90% CI,
131
+ CVwR estimation, EMA-style scaled-limit summaries, and FDA-style RSABE point
132
+ criterion screening. These outputs are explicitly documented as exploratory
133
+ and not a replacement for jurisdiction-specific validated SAS/R workflows.
134
+ - Replicate BE CLI/report workflow: `openpkflow be replicate`, HTML/Markdown
135
+ reports, JSON export, example partial-replicate CSV, and scalar reference
136
+ validation fixtures for the screening calculations.
137
+ - Release-readiness documentation and slow-validation workflow for heavyweight
138
+ reference checks, plus a read-only `scripts/release_readiness.py` checker.
139
+
12
140
  ---
13
141
 
14
142
  ## [2.3.0] — 2026-05-24
@@ -5,7 +5,7 @@ authors:
5
5
  given-names: Priyam
6
6
  email: priyamthakar1@gmail.com
7
7
  title: "OpenPKFlow: Python-first pharmacometrics and dissolution toolkit"
8
- version: 0.1.0
9
- date-released: 2026-05-17
8
+ version: 2.6.0
9
+ date-released: 2026-07-09
10
10
  url: "https://github.com/priyamthakar/openpkflow"
11
11
  license: MIT