From 6a6efc0fae53ba21c63c4b319e9645390a3400ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 18:45:56 +0000 Subject: [PATCH 1/2] chore(deps-dev): bump the python-minor-patch group with 3 updates Bumps the python-minor-patch group with 3 updates: [black](https://github.com/psf/black), [ruff](https://github.com/astral-sh/ruff) and [mypy](https://github.com/python/mypy). Updates `black` from 26.3.1 to 26.5.1 - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/26.3.1...26.5.1) Updates `ruff` from 0.15.13 to 0.15.21 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.15.13...0.15.21) Updates `mypy` from 2.1.0 to 2.3.0 - [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md) - [Commits](https://github.com/python/mypy/compare/v2.1.0...v2.3.0) --- updated-dependencies: - dependency-name: black dependency-version: 26.5.1 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: python-minor-patch - dependency-name: ruff dependency-version: 0.15.21 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: python-minor-patch - dependency-name: mypy dependency-version: 2.3.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: python-minor-patch ... Signed-off-by: dependabot[bot] --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index bd908d318..5f8c4135c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,9 +64,9 @@ dev = [ # Lint CI workflow (.github/workflows/lint.yml) — update both together. # NOTE: black/mypy require Python >= 3.10 (dev tooling only; the library # floor stays 3.9). - "black==26.3.1", - "ruff==0.15.13", - "mypy==2.1.0", + "black==26.5.1", + "ruff==0.15.21", + "mypy==2.3.0", "maturin>=1.4,<2.0", "matplotlib>=3.5", "nbmake>=1.5", From 06c04379484442745be6a66bb73fb92abcabac18 Mon Sep 17 00:00:00 2001 From: igerber Date: Sat, 18 Jul 2026 15:30:09 -0400 Subject: [PATCH 2/2] chore(ci): sync lint.yml pins with dev-tool bump; mypy 3.10 target + py3.9 test leg Companion to the Dependabot bump (black 26.5.1 / ruff 0.15.21 / mypy 2.3.0): - lint.yml: sync the pinned installs with pyproject's dev extra (TestLintWorkflowPinSync contract - the two surfaces move together). - pyproject [tool.mypy]: python_version 3.9 -> 3.10. mypy >= 2.2 rejects a 3.9 target, so static checking can no longer guard the library floor. - rust-test.yml: add a single Python 3.9 Linux leg to the gated test matrix as the compensating runtime floor guard. - CHANGELOG: Unreleased entry for the pin bump. Verified locally with the exact Lint Gate commands: ruff clean, black clean (229 files unchanged), mypy zero errors under the 3.10 target. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01Kt38RMkkZkNXKxi4G3QJ83 --- .github/workflows/lint.yml | 4 ++-- .github/workflows/rust-test.yml | 6 ++++++ CHANGELOG.md | 6 ++++++ TODO.md | 6 ++++-- pyproject.toml | 6 +++++- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ffff12415..4181b497a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -39,7 +39,7 @@ jobs: with: python-version: '3.14' - name: Install pinned linters (keep in sync with pyproject [dev]) - run: pip install ruff==0.15.13 black==26.3.1 + run: pip install ruff==0.15.21 black==26.5.1 - name: Ruff run: ruff check diff_diff tests - name: Black @@ -60,7 +60,7 @@ jobs: # The package itself is NOT installed (mypy analyzes source directly; # no maturin/Rust build ever enters this workflow). - name: Install mypy + runtime deps for their type stubs (pinned) - run: pip install mypy==2.1.0 numpy==2.4.5 pandas==3.0.3 scipy==1.17.1 + run: pip install mypy==2.3.0 numpy==2.4.5 pandas==3.0.3 scipy==1.17.1 - name: Mypy run: mypy diff_diff diff --git a/.github/workflows/rust-test.yml b/.github/workflows/rust-test.yml index 1c82bbd4c..bf2940b80 100644 --- a/.github/workflows/rust-test.yml +++ b/.github/workflows/rust-test.yml @@ -124,6 +124,12 @@ jobs: matrix: os: [ubuntu-latest, macos-latest, windows-latest, ubuntu-24.04-arm] python-version: ['3.11', '3.13', '3.14'] + include: + # Python 3.9 floor guard (single Linux leg): mypy >= 2.2 can no + # longer type-check with python_version = "3.9", so this runtime + # leg is the floor's only continuous CI coverage. + - os: ubuntu-latest + python-version: '3.9' steps: - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 diff --git a/CHANGELOG.md b/CHANGELOG.md index a9081ba58..7f53e2e5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Changed +- **Internal: dev tooling pins bumped** (Dependabot group + manual lint.yml sync): + `black==26.5.1`, `ruff==0.15.21`, `mypy==2.3.0` in both the `dev` extra and the + Lint CI workflow. mypy >= 2.2 can no longer target Python 3.9, so + `[tool.mypy] python_version` moves to `"3.10"` (the library floor stays 3.9); + as a compensating floor guard the gated test matrix gains a dedicated + Python 3.9 Linux leg. - **CI + local AI PR-reviewer model upgraded `gpt-5.5` -> `gpt-5.6-sol` (effort stays `xhigh`).** Validated empirically before the swap via the `tools/reviewer-eval/` 4-arm blinded campaign (66 runs over 11 cases; three independent identity-blind diff --git a/TODO.md b/TODO.md index 5392e2813..c17fb9eb3 100644 --- a/TODO.md +++ b/TODO.md @@ -243,8 +243,10 @@ IF/GMM estimators are tracked in ### Type Annotations `mypy diff_diff` is **enforced at zero errors** by the Lint CI workflow's Mypy job at the -pinned `mypy==2.1.0` (ungated, every PR push; pins synced with the `dev` extra via -`TestLintWorkflowPinSync`). Zero is reached with documented suppressions — tightening them +pinned `mypy==2.3.0` (ungated, every PR push; pins synced with the `dev` extra via +`TestLintWorkflowPinSync`). `[tool.mypy] python_version` targets `"3.10"` (mypy >= 2.2 +cannot target 3.9); the Python 3.9 library floor is covered by a dedicated runtime leg in +the gated test matrix instead. Zero is reached with documented suppressions — tightening them is tracked in Actionable Backlog → Testing / docs: - Global `disable_error_code = ["arg-type", "return-value", "var-annotated", "assignment"]` diff --git a/pyproject.toml b/pyproject.toml index 5f8c4135c..b08ee47b4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -150,7 +150,11 @@ ignore = ["E501"] "tests/test_t19_marketing_pulse_drift.py" = ["E741"] [tool.mypy] -python_version = "3.9" +# mypy >= 2.2 cannot target Python 3.9 (python_version must be >= 3.10), so +# static checking runs against 3.10 even though the library floor stays 3.9. +# The floor is guarded at runtime instead: the gated test matrix carries a +# dedicated Python 3.9 leg (.github/workflows/rust-test.yml). +python_version = "3.10" warn_return_any = false warn_unused_configs = true ignore_missing_imports = true