# Changelog

## Score

- CAI 57 → 70 (+12.7)
- Rubric changed (rubric-2026.09.9 → rubric-2026.09.18) — scores are not directly comparable.

## Lenses

- Code Health 79 → 75 (-4.2)
- Architecture 98 → 93 (-5.0)
- Maturity 66 → 66 (-0.2)
- Readiness 80 → 74 (-6.5)
- Security 35 → 67 (+32.1)
- Event Sourcing 100 → 100 (+0.0)
- Performance 94 (new)

## Resolved (109)

- AnswersSolver::check_attr_set_and_infer_narrow (cognitive 25) (pyrefly/lib/alt/attr.rs)
- AnswersSolver::check_attr_set_and_infer_narrow (cyclomatic 17) (pyrefly/lib/alt/attr.rs)
- AnswersSolver::check_class_attr_set_and_infer_narrow (cognitive 22) (pyrefly/lib/alt/class/class_field.rs)
- AnswersSolver::check_class_attr_set_and_infer_narrow (cyclomatic 19) (pyrefly/lib/alt/class/class_field.rs)
- AnswersSolver::enum_value_lookup_on_class (cognitive 16) (pyrefly/lib/alt/class/enums.rs)
- AnswersSolver::parse_dimension_list_with_context (cognitive 18) (pyrefly/lib/alt/expr.rs)
- AnswersSolver::parse_jaxtyping_annotation (cognitive 19) (pyrefly/lib/alt/jaxtyping.rs)
- AnswersSolver::polars_select (cognitive 28) (pyrefly/lib/alt/polars_specials.rs)
- AnswersSolver::polars_select (cyclomatic 19) (pyrefly/lib/alt/polars_specials.rs)
- BindingsBuilder::stmt (cognitive 270) (pyrefly/lib/binding/stmt.rs)
- BindingsBuilder::stmt (cyclomatic 140) (pyrefly/lib/binding/stmt.rs)
- Boundary-crossing change coupling: map_db.rs ↔ playground.rs (crates/pyrefly_build/src/source_db/map_db.rs)
- Documentation: no architecture or design documentation (website/README.md)
- Documentation: no installation or build instructions (website/README.md)
- Documentation: no usage examples (website/README.md)
- Duplicated block (10 lines × 2) (crates/pyrefly_types/src/type_level_dsl.rs)
- Duplicated block (10 lines × 2) (crates/pyrefly_types/src/type_level_dsl.rs)
- Duplicated block (10 lines × 2) (pyrefly/lib/lsp/non_wasm/server.rs)
- Duplicated block (10 lines × 2) (pyrefly/lib/solver/solver.rs)
- Duplicated block (10 lines × 2) (pyrefly/lib/stubgen/extract.rs)
- …and 89 more

## New (274)

- Ambiguous overlap in intent. `includes` returns `Globs` for a scope, while `get_filtered_globs` returns `FilteredGlobs` and takes `custom_excludes`. It is unclear if `includes` is a simplified version of `get_filtered_globs` with no custom excludes, or if they serve distinct filtering logic. The naming convention (`includes` vs `get_filtered_globs`) is inconsistent.
- AnswersSolver::check_bool_expr_and_get_value (cognitive 16) (pyrefly/lib/alt/solve.rs)
- AnswersSolver::check_except_clause_reachability (cognitive 23) (pyrefly/lib/alt/solve.rs)
- AnswersSolver::check_except_clause_reachability (cyclomatic 17) (pyrefly/lib/alt/solve.rs)
- AnswersSolver::compare_types (cyclomatic 16) (pyrefly/lib/alt/operators.rs)
- AnswersSolver::parse_int_tuple_shape_args (cognitive 17) (pyrefly/lib/alt/expr.rs)
- AnswersSolver::polars_output_count (cognitive 20) (pyrefly/lib/alt/polars_specials.rs)
- AnswersSolver::polars_output_count (cyclomatic 19) (pyrefly/lib/alt/polars_specials.rs)
- AnswersSolver::project_regular_nested_list (cognitive 24) (pyrefly/lib/alt/regular_nested_list.rs)
- AnswersSolver::project_regular_nested_list (cyclomatic 18) (pyrefly/lib/alt/regular_nested_list.rs)
- AnswersSolver::resolve_attr_setters (cognitive 16) (pyrefly/lib/alt/attr.rs)
- AnswersSolver::resolve_class_attr_setter (cognitive 23) (pyrefly/lib/alt/class/class_field.rs)
- AnswersSolver::resolve_class_attr_setter (cyclomatic 19) (pyrefly/lib/alt/class/class_field.rs)
- BaselineIndex::apply (cognitive 20) (pyrefly/lib/error/baseline.rs)
- BindingExpect::fmt (cyclomatic 21) (pyrefly/lib/binding/binding.rs)
- BindingsBuilder::stmt_impl (cognitive 322) (pyrefly/lib/binding/stmt.rs)
- BindingsBuilder::stmt_impl (cyclomatic 157) (pyrefly/lib/binding/stmt.rs)
- BindingsBuilder::stmts (cognitive 21) (pyrefly/lib/binding/bindings.rs)
- BindingsBuilder::stmts (cyclomatic 17) (pyrefly/lib/binding/bindings.rs)
- DslValidator::validate_int_tuple_expression (cyclomatic 16) (crates/pyrefly_types/src/type_level_dsl.rs)
- …and 254 more

