Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/rust-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -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"]`
Expand Down
12 changes: 8 additions & 4 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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
Expand Down
Loading