Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
372 commits
Select commit Hold shift + click to select a range
dff9c75
Lock `wrangler` for playground deployments (#27838)
zaniebot Aug 19, 2026
dadba8c
[ty] Fix dynamic-class diagnostic snapshot in string annotations (#27…
AlexWaygood Aug 19, 2026
88ffbca
Use build backends with fewer dependencies for Python tooling (#27886)
AlexWaygood Aug 19, 2026
dee4ab5
[ty] Lazily infer function parameter default types (#27857)
carljm Aug 19, 2026
1b474c6
[ty] Bound apt retries in instrumented CodSpeed jobs (#27894)
carljm Aug 19, 2026
708a952
[ty] Highlight declarations in invalid-assignment diagnostics (#27872)
AlexWaygood Aug 19, 2026
7d50b9e
[ty] Preserve all alternatives in bounded intersections (#27898)
carljm Aug 19, 2026
da57512
[ty] Add an opt-in unsound-assignment rule for variables (#27874)
AlexWaygood Aug 19, 2026
4eb116c
[ty] Use invalid-type-form for non-generic class annotations (#27889)
carljm Aug 19, 2026
19b8990
Use an explicit PyPI index during release preparation (#27901)
zaniebot Aug 19, 2026
e7f1c3b
[ty] Introduce a helper to centralize logic for resolving modules ref…
lerebear Aug 19, 2026
1e69d7a
[ty] Preserve source protocol members and classify finite aliases (#2…
carljm Aug 19, 2026
b0f6523
[ty] Preserve string annotation context in lambda defaults and TypedD…
charliermarsh Aug 20, 2026
653d851
[ty] Skip invalid subscript arguments in string annotations (#27917)
charliermarsh Aug 20, 2026
248de0b
[ty] Skip scripts with an invalid PEP 723 configuration (#27505)
MichaReiser Aug 20, 2026
b899e18
[ty] Benchmark checking PEP 723 scripts (#27623)
MichaReiser Aug 20, 2026
564fb73
[ty] Prepare ecosystem analysis for script-only uv integration (#27624)
MichaReiser Aug 20, 2026
e0eb7b0
Reduce configuration deserialization code size (#27924)
MichaReiser Aug 20, 2026
7e31571
[ty] Propagate narrowing through statically known branches (#27752)
charliermarsh Aug 20, 2026
0dca233
Rename `RuleGroup` to `RuleStatus` (#27892)
ntBre Aug 20, 2026
b169b40
Install cargo tools locked (#27929)
konstin Aug 20, 2026
974d3cb
Upgrade ecosystem-analyzer and mypy_primer to the latest upstream pin…
AlexWaygood Aug 20, 2026
680cce4
[ty] Optimize inherited recursive protocol comparisons (#27922)
carljm Aug 20, 2026
d1087a4
[ty] Handle assignment expressions in string annotations (#27921)
charliermarsh Aug 20, 2026
4827bf7
Export `UV_DEFAULT_INDEX` in `release.sh` (#27934)
ntBre Aug 20, 2026
ca45fae
Set `--preview` and `--default-index` for the `uv-lock` hook (#27935)
ntBre Aug 20, 2026
f8d575f
[ty] Clarify writing guidance for human readers (#27912)
carljm Aug 20, 2026
cab001e
Disable uv preview for releases and pre-commit hooks (#27939)
ntBre Aug 20, 2026
d53c8c5
Isolate playground builds from deployment credentials (#27839)
zaniebot Aug 20, 2026
11c76bf
Bump 0.16.4 (#27937)
ntBre Aug 20, 2026
4637a19
[ty] More consistent encoding of which typevars are inferable (#27653)
dcreager Aug 20, 2026
6bf32d5
[ty] Make constraint solver outcomes explicit (#27864)
carljm Aug 20, 2026
4eb2045
[ty] Preserve type-variable order when reloading constraints (#27904)
carljm Aug 20, 2026
0980cda
[ty] Traverse shared constraint source-order nodes once (#27947)
carljm Aug 21, 2026
940c9a8
[ty] Move path walking into custom walker (#27945)
dcreager Aug 21, 2026
dde7a34
Update Rust toolchain to 1.98 and MSRV to 1.96 (#27954)
charliermarsh Aug 21, 2026
02cd950
[ty] Fix stack overflow in recursive TypedDict dictionary compatibili…
carljm Aug 21, 2026
88d56e5
Use stabilized Rust pattern assertion macros (#27955)
charliermarsh Aug 21, 2026
5708b03
[ty] Add bounded constraint solution projections (#27949)
carljm Aug 21, 2026
4035841
[ty] Retain bound type-variable instances in constraint arenas (#27956)
dcreager Aug 21, 2026
f856ab0
[ty] Fix invariant gradual tuple materialization ranges (#27946)
carljm Aug 21, 2026
aa42042
[ty] Recognize pytest parametrization with a known class (#27960)
lerebear Aug 21, 2026
d2620d7
[ty] Guard recursive constructor bindings by receiver (#27958)
carljm Aug 21, 2026
34bc477
[ty] Avoid panic on unpacked kwargs in string annotations (#27963)
charliermarsh Aug 21, 2026
2d942cc
[ty] Recognize ABC metaclass methods on protocols (#27897)
carljm Aug 21, 2026
54b36c7
[ty] Support `__slots__` (#27730)
charliermarsh Aug 21, 2026
736fb9f
[ty] Fix slot descriptor runtime metaclass classification (#27970)
charliermarsh Aug 21, 2026
781231b
[ty] Improve LiteralString suggestions in string annotations (#27931)
charliermarsh Aug 22, 2026
f42a9e0
[ty] Avoid duplicate bindings in multi-target assignments (#27938)
charliermarsh Aug 22, 2026
fca5c7c
Fix duplicated "of" in ClientOptions doc comment (#27978)
aarushkandukoori Aug 22, 2026
6d76c0d
[ty] Correct public boundness and declaredness mdtests (#27944)
AlexWaygood Aug 23, 2026
e6bc547
[ty] Omit typeshed versions from resolver debug output (#27988)
AlexWaygood Aug 23, 2026
237755f
[ty] `collections.abc.Callable` is an instance of `type` (#27991)
AlexWaygood Aug 23, 2026
e84cb8d
[ty] Add myself back to the reviewer pool (#27997)
sharkdp Aug 24, 2026
1dec5f4
[ty] Initialize PEP 723 script environments in the CLI (#27544)
MichaReiser Aug 24, 2026
ad4ee17
[ty] Run PEP 723 script synchronization on bounded workers (#27615)
MichaReiser Aug 24, 2026
8d425d6
[ty] Dogfood automatic PEP 723 script environments (#27927)
MichaReiser Aug 24, 2026
69c62c1
[ty] Refresh PEP 723 script environments in watch mode (#27617)
MichaReiser Aug 24, 2026
67dfcf0
[ty] Add a benchmark that has all rules enabled (#27989)
AlexWaygood Aug 24, 2026
6b388d2
[flake8-simplify] Respect side effects in lambda defaults (SIM401) (#…
AlexWaygood Aug 24, 2026
715287d
Limit generated-file check diffs to 100 lines (#28002)
MichaReiser Aug 24, 2026
ae4d792
[ty] Treat typing.Union as a class on Python 3.14+ (#28003)
AlexWaygood Aug 24, 2026
3070999
Use Oxlint for playground linting (#27995)
MichaReiser Aug 24, 2026
20dd9f0
[ty] Account for known subclasses in equality inference (#28005)
carljm Aug 24, 2026
e8837a7
[ty] Specialize Self bounds of inherited methods (#27990)
charliermarsh Aug 24, 2026
423b9fb
[ty] Fix unsound narrowing through branch-assigned conditions (#28006)
carljm Aug 24, 2026
deba645
[ty] Sync vendored typeshed stubs (#28035)
github-actions[bot] Aug 25, 2026
916e8e6
[ty] Classify constraint lower/upper bounds as evidence vs validity (…
dcreager Aug 25, 2026
ff1bada
[ty] Explain missing storage for declared slotted attributes (#27969)
charliermarsh Aug 25, 2026
83d5e64
[ty] Re-enable CodSpeed cycle estimation (#28033)
MichaReiser Aug 25, 2026
d1e842e
[`flake8-datetimez`] Allow timezone-safe `strptime` chains (`DTZ007`)…
jelle-openai Aug 25, 2026
7da3281
[ty] Add more autofixes (#28029)
AlexWaygood Aug 25, 2026
25f2426
[ty] Improve diagnostic spans for unpacked variable assignments (#28041)
AlexWaygood Aug 25, 2026
9459dc0
[ty] Resolve imported pytest fixture exposures (#27539)
lerebear Aug 25, 2026
80bca70
[ty] Fix Self binding in ParamSpec protocols (#28016)
carljm Aug 25, 2026
86427b4
[ty] Expand ParamSpec signatures inferred from bound receivers (#28020)
carljm Aug 25, 2026
39ca616
[ty] Resolve pytest fixtures through conftest (#27540)
lerebear Aug 25, 2026
da2e125
[ty] Support mixed gradual tuple assignability with TypeVarTuple (#27…
carljm Aug 25, 2026
82c2fe7
[ty] Recover bare TypeVarTuples in tuple annotations (#27950)
carljm Aug 25, 2026
76e909d
[ty] Reject fixed tuples for non-inferable TypeVarTuples (#27943)
carljm Aug 25, 2026
d9a4923
[ty] Reject incompatible constructor context for variadic packs (#27966)
carljm Aug 25, 2026
aa52781
[ty] Ignore inconsistent binding decorators on overloads (#28036)
carljm Aug 25, 2026
373a60f
[`flake8-async`] Detect blocking generic HTTP requests (`ASYNC210`) (…
jelle-openai Aug 25, 2026
a7cf727
[ty] Add a dedicated missing-slot diagnostic (#28039)
AlexWaygood Aug 25, 2026
cc932fa
[ty] Resolve installed core pytest fixture providers (#27770)
lerebear Aug 25, 2026
c232eb1
[ty] Preserve bounds of non-literal metaclasses (#28046)
carljm Aug 25, 2026
b58ab72
[ty] Add "Go to Definition" support for pytest fixtures (#27444)
lerebear Aug 25, 2026
fd393f3
[ty] Support tagged union with multiple tags per type (#27984)
marcelo-souzaf Aug 26, 2026
c7b114b
[ty] Fix TypedDict variance inference (#28052)
carljm Aug 26, 2026
3d4fd30
[ty] Infer `yield from` send/return types from the iterator returned …
krzkaczor Aug 26, 2026
2acf96a
Update dependency astral-sh/uv to v0.12.6 (#28054)
renovate[bot] Aug 26, 2026
33b9648
Update prek dependencies (#28055)
renovate[bot] Aug 26, 2026
14622e6
Respect the pygls version bound in ruff-lsp tests (#28057)
MichaReiser Aug 26, 2026
a9fa5e5
[ty] Bump ecosystem-analyzer for script dependency preparation (#28058)
MichaReiser Aug 26, 2026
f41e263
[ty] Validate generic protocol variance (#27531)
charliermarsh Aug 26, 2026
26f4f73
[ty] Infer tuple type parameters from union arguments (#28062)
sharkdp Aug 26, 2026
d5a6394
Fix compiler warnings seen in CI jobs (#28066)
AlexWaygood Aug 26, 2026
7c4724f
[ty] Preserve invariant materialization constraints (#28047)
carljm Aug 26, 2026
49e49f5
[ty] Infer variance through nonrecursive protocol references (#28065)
charliermarsh Aug 26, 2026
dfd606f
[ty] Add Python requirements to uv script test fixtures (#28076)
MichaReiser Aug 26, 2026
92e3264
Update args for uv-lock hook in pre-commit config (#28078)
AlexWaygood Aug 26, 2026
0eeb97d
[ty] Avoid unnecessary Salsa queries during pytest fixture lookup (#2…
lerebear Aug 26, 2026
007157d
[ty] Preserve correlated generic-call inference (#28043)
carljm Aug 26, 2026
50a3eae
Run Hawk in CI (#27372)
charliermarsh Aug 26, 2026
9775a67
[ty] Extract `SequentMap` and `PathAssignments` into dedicated module…
dcreager Aug 26, 2026
ceb9d31
[ty] Factor function-level work out of pytest fixture request lookup …
lerebear Aug 26, 2026
b52fe1b
[ty] Add a test suite for upcoming rules detecting always-truthy and …
AlexWaygood Aug 26, 2026
b453116
[ty] Avoid panics on incomplete protocol type parameter lists (#28088)
carljm Aug 27, 2026
8b807f6
[ty] Fix compiler warning seen in `cargo nextest run` invocations loc…
AlexWaygood Aug 27, 2026
97060ba
[ty] Preserve inferred types for unknown class-decorator results (#28…
AlexWaygood Aug 27, 2026
eb78048
[ty] Bump ecosystem-analyzer for HTML escaping (#28104)
sharkdp Aug 27, 2026
efcffd2
[ty] Intersection simplifications with subtype-related generic specia…
sharkdp Aug 27, 2026
2685fde
[ty] Narrow functional enum members in `==` and `match` (#28103)
BitWeaverDev Aug 27, 2026
d894723
[ty] Infer lambda parameters through callable type aliases (#28109)
malkin0xb8 Aug 27, 2026
ada8795
Introduce category selectors (#27666)
ntBre Aug 27, 2026
50a4d7f
Document the new category selectors (#27906)
ntBre Aug 27, 2026
29c8e5b
Document rule acceptance guidelines (#27910)
ntBre Aug 27, 2026
5fdab73
Update preview default rules and categories (#27877)
ntBre Aug 27, 2026
aad0e90
Allow rules without codes (#28049)
ntBre Aug 27, 2026
9e4938c
Bump 0.16.5 (#28110)
ntBre Aug 27, 2026
3f5e494
[ty] Only treat recursive types with unbounded specializations as fal…
mtshiba Aug 27, 2026
88b8c7a
[`flake8-datetimez`] Reject `tzinfo=None` for datetime bounds (`DTZ90…
jelle-openai Aug 27, 2026
f50f825
[ty] Apply mixin specialization when validating enum members (#28101)
gorewilliams Aug 27, 2026
ce3849b
[ty] Preserve Final variance in stubs (#28119)
carljm Aug 27, 2026
553409a
[ty] Preserve parentheses when removing redundant casts (#28092)
carljm Aug 27, 2026
1776127
[ty] Preserve short-circuit reachability for direct conditions (#28082)
carljm Aug 28, 2026
ad6cf17
[ty] Preserve list literal positions in starred unpacking (#28061)
AlexWaygood Aug 28, 2026
4c8d197
[ty] Run instrumented benchmarks on Depot (#28126)
MichaReiser Aug 28, 2026
49af405
[ty] Synchronize PEP 723 script environments in the language server (…
MichaReiser Aug 28, 2026
754d633
[ty] Highlight PEP 723 script metadata as TOML (#27746)
MichaReiser Aug 28, 2026
c7fe174
[ty] Fix Goto definition in script dependencies (#27747)
MichaReiser Aug 28, 2026
5b1b3fb
[ty] Synchronize saved script metadata on open (#27873)
MichaReiser Aug 28, 2026
0e60c89
[ty] Refresh uv project metadata in the background (#27933)
MichaReiser Aug 28, 2026
47c81c8
[ty] Move script environment initialization to the CLI and LSP (#28038)
MichaReiser Aug 28, 2026
d165c3c
[ty] Cancel superseded queued uv requests (#28108)
MichaReiser Aug 28, 2026
298858e
[ty] Update ecosystem-analyzer (#28131)
sharkdp Aug 28, 2026
0b7da8c
[ty] Use the subclass receiver when checking method overrides (#28124)
carljm Aug 28, 2026
f483959
[ty] Add a missing-direct-dependency rule (#28001)
zsol Aug 28, 2026
4125782
[ty] Optimization: reject impossible eager protocol comparisons early…
carljm Aug 28, 2026
c0b78da
[ty] Preserve type variables in bounded generic defaults (#28122)
carljm Aug 28, 2026
947179d
Enable `lint.preview` and missing default rules in our Ruff config (#…
ntBre Aug 28, 2026
1f7015e
[`flake8-async`, `pylint`] Recognize `builtins.open` (`ASYNC230`, `PL…
jelle-openai Aug 28, 2026
3c77dcc
[ty] Warn when uv metadata cannot support dependency checks (#28133)
zsol Aug 28, 2026
088b7b5
Add another example and glob reference for `lint.per-file-ignores` (#…
chirizxc Aug 28, 2026
4e4e9f5
[ty] Rename Truthiness::and_else to and_then (#28137)
carljm Aug 28, 2026
ef08e25
[ty] Format lint documentation the same way we format mdtests (#28135)
AlexWaygood Aug 28, 2026
c2b2eda
[`flake8-async`] Document thread offloading (`ASYNC240`) (#28008)
tjkuson Aug 28, 2026
4f0b918
[`flake8-use-pathlib`] Add display-only fix for `os.listdir` (`PTH208…
fly1d Aug 28, 2026
d580d7e
Combine redundant `match` arms in `pathlib` rules (#28139)
ntBre Aug 28, 2026
edd48cc
[ty] Bind Self through generic type aliases (#28117)
jamtat Aug 28, 2026
78e34fd
[`pyupgrade`] Clarify default `encoding` argument handling (`UP012`) …
Whning0513 Aug 28, 2026
877599b
[ty] Mark Self override narrowing as a known limitation (#28144)
carljm Aug 28, 2026
ee3e087
[`ruff`] Remove `lint.external` hint for Ruff-specific suppressions (…
waterWang Aug 28, 2026
e837e8b
[`flake8-bugbear`] Fix panic on `match` subjects (`B031`) (#27781)
pikammmmm Aug 28, 2026
da39406
[ty] Model pytest fixture exposures and name sources (#28074)
lerebear Aug 28, 2026
44713bd
[ty] Invalidate member narrowing across loop iterations (#28009)
carljm Aug 28, 2026
b9b193d
[ty] Guard recursive meta-type expansion (#28143)
carljm Aug 28, 2026
f5e6c6a
[ty] Avoid repeated traversal of shared alias arguments (#28147)
carljm Aug 29, 2026
92bb198
[ty] Align conformance.py counts with upstream (#28132)
sinon Aug 29, 2026
38eec97
[ty] Add "Find references" support for pytest fixtures (#28075)
lerebear Aug 29, 2026
33648d4
[ty] Check direct dependencies in PEP 723 scripts (#28136)
zsol Aug 29, 2026
700421c
[ty] Reject circular type alias definitions (#28140)
charliermarsh Aug 29, 2026
59b6e62
[ty] Fix cyclic-alias expectations in type() tests (#28153)
AlexWaygood Aug 29, 2026
917c626
[ty] Reject class access to generic instance attributes (#28123)
charliermarsh Aug 29, 2026
03ade08
[ty] Validate declared variance in method signatures (#28116)
charliermarsh Aug 29, 2026
2c3fa3e
[ty] Clarify the scope of `unsound-assignment` (#28157)
AlexWaygood Aug 29, 2026
4f6426e
[ty] Extract descriptor setter inference (#28159)
charliermarsh Aug 29, 2026
68be8be
[ty] Share class member source-method recovery (#28160)
charliermarsh Aug 29, 2026
4d62239
[ty] Avoid cubic narrowing with repeated assignments and context mana…
charliermarsh Aug 29, 2026
942e781
[ty] Share definition resolution between type inference and IDE featu…
AlexWaygood Aug 31, 2026
79e3205
[ty] Expand tests for upcoming redundant-condition rules (#28182)
AlexWaygood Aug 31, 2026
976a005
[ty] Fix auto-completion panic involving bare declarations (#28191)
sharkdp Aug 31, 2026
fd9e796
[`flake8-pytest-style`] Add an autofix for `PT020` (#27993)
Pierre-Sassoulas Aug 31, 2026
5c64006
[ty] Preserve generic receivers in implicit __init_subclass__ calls (…
carljm Aug 31, 2026
a8d5ba5
[ty] Share call-unwrapping fix generation with Ruff (#28145)
carljm Aug 31, 2026
94181e4
[ty] Add regression test for ty#3598 (#28154)
hamdanal Aug 31, 2026
c9decc6
[ty] Preserve recursion guards across nested type operations (#28150)
carljm Aug 31, 2026
da9e283
Swap `cargo shear` and `hyperfine` to the Astral toolchain (#28197)
woodruffw Aug 31, 2026
91a07f5
Lift cargo-fuzz into astral-dev-toolchain (#28200)
woodruffw Aug 31, 2026
a8fe566
[ty] Propagate deletions through nested loop headers (#28044)
carljm Aug 31, 2026
1dfccad
[ty] Fix loop-header cycle initialization build failure (#28208)
carljm Aug 31, 2026
33aead2
[ty] Remove quantified constraints from source-order history (#28042)
carljm Aug 31, 2026
30334bc
[ty] Avoid repeated inference for literal union call results (#28196)
carljm Aug 31, 2026
bd6548c
[ty] Preserve specialization for inherited TypedDict methods (#28111)
carljm Aug 31, 2026
eb4846c
[ty] Stabilize condition truthiness during cyclic inference (#28212)
carljm Aug 31, 2026
c345a22
[ty] Bound recursive protocol traversal in generic intersections (#28…
carljm Aug 31, 2026
eb6dd83
[ty] Sync vendored typeshed stubs (#28217)
github-actions[bot] Sep 1, 2026
04c1c7f
[ty] Respect type variables in top/bottom materializations of invaria…
sharkdp Sep 1, 2026
0a61f8a
Move `pytest-fixture-autouse` to `restriction` (#28219)
flying-sheep Sep 1, 2026
b2ea1d3
[ty] Treat captured bound-method receivers covariantly (#28180)
charliermarsh Sep 1, 2026
f102454
[ty] Validate type variable scopes in constructors and aliases (#28130)
charliermarsh Sep 1, 2026
f96c18b
Use `cargo insta`, `cargo nextest`, `cargo codspeed` from toolchain (…
woodruffw Sep 1, 2026
597d2da
[ty] Stabilize cyclic terminal-call reachability (#28216)
carljm Sep 1, 2026
0444f4a
[ty] Stop passing `--frozen` to `uv workspace metadata` (#28224)
zsol Sep 1, 2026
7de38e7
[ty] Add a new `disjoint-cast` rule (#28129)
AlexWaygood Sep 1, 2026
a521e8d
[ty] Defer decorator-call diagnostics to avoid recursive-default cycl…
carljm Sep 1, 2026
2136803
[ty] Make cyclic intersection simplification deterministic (#28156)
charliermarsh Sep 1, 2026
61b7942
Update pre-commit hook astral-sh/uv-pre-commit to v0.12.9 (#28244)
renovate[bot] Sep 2, 2026
ac201b8
Update dependency astral-sh/uv to v0.12.9 (#28243)
renovate[bot] Sep 2, 2026
0791ddd
Add duplicate work guidance (#28229)
ntBre Sep 2, 2026
eff1c88
Allow unary plus in match patterns on Python 3.15 (#28231)
ntBre Sep 2, 2026
1edf9fe
[ty] Report deprecations for overloads, operators, and properties (#2…
charliermarsh Sep 2, 2026
0ecff87
Validate unary expressions when parsing (#28233)
ntBre Sep 2, 2026
ab8fe1d
[ty] Respect overload selection in deprecation diagnostics (#28148)
charliermarsh Sep 2, 2026
95723ea
[ty] Unsound intersection simplification for generic iterables (#28068)
sharkdp Sep 2, 2026
df33c17
[ty] Preserve uncertain branches during quantification (#28211)
carljm Sep 2, 2026
2e730ef
[`isort`] Exclude pragma comments from line length calculation (`I001…
ericbuehl Sep 2, 2026
321e8e4
[ty] Optimize materialized recursive protocol comparisons (#28079)
carljm Sep 2, 2026
3163e72
[ty] Report deprecations for implicit constructor calls (#28251)
charliermarsh Sep 2, 2026
455e396
[ty] `lambda` functions are always truthy (#28254)
AlexWaygood Sep 2, 2026
6810bbd
[ty] Preserve generic protocol materialization relations (#28246)
sharkdp Sep 2, 2026
db8a67a
[ty] Preserve `ParamSpec` bindings inferred against type context (#28…
ibraheemdev Sep 2, 2026
108d36c
[ty] Report deprecated property accessors on intersections (#28250)
charliermarsh Sep 2, 2026
6e6622c
[ty] Optimize recursive protocol checks for nested type variables (#2…
carljm Sep 2, 2026
827326f
[ty] Fix negative narrowing for protocols with gradual members (#28198)
sharkdp Sep 2, 2026
849bc61
[ty] Fix callable specialization with union-valued `ParamSpec` (#28085)
ibraheemdev Sep 2, 2026
a1d1759
[ty] Narrow types with ordered length comparisons (#28264)
carljm Sep 3, 2026
115657a
[ty] Preserve gradual type context during generic call inference (#28…
ibraheemdev Sep 3, 2026
53a9448
[ty] Infer variance through recursive protocols (#28077)
charliermarsh Sep 3, 2026
7f6a170
[ty] Move bound APIs to constraint owners (#28094)
dhruvmanila Sep 3, 2026
ee6a6d1
[ty] Support ParamSpecs in `ConstraintSet` (#28028)
dhruvmanila Sep 3, 2026
d2626c8
[ty] Reject missing attributes on `type[]` aliases (#28267)
charliermarsh Sep 3, 2026
35656cf
[ty] Preserve deprecations on decorated callables (#28256)
charliermarsh Sep 3, 2026
3f7a54d
[`flake8-tidy-imports`] Prevent fix loop between `TID254` and `TID255…
ntBre Sep 3, 2026
80b4891
[ty] Temporarily disable tuple types in property tests (#28275)
AlexWaygood Sep 3, 2026
6d6e35d
[`flake8-pytest-style`] Avoid duplicate `PT017` diagnostics (#27918)
AbhinavMir Sep 3, 2026
056ce07
Add UV_LOCKED to all workflows (#28261)
woodruffw Sep 3, 2026
7cc9f1e
[ty] Document `CallableTypeKind` variants (#28277)
AlexWaygood Sep 3, 2026
22f65a2
Bump 0.16.6 (#28280)
ntBre Sep 3, 2026
04e0f94
Add a check-lock workflow (#28283)
woodruffw Sep 3, 2026
1047cc2
Use centralized crates.io publishing policies (#28285)
zaniebot Sep 3, 2026
ec7e6d8
Temporarily revert #28283 to recover the 0.16.6 release (#28286)
ntBre Sep 3, 2026
47f5829
[ty] Preserve nominal subtyping for top-materialized protocols (#28271)
sharkdp Sep 3, 2026
ee74527
Restore #28283 after the 0.16.6 release (#28287)
ntBre Sep 3, 2026
aee4f26
Avoid notifying code owners for Ruff releases (#28282)
ntBre Sep 3, 2026
e794f53
[`flake8-implicit-str-concat`] Mark fix unsafe when it creates a docs…
mdiniz97 Sep 3, 2026
b58168d
[ty] Avoid dict keyword-call panics when typing is shadowed (#28292)
carljm Sep 3, 2026
defb0ad
[ty] Split out union and intersection type relation helpers (#28296)
ibraheemdev Sep 3, 2026
6885154
[ty] Recover cycles when constructing known class instances (#28289)
carljm Sep 3, 2026
6077dc3
[ty] Avoid falling back to `Unknown` when collecting type context con…
ibraheemdev Sep 3, 2026
78eea89
Speed up inherited configuration resolution (#28299)
jogo-openai Sep 4, 2026
930a696
[ty] Add a shared model for pytest test collection (#27973)
lerebear Sep 4, 2026
8ca8d59
[ty] Refactor the pytest fixture binding model to use the shared test…
lerebear Sep 4, 2026
ddd97b3
Use the shared release smoke-test action (#28288)
zsol Sep 4, 2026
ce6f523
[ty] Don't consider removed return types of paramspec values (#28315)
dcreager Sep 4, 2026
f987e68
[ty] Preserve outer type variables during `ParamSpec` inference (#28306)
ibraheemdev Sep 4, 2026
69781a3
[ty] Share retained use-def tables across scopes (#28313)
charliemarsh-oai Sep 4, 2026
8c07af3
[ty] Factor out a dedicated pytest fixtures module. (#28320)
lerebear Sep 4, 2026
0cd20e6
merge upstream ruff through 8c07af3d46e0
KotlinIsland Sep 4, 2026
3cb38f0
fixes from the rebase
KotlinIsland Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
50 changes: 31 additions & 19 deletions .agents/skills/minimizing-ty-ecosystem-changes/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,16 @@ description: Use when a user says "minimize this ty ecosystem change", "reproduc

Start each investigation from fresh artifacts. Do not trust retained memories, previous minimizations, current upstream project state, or the helper script's default lockfile.

Prefix every direct or indirect `gh` invocation with `GH_TELEMETRY=false`; each Codex tool call may start a new shell.

## Collect Exact-Run Metadata

If a primary agent supplied an existing run-metadata manifest, verify that its run ID and attempt match the frozen report and that it contains each assigned project. Reuse the manifest without modifying it.
If the primary agent supplied an immutable `TY_ECOSYSTEM_RUN_METADATA` manifest, verify that its run ID and attempt match the frozen report and that it contains each assigned project. All subagents reuse the same read-only manifest; never modify it or generate another shared manifest.

Otherwise, run the bundled helper with the Actions run ID or URL, matching attempt, and every affected mypy-primer project name:
Otherwise, run the bundled helper once with the Actions run ID or URL, matching attempt, and every affected mypy-primer project name:

```bash
scripts/collect_ty_ecosystem_run_metadata.py \
GH_TELEMETRY=false uv run --script scripts/collect_ty_ecosystem_run_metadata.py \
<actions-run> <project-name>... \
--attempt <actions-attempt> \
--output target/ty-ecosystem-run.json
Expand All @@ -34,36 +36,43 @@ The current workflow splits compilation into `Build ty (base)` and `Build ty (pr

## Prepare ty

If a primary agent supplied freshly copied base and PR profiling binaries plus the PR ecosystem config, preserve their absolute paths as `TY_ECOSYSTEM_BASE_BINARY` and `TY_ECOSYSTEM_PR_BINARY`, verify they exist, and reuse them. Do not rebuild those binaries, switch shared Ruff refs, or overwrite the shared artifacts. An agent may build an exact-revision debug binary on demand to identify an ambiguous internal type, using an isolated worktree if necessary; the profiling binaries remain the behavioral oracle.
If a primary agent supplied freshly copied base and PR profiling binaries plus the PR ecosystem config, preserve their absolute paths as `TY_ECOSYSTEM_BASE_BINARY` and `TY_ECOSYSTEM_PR_BINARY`, verify they exist, and reuse them. Do not rebuild those binaries, switch shared Ruff refs, or overwrite the shared artifacts. If an exact-revision debug binary is needed to identify an ambiguous internal type, request it from the primary agent; the profiling binaries remain the behavioral oracle.

Otherwise, require a clean working tree, copy `.github/ty-ecosystem.toml` from the PR revision, and build ty on the manifest's merge base and PR revision:
Otherwise, require a clean working tree, remember its original ref, and build both exact revisions before assigning any subagent work. Reuse the checkout's existing Cargo target directory, copy the profiling binaries and PR ecosystem config to `target/ty-ecosystem-bins`, and restore the original ref when finished:

Fetch the PR revision explicitly because pull-request runs usually use a synthetic GitHub merge commit that a normal clone does not contain:

```bash
set -euo pipefail

test -z "$(git status --short)" || { git status --short; exit 1; }
git fetch origin <pr-revision>
original_ref="$(git symbolic-ref --quiet --short HEAD || git rev-parse HEAD)"
GH_TELEMETRY=false git fetch https://github.com/astral-sh/ruff.git <pr-revision>
mkdir -p target/ty-ecosystem-bins
trap 'git checkout "$original_ref"' EXIT

artifact_dir="$PWD/target/ty-ecosystem-bins"
build_target_dir="${CARGO_TARGET_DIR:-target}"
export CARGO_PROFILE_PROFILING_DEBUG=line-tables-only

git checkout <merge-base>
git checkout --detach <merge-base>
cargo build --package ty --profile profiling
cp target/profiling/ty target/ty-ecosystem-bins/ty-base
cp "$build_target_dir/profiling/ty" "$artifact_dir/ty-base"

git checkout <pr-revision>
cp .github/ty-ecosystem.toml target/ty-ecosystem-bins/ty-ecosystem.toml
git checkout --detach <pr-revision>
cp .github/ty-ecosystem.toml "$artifact_dir/ty-ecosystem.toml"
cargo build --package ty --profile profiling
cp target/profiling/ty target/ty-ecosystem-bins/ty-pr
cp "$build_target_dir/profiling/ty" "$artifact_dir/ty-pr"
```

After restoring the original ref, inspect vendored definitions and Rust implementations with `git -C <ruff-checkout> show <exact-revision>:<repository-relative-path>`, selecting the merge-base or PR revision from the immutable manifest. Never assume working-tree files match either analyzed binary or switch the shared checkout's ref.

## Reproduce

Create a unique temporary directory for each project and use its absolute path. Read its Python version and the pinned mypy-primer revision from the manifest. Obtain the project revision from the `/blob/<commit>/` component of the original diagnostic's source permalink, and check that links for the same project agree. If no diagnostic permalink exists, inspect the matching diagnostics shard or Actions logs; if the exact revision cannot be recovered, explicitly report that limitation. Then bypass the adjacent script lockfile:
Create a unique temporary directory for each project and use its absolute path. Read its Python version and the pinned mypy-primer revision from the shared manifest. Obtain the project revision from the `/blob/<commit>/` component of the original diagnostic's source permalink, and check that links for the same project agree. If no diagnostic permalink exists, inspect the matching diagnostics shard or Actions logs; if the exact revision cannot be recovered, explicitly report that limitation. Then bypass the adjacent script lockfile:

```bash
uv run \
GH_TELEMETRY=false uv run \
--python <project-python> \
--with "mypy-primer @ git+https://github.com/hauntsaninja/mypy_primer@<mypy-primer-revision>" \
--no-project \
Expand All @@ -73,7 +82,7 @@ uv run \
--exclude-newer <EXCLUDE_NEWER>
```

Use the ecosystem config as user-level configuration, matching CI without replacing project-level config discovery, and re-export `XDG_CONFIG_HOME` in each new shell. If a primary agent supplied `TY_ECOSYSTEM_CONFIG_HOME`, reuse its installed config without modifying it; otherwise, install the copied config locally. Read the project's `strict` or `non-strict` label from the frozen detailed report, or its `strict_settings` value from the matching diagnostics shard. Preserve that mode when running either binary:
Use the ecosystem config as user-level configuration, matching CI without replacing project-level config discovery, and re-export `XDG_CONFIG_HOME` and `RUST_BACKTRACE=1` in each new shell. If a primary agent supplied `TY_ECOSYSTEM_CONFIG_HOME`, reuse its installed config without modifying it; otherwise, install the copied config locally. Read the project's `strict` or `non-strict` label from the frozen detailed report, or its `strict_settings` value from the matching diagnostics shard. Preserve that mode when running either binary:

```bash
if [[ -n "${TY_ECOSYSTEM_CONFIG_HOME:-}" ]]; then
Expand All @@ -85,6 +94,7 @@ else
cp "$PWD/target/ty-ecosystem-bins/ty-ecosystem.toml" "$XDG_CONFIG_HOME/ty/ty.toml"
fi
unset TY_CONFIG_FILE
export RUST_BACKTRACE=1

project_dir="<absolute-temporary-directory>"
ty_base="${TY_ECOSYSTEM_BASE_BINARY:-$PWD/target/ty-ecosystem-bins/ty-base}"
Expand Down Expand Up @@ -116,16 +126,18 @@ pr_exit_status=0
run_ecosystem_ty || pr_exit_status=$?
```

Confirm the detailed report's difference exactly, including duplicate diagnostics and both exit statuses. Ordinary diagnostics can produce exit status 1; do not mistake that for a failed reproduction.
Confirm the detailed report's difference exactly, including duplicate diagnostics and both exit statuses. When reproducing an intermittent severe failure, repeat each side using its reported run count. Ordinary diagnostics can produce exit status 1; do not mistake that for a failed reproduction. For panics, identify the stable fingerprint by comparing the Rust panic site or decisive causal frame and panic payload; ignore checked Python-file paths and incidental backtrace differences.

## Minimize

Reduce the reproduced project toward a self-contained single-file reproducer with minimal code and dependencies. A reduction is trivial only when the difference already occurs in one self-contained file and can be preserved solely by deleting obviously unrelated code. Multiple files, imports or dependencies, inlining, replacing language constructs, ambiguous types such as `@Todo`, or an uncertain cause make a reduction nontrivial. Before attempting any nontrivial reduction, read and follow [references/advanced-minimization.md](references/advanced-minimization.md). If in doubt, treat the reduction as nontrivial.
The target is a fully minimized, provenance-preserving reproducer: preferably one self-contained file, with no avoidable third-party or standard-library imports and no unnecessary definitions, annotations, branches, or advanced language features. Retain a third-party import only if identified ty behavior depends on that library's identity or third-party search-path classification.

Before minimizing any ecosystem change, read and follow [references/advanced-minimization.md](references/advanced-minimization.md). Exhaust its complete reduction loop, including third-party dependency and standard-library inlining, and retain an import only after verifying that neither removing it nor inlining its definitions preserves the underlying behavior.

Matching diagnostics or displayed types do not establish a shared cause. When the output is ambiguous, identify the original and minimized triggers using exact-revision debug output, a targeted `reveal_type`, or the producing Rust call site.
Matching diagnostics or displayed types do not establish a shared cause. When the output is ambiguous, identify and compare the original and minimized triggers using exact-revision debug output, a targeted `reveal_type`, or the producing Rust call site from the matching analyzed revision.

Record the original source permalink, accepted reductions, both binaries' results, and any causal fingerprint. If source provenance or a matching cause cannot be established, return the original project excerpt explicitly marked as unminimized.
A minimization is complete only when a verified reduction chain connects the reproducer to the original ecosystem entry and an exhaustive pass finds no further reduction. If a genuine external blocker prevents completion, report the blocker and identify the minimization as incomplete; an original source excerpt is not a successfully minimized result.

## Return

Provide the original permalinked report entry, exact base and PR behavior, minimal code, full diagnostic messages and error codes, and the manifest/commands needed to reproduce it. When called from the summary workflow, return import-audit and reduction notes separately from report-ready Markdown.
Provide the original permalinked report entry, exact base and PR behavior, minimal code, full diagnostic messages and error codes or the panic fingerprint, and the manifest/commands needed to reproduce it. When called from the summary workflow, return import-audit and reduction notes separately from report-ready Markdown.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Use this reference after the reported difference reproduces against the copied b

## Target

Prefer a single-file reproducer with no third-party imports, few definitions, and the least complex typing or language features that still demonstrate the difference. Keep special modules such as `typing`, `abc`, `enum`, `types`, and `typing_extensions` only when removing them changes the behavior.
Prefer a single-file reproducer with no avoidable third-party imports, few definitions, and the least complex typing or language features that still demonstrate the difference. Keep special modules such as `typing`, `abc`, `enum`, `types`, and `typing_extensions` only when neither removing them nor inlining their definitions preserves the behavior; retain a third-party import only after identifying ty behavior that depends on that library's identity or third-party search-path classification.

## Reduction Loop

Expand All @@ -13,16 +13,16 @@ Work systematically from the reproduced project. NEVER skip ahead to an explanat
1. Delete unrelated files.
2. Remove imports, definitions, decorators, annotations, statements, and branches.
3. Inline first-party definitions into the reproducer.
4. For each required third-party dependency, copy the entire installed dependency into the source tree as first-party code, including every package directory and module it provides. Do this before attempting to minimize any part of the dependency. Adjust imports, verify that the difference still reproduces with the complete copy, and only then begin deleting files or definitions from it. Never start by copying only apparently relevant files or definitions. If cloning a dependency is unavoidable, use the exact installed revision or version and copy the complete dependency into the source tree before reducing it.
5. Inline the relevant standard-library definitions from `crates/ty_vendored`, which is ty's source of truth for stdlib types.
4. For each required third-party dependency, copy the entire installed dependency into the source tree as first-party code, including every package directory and module it provides. Do this before attempting to minimize any part of the dependency. Adjust imports, verify that the difference still reproduces with the complete copy, and only then begin deleting files or definitions from it. If the complete copy changes the behavior because ty special-cases that library or distinguishes first-party from third-party search paths, identify the relevant ty implementation at the matching analyzed Ruff revision before retaining the original import. Never start by copying only apparently relevant files or definitions. If cloning a dependency is unavoidable, use the exact installed revision or version and copy the complete dependency into the source tree before reducing it.
5. Inline the relevant standard-library definitions from the analyzed revision of `crates/ty_vendored`, using `git -C <ruff-checkout> show <exact-revision>:crates/ty_vendored/<path>`; compare the merge-base and PR definitions when they differ.
6. Replace complex constructs with simpler equivalents, such as removing a walrus expression or replacing a protocol when the difference survives.

Repeat the full loop until an exhaustive pass through every stage finds no further reduction that preserves the difference. Do not stop merely because the likely cause is understood or the reproducer is already small.

## Final Audit

Attempt to remove every remaining import and inline every remaining third-party definition. Record why any surviving import is essential. Keep these notes as working evidence; the caller decides whether they belong in its final artifact.
Attempt to remove every remaining import and inline its definitions, including remaining third-party and standard-library definitions. Retain an import only after verifying that neither removal nor inlining preserves the underlying behavior. For a third-party import, additionally verify that its module identity or third-party search-path classification is essential and identify the relevant ty implementation. Convenience, familiar APIs, matching class names, or preserving the diagnostic's module spelling do not justify keeping an import. Record why any surviving import is essential and, for a third-party import, where ty implements the relevant behavior. Keep these notes as working evidence; the caller decides whether they belong in its final artifact.

Verify that the recorded reduction chain connects the final reproducer to the original ecosystem entry and, when diagnostic output is ambiguous, preserves the original causal fingerprint. If either check fails, return the original project excerpt as unminimized instead of substituting an unrelated example.
Verify that the recorded reduction chain connects the final reproducer to the original ecosystem entry and, when diagnostic output is ambiguous, preserves the original causal fingerprint. If a required check fails, continue investigating; if a genuine external blocker prevents completion, report the blocker and mark the minimization as incomplete instead of presenting an unrelated example or original excerpt as a minimized result.

Delete transient project and dependency copies after the investigation.
Loading
Loading