## Changes since last survey

- 300 commits — 284 feature/other, 16 fixes

## By area

- tensor-shapes/pyrefly-torch-stubs — 101 commits
- pyrefly/lib — 97 commits
- tensor-shapes/pyrefly-jax-stubs — 39 commits
- (root) — 13 commits
- tensor-shapes/skills — 7 commits
- crates/pyrefly_types — 6 commits
- tensor-shapes/pyrefly-numpy-stubs — 5 commits
- website/docs — 5 commits
- .agents/skills — 3 commits
- crates/pyrefly_bundled — 3 commits
- website/docusaurus.config.ts — 3 commits
- .github/workflows — 2 commits
- conformance/third_party — 2 commits
- tensor-shapes/microtorch — 2 commits
- crates/pyrefly_build — 1 commit
- crates/pyrefly_util — 1 commit
- lsp/.vscode-test.mjs — 1 commit
- lsp/package-lock.json — 1 commit
- lsp/src — 1 commit
- release_notes/release-notes-v1.3.2.md — 1 commit

## Notable commits

- fix: Add regression tests for stale Basic-mode indicator on pyrefly.toml watch events
- fix: Back out "fix Refinement should not turn static types into gradual types #263"
- fix: Easy bugfix: don't redefine torch.device
- fix: Fix Stop stubgen retaining full analysis for the whole import closure (#4690)
- fix: Fix false positive bad-instantiation on NewType over abstract classes (#5023)
- fix: Fix stale Bluesky link on website
- fix: add regression test for Callable[[X, *Ts], R] cannot be called with (x, *args) where args: tuple[*Ts] #4832 (#4950)
- fix: fix Django Support: "pk" field has wrong type when using ForeignKey(…, primary_key=True) #4995 (#4996)
- fix: fix Missing hover on attribute assignment in __init__ #4986 (#4997)
- fix: fix Respect VERSIONS file in typeshed #2535 (#3093)
- fix: fix __get__ overload with self-type Concatenate[ObjT, P1] + sibling TypeVar R1 still unmatched after #4415 #4592 (#4680)
- fix: fix false bad-return for a generator function with Iterator[X] | T return annotation #4825 (#4827)
- fix: fix imports using symlinked paths are not updated #1336 (#3029)
- fix: fix pydantic - Strict types are not treated as strict mode #3543 (#3565)
- fix: fix remove or downgrade the already appear branch in match case #3015 (#3179)
- fix: fix(torch-stubs): return torch.return_types named tuples (#4916)
- change: Accept None for matrix rank tolerance
- change: Accept `axis` in Tensor mean reductions
- change: Accept bare `*S` splats of IntTuple-bounded type variables
- change: Accept bare `*`tuple[...]` and `*IntTuple` splats in shapes
- …and 280 more

## Architecture

- Unchanged — 0 containers · 1 contexts · 0 edges
