kineticheck 0.1.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 (46) hide show
  1. kineticheck-0.1.0/.github/ISSUE_TEMPLATE/bug.yml +21 -0
  2. kineticheck-0.1.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. kineticheck-0.1.0/.github/ISSUE_TEMPLATE/dataset.yml +26 -0
  4. kineticheck-0.1.0/.github/ISSUE_TEMPLATE/feature.yml +17 -0
  5. kineticheck-0.1.0/.github/ISSUE_TEMPLATE/macos.yml +34 -0
  6. kineticheck-0.1.0/.github/ISSUE_TEMPLATE/scientific.yml +20 -0
  7. kineticheck-0.1.0/.github/dependabot.yml +10 -0
  8. kineticheck-0.1.0/.github/workflows/ci.yml +88 -0
  9. kineticheck-0.1.0/.github/workflows/macos.yml +70 -0
  10. kineticheck-0.1.0/.github/workflows/publish.yml +60 -0
  11. kineticheck-0.1.0/.gitignore +11 -0
  12. kineticheck-0.1.0/CHANGELOG.md +11 -0
  13. kineticheck-0.1.0/CITATION.cff +15 -0
  14. kineticheck-0.1.0/CONTRIBUTING.md +24 -0
  15. kineticheck-0.1.0/LICENSE +28 -0
  16. kineticheck-0.1.0/PKG-INFO +155 -0
  17. kineticheck-0.1.0/README.md +113 -0
  18. kineticheck-0.1.0/docs/assets/social-preview.png +0 -0
  19. kineticheck-0.1.0/docs/assets/transport-envelope.svg +1274 -0
  20. kineticheck-0.1.0/docs/batch-schema.md +34 -0
  21. kineticheck-0.1.0/docs/macos.md +40 -0
  22. kineticheck-0.1.0/docs/naming-audit.md +48 -0
  23. kineticheck-0.1.0/docs/scientific-basis.md +65 -0
  24. kineticheck-0.1.0/docs/validation.md +36 -0
  25. kineticheck-0.1.0/examples/operating_point.json +33 -0
  26. kineticheck-0.1.0/examples/operating_points.csv +4 -0
  27. kineticheck-0.1.0/pyproject.toml +109 -0
  28. kineticheck-0.1.0/src/kineticheck/__init__.py +31 -0
  29. kineticheck-0.1.0/src/kineticheck/__main__.py +3 -0
  30. kineticheck-0.1.0/src/kineticheck/application.py +188 -0
  31. kineticheck-0.1.0/src/kineticheck/cli.py +101 -0
  32. kineticheck-0.1.0/src/kineticheck/core/__init__.py +21 -0
  33. kineticheck-0.1.0/src/kineticheck/core/criteria.py +233 -0
  34. kineticheck-0.1.0/src/kineticheck/gui/__init__.py +27 -0
  35. kineticheck-0.1.0/src/kineticheck/gui/__main__.py +3 -0
  36. kineticheck-0.1.0/src/kineticheck/gui/app.py +260 -0
  37. kineticheck-0.1.0/src/kineticheck/io/__init__.py +5 -0
  38. kineticheck-0.1.0/src/kineticheck/io/tabular.py +194 -0
  39. kineticheck-0.1.0/src/kineticheck/models.py +87 -0
  40. kineticheck-0.1.0/src/kineticheck/plotting.py +51 -0
  41. kineticheck-0.1.0/src/kineticheck/units.py +82 -0
  42. kineticheck-0.1.0/tests/test_core.py +71 -0
  43. kineticheck-0.1.0/tests/test_gui.py +40 -0
  44. kineticheck-0.1.0/tests/test_io_cli.py +102 -0
  45. kineticheck-0.1.0/tests/test_project_policy.py +41 -0
  46. kineticheck-0.1.0/tests/test_units_application.py +80 -0
@@ -0,0 +1,21 @@
1
+ name: Bug report
2
+ description: Report a reproducible software defect.
3
+ title: "[Bug] "
4
+ labels: [bug]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: "Do not attach unpublished or confidential research data. Create a minimal synthetic reproducer."
9
+ - type: textarea
10
+ id: reproduce
11
+ attributes:
12
+ label: Reproduction
13
+ description: Commands, minimal inputs, expected result, and actual result.
14
+ validations:
15
+ required: true
16
+ - type: input
17
+ id: version
18
+ attributes:
19
+ label: KinetiCheck and Python versions
20
+ validations:
21
+ required: true
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Data confidentiality reminder
4
+ url: https://github.com/hdkim99/KinetiCheck/security
5
+ about: Do not post unpublished, proprietary, personal, or confidential research data publicly.
@@ -0,0 +1,26 @@
1
+ name: Real dataset compatibility
2
+ description: Propose a public, licensed dataset or report an import issue.
3
+ title: "[Dataset] "
4
+ labels: [dataset]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: "Only public data may be linked. Never upload unpublished or confidential laboratory data."
9
+ - type: input
10
+ id: doi
11
+ attributes:
12
+ label: DOI or persistent public URL
13
+ validations:
14
+ required: true
15
+ - type: input
16
+ id: license
17
+ attributes:
18
+ label: Dataset license
19
+ validations:
20
+ required: true
21
+ - type: textarea
22
+ id: scope
23
+ attributes:
24
+ label: Files, checksum, and intended validation scope
25
+ validations:
26
+ required: true
@@ -0,0 +1,17 @@
1
+ name: Feature request
2
+ description: Propose one bounded research workflow.
3
+ title: "[Feature] "
4
+ labels: [enhancement]
5
+ body:
6
+ - type: textarea
7
+ id: need
8
+ attributes:
9
+ label: Research decision and current limitation
10
+ validations:
11
+ required: true
12
+ - type: textarea
13
+ id: evidence
14
+ attributes:
15
+ label: Scientific definition, validity range, and authoritative source
16
+ validations:
17
+ required: true
@@ -0,0 +1,34 @@
1
+ name: macOS or GUI issue
2
+ description: Report installation, Tk, window lifecycle, export, or backend failure.
3
+ title: "[macOS/GUI] "
4
+ labels: [macos, gui]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: "Do not attach confidential data. Include the complete traceback as text."
9
+ - type: input
10
+ id: macos
11
+ attributes:
12
+ label: macOS version and architecture
13
+ placeholder: macOS 15.x, Apple Silicon or Intel
14
+ validations:
15
+ required: true
16
+ - type: input
17
+ id: versions
18
+ attributes:
19
+ label: Python, KinetiCheck, Tk, and matplotlib versions
20
+ validations:
21
+ required: true
22
+ - type: textarea
23
+ id: install
24
+ attributes:
25
+ label: Installation method and exact GUI command
26
+ validations:
27
+ required: true
28
+ - type: textarea
29
+ id: traceback
30
+ attributes:
31
+ label: Complete traceback
32
+ render: shell
33
+ validations:
34
+ required: true
@@ -0,0 +1,20 @@
1
+ name: Scientific result question
2
+ description: Ask about an equation, definition, unit, threshold, or interpretation.
3
+ title: "[Science] "
4
+ labels: [scientific-question]
5
+ body:
6
+ - type: markdown
7
+ attributes:
8
+ value: "Do not post unpublished/confidential data. State the exact rate basis and cite the proposed definition."
9
+ - type: textarea
10
+ id: definition
11
+ attributes:
12
+ label: Equation, convention, and reference
13
+ validations:
14
+ required: true
15
+ - type: textarea
16
+ id: inputs
17
+ attributes:
18
+ label: Minimal synthetic inputs with units and rate basis
19
+ validations:
20
+ required: true
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: pip
4
+ directory: /
5
+ schedule:
6
+ interval: monthly
7
+ - package-ecosystem: github-actions
8
+ directory: /
9
+ schedule:
10
+ interval: monthly
@@ -0,0 +1,88 @@
1
+ name: DGX CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ concurrency:
14
+ group: kineticheck-dgx-${{ github.event.pull_request.number || github.ref }}
15
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
16
+
17
+ jobs:
18
+ scientific:
19
+ name: DGX / scientific, package, CLI, GUI
20
+ # Public fork PR code must never execute on the persistent DGX host.
21
+ if: >-
22
+ github.event_name != 'pull_request' ||
23
+ (github.actor == github.repository_owner &&
24
+ github.event.pull_request.head.repo.full_name == github.repository)
25
+ runs-on: [self-hosted, Linux, ARM64, dgx-spark]
26
+ timeout-minutes: 35
27
+ env:
28
+ PIP_NO_CACHE_DIR: "1"
29
+ PYTHONNOUSERSITE: "1"
30
+ steps:
31
+ - name: Check out reviewed source
32
+ uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.0.0
33
+ with:
34
+ clean: true
35
+ persist-credentials: false
36
+ - name: Set up Python
37
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.0.0
38
+ with:
39
+ python-version: "3.12"
40
+ - name: Activate the verified DGX Tk and Xvfb runtime
41
+ shell: bash
42
+ run: |
43
+ set -euo pipefail
44
+ runtime=/opt/catalysttwin-actions/shared-gui-runtime
45
+ test -x "$runtime/usr/bin/Xvfb"
46
+ test -x "$runtime/usr/bin/xvfb-run"
47
+ test -f "$runtime/usr/lib/aarch64-linux-gnu/libtk8.6.so"
48
+ test -d "$runtime/usr/share/tcltk/tk8.6"
49
+ echo "$runtime/usr/bin" >> "$GITHUB_PATH"
50
+ echo "LD_LIBRARY_PATH=$runtime/usr/lib/aarch64-linux-gnu:${LD_LIBRARY_PATH:-}" >> "$GITHUB_ENV"
51
+ echo "TK_LIBRARY=$runtime/usr/share/tcltk/tk8.6" >> "$GITHUB_ENV"
52
+ - name: Install project and validation tools
53
+ run: |
54
+ python -m pip install --upgrade pip
55
+ python -m pip install -e ".[dev]"
56
+ - name: Ruff format
57
+ run: python -m ruff format --check .
58
+ - name: Ruff lint
59
+ run: python -m ruff check .
60
+ - name: Strict typing
61
+ run: python -m mypy
62
+ - name: Unit, regression, integration, GUI, and import-isolation tests
63
+ run: xvfb-run -a python -m pytest
64
+ - name: Scientific and example CLI smoke
65
+ run: |
66
+ kineticheck validate
67
+ kineticheck evaluate examples/operating_point.json --output "$RUNNER_TEMP/kineticheck-point.json"
68
+ kineticheck batch examples/operating_points.csv --output "$RUNNER_TEMP/kineticheck-batch.xlsx"
69
+ kineticheck plot examples/operating_points.csv --criterion C_WP --output "$RUNNER_TEMP/kineticheck-envelope.svg"
70
+ - name: Tk GUI workflow under Xvfb
71
+ run: xvfb-run -a python -m kineticheck.gui --smoke-test
72
+ - name: Build and metadata check
73
+ run: |
74
+ python -m build
75
+ python -m twine check dist/*
76
+ - name: Clean-wheel installation, CLI, GUI, and pip check
77
+ shell: bash
78
+ run: |
79
+ set -euo pipefail
80
+ wheel="$(find dist -maxdepth 1 -name '*.whl' -print -quit)"
81
+ clean_env="$RUNNER_TEMP/kineticheck-clean-wheel"
82
+ python -m venv "$clean_env"
83
+ "$clean_env/bin/python" -m pip install --no-cache-dir "$wheel"
84
+ "$clean_env/bin/python" -m pip check
85
+ "$clean_env/bin/kineticheck" validate
86
+ xvfb-run -a "$clean_env/bin/python" -m kineticheck.gui --smoke-test
87
+ - name: Dependency audit
88
+ run: python -m pip_audit
@@ -0,0 +1,70 @@
1
+ name: macOS GUI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ concurrency:
14
+ group: kineticheck-macos-${{ github.event.pull_request.number || github.ref }}
15
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
16
+
17
+ jobs:
18
+ gui:
19
+ name: macOS / Tk workflow and clean wheel
20
+ # Apply the same public-fork trust boundary used for the persistent runner.
21
+ if: >-
22
+ github.event_name != 'pull_request' ||
23
+ (github.actor == github.repository_owner &&
24
+ github.event.pull_request.head.repo.full_name == github.repository)
25
+ runs-on: macos-15
26
+ timeout-minutes: 25
27
+ env:
28
+ PIP_NO_CACHE_DIR: "1"
29
+ PYTHONNOUSERSITE: "1"
30
+ steps:
31
+ - name: Check out source
32
+ uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.0.0
33
+ with:
34
+ clean: true
35
+ persist-credentials: false
36
+ - name: Set up Python
37
+ uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.0.0
38
+ with:
39
+ python-version: "3.12"
40
+ - name: Record platform
41
+ run: |
42
+ sw_vers
43
+ uname -m
44
+ python --version
45
+ - name: Install source with GUI and plotting checks
46
+ run: |
47
+ python -m pip install --upgrade pip
48
+ python -m pip install -e ".[dev]"
49
+ - name: Focused scientific and CLI smoke
50
+ run: |
51
+ python -m pytest --no-cov tests/test_core.py tests/test_units_application.py tests/test_gui.py
52
+ kineticheck validate
53
+ kineticheck evaluate examples/operating_point.json --output "$RUNNER_TEMP/point.json"
54
+ - name: GUI import, workflow, export, close, and process exit
55
+ run: python -m kineticheck.gui --smoke-test
56
+ - name: Agg backend isolation smoke
57
+ run: kineticheck plot examples/operating_points.csv --output "$RUNNER_TEMP/envelope.pdf"
58
+ - name: Build and clean-wheel smoke
59
+ shell: bash
60
+ run: |
61
+ set -euo pipefail
62
+ python -m build
63
+ wheel="$(find dist -maxdepth 1 -name '*.whl' -print -quit)"
64
+ clean_env="$RUNNER_TEMP/kineticheck-macos-wheel"
65
+ python -m venv "$clean_env"
66
+ "$clean_env/bin/python" -m pip install --no-cache-dir "$wheel"
67
+ "$clean_env/bin/python" -m pip check
68
+ "$clean_env/bin/kineticheck" validate
69
+ "$clean_env/bin/python" -m kineticheck.gui --smoke-test
70
+ "$clean_env/bin/python" -c "import sys, kineticheck; assert not any(n.startswith(('PyQt', 'PySide')) for n in sys.modules)"
@@ -0,0 +1,60 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*.*.*"]
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ build:
12
+ name: Build immutable distributions
13
+ if: github.repository == 'hdkim99/KinetiCheck'
14
+ runs-on: ubuntu-latest
15
+ timeout-minutes: 15
16
+ steps:
17
+ - name: Check out tagged source
18
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
19
+ with:
20
+ persist-credentials: false
21
+ fetch-depth: 0
22
+ - name: Set up Python
23
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
24
+ with:
25
+ python-version: "3.12"
26
+ - name: Validate tag and build
27
+ shell: bash
28
+ run: |
29
+ set -euo pipefail
30
+ version="$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')"
31
+ test "$GITHUB_REF_NAME" = "v$version"
32
+ python -m pip install build==1.5.0 twine
33
+ python -m build
34
+ python -m twine check dist/*
35
+ - name: Upload distributions
36
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
37
+ with:
38
+ name: kineticheck-distributions-${{ github.run_id }}
39
+ path: dist/
40
+ if-no-files-found: error
41
+ retention-days: 7
42
+
43
+ publish:
44
+ name: Trusted Publishing
45
+ needs: build
46
+ runs-on: ubuntu-latest
47
+ timeout-minutes: 10
48
+ environment:
49
+ name: pypi
50
+ url: https://pypi.org/project/kineticheck/
51
+ permissions:
52
+ id-token: write
53
+ steps:
54
+ - name: Download immutable distributions
55
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.0
56
+ with:
57
+ name: kineticheck-distributions-${{ github.run_id }}
58
+ path: dist/
59
+ - name: Publish with OIDC
60
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
@@ -0,0 +1,11 @@
1
+ .DS_Store
2
+ .coverage
3
+ .mypy_cache/
4
+ .pytest_cache/
5
+ .ruff_cache/
6
+ .venv/
7
+ __pycache__/
8
+ build/
9
+ dist/
10
+ *.egg-info/
11
+ *.py[cod]
@@ -0,0 +1,11 @@
1
+ # Changelog
2
+
3
+ All notable changes follow [Keep a Changelog](https://keepachangelog.com/) and semantic versioning.
4
+
5
+ ## [Unreleased]
6
+
7
+ ## [0.1.0] - pending
8
+
9
+ - Initial four-criterion scientific core with explicit units and rate basis.
10
+ - JSON API/CLI, CSV/XLSX batch workflow, figure export, and Tkinter GUI.
11
+ - Hand, literature-point, packaging, import-isolation, Linux/DGX, and macOS validation infrastructure.
@@ -0,0 +1,15 @@
1
+ cff-version: 1.2.0
2
+ message: "If you use KinetiCheck, please cite the software and the original criterion publications."
3
+ title: "KinetiCheck"
4
+ type: software
5
+ authors:
6
+ - family-names: "Kim"
7
+ given-names: "Peter"
8
+ repository-code: "https://github.com/hdkim99/KinetiCheck"
9
+ url: "https://github.com/hdkim99/KinetiCheck"
10
+ version: 0.1.0
11
+ license: BSD-3-Clause
12
+ keywords:
13
+ - heterogeneous catalysis
14
+ - reaction engineering
15
+ - transport limitations
@@ -0,0 +1,24 @@
1
+ # Contributing
2
+
3
+ Please use a focused issue or pull request and do not upload unpublished or confidential research
4
+ data to a public issue.
5
+
6
+ A scientific-core change must state the equation or definition, units and rate basis, assumptions,
7
+ validity range, authoritative reference, numerical hand check, boundary/invalid-input behavior, and a
8
+ regression test. Matching a paper's rounded result is not a reason to change a definition silently.
9
+
10
+ A GUI change must state supported platforms, dependency and backend impact, macOS smoke result, and
11
+ whether CLI/core import isolation remains intact. GUI settings must reach the application service;
12
+ formulas must not be copied into widgets.
13
+
14
+ Before submitting:
15
+
16
+ ```bash
17
+ python -m pip install -e ".[dev]"
18
+ python -m ruff format --check .
19
+ python -m ruff check .
20
+ python -m mypy
21
+ python -m pytest
22
+ python -m build
23
+ python -m twine check dist/*
24
+ ```
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, Peter Kim
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,155 @@
1
+ Metadata-Version: 2.4
2
+ Name: kineticheck
3
+ Version: 0.1.0
4
+ Summary: Explicit transport-limitation screening for heterogeneous catalytic kinetics.
5
+ Project-URL: Homepage, https://github.com/hdkim99/KinetiCheck
6
+ Project-URL: Documentation, https://github.com/hdkim99/KinetiCheck#readme
7
+ Project-URL: Issues, https://github.com/hdkim99/KinetiCheck/issues
8
+ Project-URL: Repository, https://github.com/hdkim99/KinetiCheck
9
+ Author: Peter Kim
10
+ License-Expression: BSD-3-Clause
11
+ License-File: LICENSE
12
+ Keywords: catalysis,kinetics,mass-transfer,reaction-engineering
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: POSIX :: Linux
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: 3.14
24
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
25
+ Requires-Python: <3.15,>=3.10
26
+ Requires-Dist: openpyxl<4,>=3.1.5
27
+ Requires-Dist: pint<0.26,>=0.24.4
28
+ Provides-Extra: dev
29
+ Requires-Dist: build==1.5.0; extra == 'dev'
30
+ Requires-Dist: matplotlib<4,>=3.9; extra == 'dev'
31
+ Requires-Dist: mypy<2,>=1.14; extra == 'dev'
32
+ Requires-Dist: pip-audit<3,>=2.9; extra == 'dev'
33
+ Requires-Dist: pytest-cov<8,>=6; extra == 'dev'
34
+ Requires-Dist: pytest<10,>=8.3; extra == 'dev'
35
+ Requires-Dist: ruff<0.17,>=0.9; extra == 'dev'
36
+ Requires-Dist: twine<7,>=6; extra == 'dev'
37
+ Requires-Dist: types-openpyxl<4,>=3.1.5; extra == 'dev'
38
+ Provides-Extra: gui
39
+ Provides-Extra: plot
40
+ Requires-Dist: matplotlib<4,>=3.9; extra == 'plot'
41
+ Description-Content-Type: text/markdown
42
+
43
+ # KinetiCheck
44
+
45
+ **Explicit transport-limitation screening for heterogeneous catalytic kinetics.**
46
+
47
+ [![CI](https://github.com/hdkim99/KinetiCheck/actions/workflows/ci.yml/badge.svg)](https://github.com/hdkim99/KinetiCheck/actions/workflows/ci.yml)
48
+ [![macOS](https://github.com/hdkim99/KinetiCheck/actions/workflows/macos.yml/badge.svg)](https://github.com/hdkim99/KinetiCheck/actions/workflows/macos.yml)
49
+ [![License: BSD-3-Clause](https://img.shields.io/badge/license-BSD--3--Clause-blue.svg)](LICENSE)
50
+
51
+ ![A KinetiCheck batch envelope showing operating points below and above the declared Weisz-Prater threshold](docs/assets/transport-envelope.svg)
52
+
53
+ KinetiCheck answers a deliberately limited question: *do the selected classical criteria detect a
54
+ significant internal/external heat- or mass-transfer limitation under the stated properties and
55
+ assumptions?* A passing screen is not proof of intrinsic kinetics.
56
+
57
+ ## Why
58
+
59
+ Published checks often hide whether a rate was per catalyst mass, pellet volume, or bed volume;
60
+ whether diameter or radius was used; and whether a bulk concentration stood in for the pellet-surface
61
+ concentration. KinetiCheck makes those choices machine-readable and includes them in the export.
62
+
63
+ ## Install
64
+
65
+ ```bash
66
+ python -m venv .venv
67
+ source .venv/bin/activate
68
+ python -m pip install kineticheck
69
+ ```
70
+
71
+ Until the first PyPI release, install from source with `python -m pip install .`. Plot export is optional:
72
+ `python -m pip install "kineticheck[plot]"`. The Tkinter GUI has no third-party GUI dependency, but the
73
+ Python installation must include Tk.
74
+
75
+ ## 30-second example
76
+
77
+ ```bash
78
+ kineticheck evaluate examples/operating_point.json
79
+ kineticheck batch examples/operating_points.csv --output results.xlsx
80
+ kineticheck plot examples/operating_points.csv --criterion C_WP --output envelope.svg
81
+ python -m kineticheck.gui
82
+ ```
83
+
84
+ The included example gives `C_WP = 0.02`, `C_MM = 0.01`, `C_MH ≈ 0.02138`, and
85
+ `C_AH ≈ 0.01069`. Its inputs are pedagogical, not a real catalyst dataset.
86
+
87
+ ## Scientific basis
88
+
89
+ | Screen | Implemented dimensionless form | Default comparison |
90
+ |---|---|---|
91
+ | Weisz–Prater internal mass | `C_WP = abs(r_obs,V) R_p² / (D_eff C_A,s)` | `C_WP < 0.30` |
92
+ | Mears external mass | `C_MM = abs(r_obs,V) R_p abs(n) / (k_c C_A,b)` | `C_MM < 0.15` |
93
+ | Mears external heat | `C_MH = abs(ΔH_r) abs(r_obs,V) R_p E_a / (h R_g T_b²)` | `C_MH < 0.15` |
94
+ | Anderson internal heat | `C_AH = abs(ΔH_r) abs(r_obs,V) R_p² E_a / (λ_eff R_g T_s²)` | `C_AH < 0.75` |
95
+
96
+ Each result records its equation, reference, assumptions, threshold, and convention. Thresholds may
97
+ be overridden explicitly. The detailed discussion in [Scientific definitions](docs/scientific-basis.md)
98
+ documents formulation differences rather than presenting a threshold as universal.
99
+
100
+ ## Rate basis and units
101
+
102
+ Pint distinguishes, among others, `mol kgcat^-1 s^-1`, `mol gcat^-1 h^-1`, and
103
+ `mol m^-3 s^-1`, as well as `m`, `mm`, `µm`, `Pa`, `bar`, `J mol^-1`, and `kJ mol^-1`.
104
+ Mass-catalyst rates require an apparent pellet density. Bed-volume rates require a bed void fraction.
105
+ No implicit conversion between those bases is allowed.
106
+
107
+ ## Validation
108
+
109
+ - Four-criterion hand calculation with exact intermediate values.
110
+ - Boundary, invalid physical input, mixed-unit, rate-basis, batch CSV/XLSX, CLI, export, and GUI
111
+ lifecycle tests.
112
+ - Independent reproduction of the `3.910e-5` Mears external-mass value reported in the electronic
113
+ supplement to RSC article `C5CY00934K`.
114
+
115
+ No suitably licensed full public operating-point dataset has yet been adopted; **real-data dataset
116
+ validation is pending**. The literature-point reproduction is not described as dataset validation.
117
+ See [validation](docs/validation.md).
118
+
119
+ ## GUI and supported platforms
120
+
121
+ The GUI uses standard-library Tkinter/ttk. Qt, PyQt, PySide, and PyQtGraph are not dependencies.
122
+ The core/CLI import path does not import Tkinter or matplotlib. Matplotlib is imported only by the
123
+ plot command and uses `Agg`; the Tk GUI currently displays tabular results and therefore does not
124
+ select a matplotlib GUI backend.
125
+
126
+ - Python package metadata: 3.10–3.14; GUI smoke verified on Python 3.12 and 3.14
127
+ - Linux: scientific CI on the repository DGX ARM64 runner
128
+ - macOS: 15.7.7 hosted and 27.0 local, both on Apple Silicon; older versions are not yet verified
129
+ - Architectures: ARM64 is tested; Intel macOS remains not verified
130
+
131
+ Run `python -m kineticheck.gui --smoke-test` to exercise window creation, core calculation, JSON
132
+ export, close, and process exit. See [macOS notes](docs/macos.md).
133
+
134
+ ## Limitations
135
+
136
+ - KinetiCheck screens supplied properties; it does not estimate diffusivity, transfer coefficients,
137
+ conductivity, or reaction order with unreviewed correlations.
138
+ - Classical local criteria do not replace particle-size/flow-rate experiments, detailed pellet
139
+ models, reactor energy balances, or uncertainty analysis.
140
+ - A bulk concentration may only stand in for `C_A,s` when the researcher explicitly accepts that
141
+ assumption.
142
+ - Complex rate laws, strong product inhibition, multiphase wetting, non-spherical characteristic
143
+ lengths, and coupled runaway behavior can lie outside the implemented screens.
144
+ - No confidence interval is fabricated from deterministic criteria.
145
+
146
+ ## Documentation
147
+
148
+ - [Scientific definitions and references](docs/scientific-basis.md)
149
+ - [Batch schema](docs/batch-schema.md)
150
+ - [Validation record](docs/validation.md)
151
+ - [Naming and competitive audit](docs/naming-audit.md)
152
+ - [macOS and GUI policy](docs/macos.md)
153
+ - [Contributing](CONTRIBUTING.md)
154
+
155
+ KinetiCheck is research decision-support software, not process-safety certification software.