Rebecca Chen
90d · built 2026-07-24
90-day totals
- Commits
- 268
- Grow
- 1.7
- Maintenance
- 8.2
- Fixes
- 4.1
- Total ETV
- 14
Where this dev ranks
Percentile against the global top-100 leaderboard (all-time totals).
- By commits
- Top 1 %
- By Growth share
- Top 89 %
30-day trajectory
Last 30 days vs. the 30 days before. Up arrows on Growth and ETV mean improvement; up arrow on Fixes share means more time on fixes (worse).
↓-92.9 %
vs 113 prior
↓-14.1 pp
recent vs prior
↑+59.1 pp
recent vs prior
Daily performance
Daily ETV, stacked by Growth, Maintenance and Fixes.
Work-mix over time
Share of Growth / Maintenance / Fixes over a rolling 7-day window. Reads as 'where is effort flowing right now'.
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
Most impactful commits
Top 20 by ETV in the 90-day window.
- 0.9ETVTake narrowed facets' new `present` bit into account in subscript inference Summary: When a dict key facet is known to be present due to an `in` check, suppress errors on key access about the key possibly being absent. Adds a regression test for a tricky corner case that an earlier draft got wrong: overwriting the value should not affect presence. Note that this updates subscripting to handle the `present` bit correctly but does not yet update `narrow.rs` to *set* the `present` bit, so user-facing behavior is not yet fixed. Reviewed By: yangdanny97 Differential Revision: D107801901 fbshipit-source-id: 2854cab22c0ec167edb48fca8111c0d8e2c8d8efgithub.com-facebook-pyrefly · e13a8135 · 2026-06-10
- 0.8ETVChange AnswersSolver::error to take ErrorKind directly [9/16] Summary: Pyrefly's error reporting API has grown unwieldy. ErrorCollector currently has two methods for emitting errors (add and add_with_annotations_and_quick_fixes) whose signatures grow every time we add a new optional decoration like annotations or quick fixes. This stack introduces a builder pattern (design: P2307835290, implementation plan: P2307836987) that replaces these methods with an error_builder() returning a chainable ErrorBuilder, making error construction explicit and extensible. This commit changes AnswersSolver::error from taking ErrorInfo to taking ErrorKind directly. After commits 6-7 migrated all ErrorInfo::new and ErrorInfo::Context call sites away, only ErrorInfo::Kind(k) callers remain — this is a purely mechanical replacement. The method now delegates to error_builder internally. All ~250 callers are updated to pass ErrorKind directly, and unused ErrorInfo imports are removed. Reviewed By: fangyi-zhou Differential Revision: D103990096 fbshipit-source-id: e74b693775121033dde6a58c4a8d76ae09779124github.com-facebook-pyrefly · c8170021 · 2026-05-12
- 0.4ETVExclude union names from ordering and type equality Summary: Unions should be compared only by their members; the name is display-only metadata. Reviewed By: yangdanny97 Differential Revision: D112931511 fbshipit-source-id: 1f1419eebdcbd079a7248d93a58388a925d71962github.com-facebook-pyrefly · 204f13e3 · 2026-07-21
- 0.4ETVMove residual-related functions that only operate on Type + TypeHeap to the types crate Summary: This stack: reorganizes some of the callable residual code to make it clearer which parts of the logic are tightly coupled to the solver, which will make it easier for me to make solver changes. This diff: moves Solver functions that access nothing from the Solver except `self.heap` into the types crate. They are turned into methods on the appropriate types that accept a `&TypeHeap` argument. No functional change. Reviewed By: yangdanny97 Differential Revision: D106045944 fbshipit-source-id: bb7abe3efa6dca4bacff3bcabd00fb7812359f7agithub.com-facebook-pyrefly · 6fe64d1e · 2026-05-22
- 0.3ETVMigrate direct ErrorCollector::add calls to builder [10/16] Summary: Pyrefly's error reporting API has grown unwieldy. ErrorCollector currently has two methods for emitting errors (add and add_with_annotations_and_quick_fixes) whose signatures grow every time we add a new optional decoration like annotations or quick fixes. This stack introduces a builder pattern (design: P2307835290, implementation plan: P2307836987) that replaces these methods with an error_builder() returning a chainable ErrorBuilder, making error construction explicit and extensible. This commit migrates all ~48 direct errors.add(range, ErrorInfo::Kind(k), vec1![msg]) calls to use the builder. Single-line messages become errors.error_builder(range, kind, msg).emit(). Multi-line Vec1 messages are split into header + with_detail() chains. Dynamic Vec1 built with pushes are converted to conditional builder chains. Files modified across alt/, binding/, module/, and state/. Unused ErrorInfo and vec1 imports are removed. Reviewed By: fangyi-zhou Differential Revision: D103990088 fbshipit-source-id: 5f2a534ec943b5e50e8fb6bbbd18da5696417841github.com-facebook-pyrefly · 0e74a475 · 2026-05-12
- 0.3ETVFix overly aggressive cyclic self-reference check Summary: Improves pyrefly's check for cyclic self-references in recursive aliases to accept more aliases. The only ones it rejects now are: * Uninhabited types, like `type X = tuple[X, X]`. * Types that are inhabited only by nestings of empty containers, like `type Y = list[Y]`. * Union types where the self-reference is pointless, like `type Z = int | Z`. Fixes https://github.com/facebook/pyrefly/issues/3235. Reviewed By: yangdanny97 Differential Revision: D107783755 fbshipit-source-id: c30975f36d8f9a39438f76306e77f17633015a52github.com-facebook-pyrefly · 2f4e0524 · 2026-06-08
- 0.3ETVCheck for when a quantified satisfies another quantified's constraints Summary: is_subset_eq's logic for determining whether a type T satisifies a constrained Quantified failed to take into account the case in which T is also a Quantified. This diff adds handling for that case, in a new `quantified_satisfies_constraints` method. Reviewed By: stroxler Differential Revision: D107588970 fbshipit-source-id: d7bdea3d91b4d41228482698c975f40b466c48a0github.com-facebook-pyrefly · 353e544f · 2026-06-05
- 0.2ETVDetect Final status changes in incremental export diffing Summary: `Exports::changed_exports` was not comparing `final_names` between old and new definitions, so adding or removing a `Final` annotation on an export would not be detected as a metadata change. This meant downstream modules depending on finality (via `ExportOrigin`) would not be re-checked, leading to stale errors. Add `final_names` to the metadata comparison in `changed_exports`. Reviewed By: grievejia Differential Revision: D104303060 fbshipit-source-id: 1c44c905bd4e8f33b705a47f83ed168fe24b45c2github.com-facebook-pyrefly · febf00ac · 2026-05-08
- 0.2ETVUnify var traversal in solver.rs Summary: * Adds a new `resolve_vars` function that handles var traversal for both `expand_vars` and `deep_force`, allowing us to clean up some duplication and redundant helpers. * Moves dimension canonicalization into `simplify_mut` so we can get rid of `simplify_forced_type`. * Removes a couple no-longer-relevant TODOs. No functional change. Reviewed By: yangdanny97 Differential Revision: D106076328 fbshipit-source-id: 63d4277da296a6380cca01a06f8308ab19a625b3github.com-facebook-pyrefly · 1389b585 · 2026-05-26
- 0.2ETVBackfill missing release notes Summary: Backfills missing release notes for 0.58.0 - 0.63.0. Once this diff is approved, I'll edit these into the corresponding releases. 0.59.0 already has release notes on GitHub, so all I did for that version was copy the existing notes into the release_notes directory. There was already an md file for 0.60.0, but it hadn't been copied to the GitHub release, and the content looked a little questionable anyway, so I re-generated it. Reviewed By: ndmitchell Differential Revision: D103356172 fbshipit-source-id: a4e073ed3a8a14b0994a05a5fbdc19a27e31b2f9github.com-facebook-pyrefly · fa0c0f72 · 2026-05-01
- 0.2ETVSimplify `finish_quantified_*` cluster of Solver functions Summary: Previously, the solver had five finish_quantified_* functions: three pub, one pub(crate), and one private. This diff gets us down to two: one pub and one private. It also adds a `finish_quantified` wrapper on AnswersSolver to reduce boilerplate, like we do already do with `is_subset_eq` and friends. This *is* a functional change: we now always create a Subset object and do overload pruning when calling `finish_quantified`. CI does not find any change to user-facing behavior. Reviewed By: yangdanny97 Differential Revision: D106052351 fbshipit-source-id: 8307e2ff6f1941b013d6b1d320073d48acea962egithub.com-facebook-pyrefly · fbcbbc6e · 2026-05-22
- 0.2ETVCreate `pyrefly/lib/alt/types/instance.rs` Summary: Moves `InstanceKind` and `Instance` into their own file in preparation for reusing them. No functional change. Reviewed By: grievejia Differential Revision: D105456425 fbshipit-source-id: 8c7b1765afe9ee156684c472e1c84d16da814aa4github.com-facebook-pyrefly · 7478e058 · 2026-05-19
- 0.2ETVSanitize self-referential vars when pruning overload branches Summary: Fixes https://github.com/facebook/pyrefly/issues/3749. Reviewed By: yangdanny97 Differential Revision: D108200384 fbshipit-source-id: d6a629f4f0a083f6697e1895828db85daa491d58github.com-facebook-pyrefly · 9c7a537d · 2026-06-11
- 0.2ETVRename `expected_types` to `argmap` and wrap it in a struct Summary: No functional change. I'm planning to add more info to this map, so let's first rename it and make it more structured. Context: This stack is a ground-up re-implementation of https://github.com/facebook/pyrefly/pull/1447. It has a narrower focus (just omits irrelevant parameter types, doesn't try to do any handling of other kinds of call errors), reuses the existing signature display code, tracks parameters by name instead of index, and filters all overload signatures rather than just the closest one. Reviewed By: grievejia Differential Revision: D108230388 fbshipit-source-id: 3a7f63d9143cc2767566f414b7994e4eff015d5cgithub.com-facebook-pyrefly · 276aabb4 · 2026-06-12
- 0.2ETVFix all clippy warnings Summary: Looks like we got upgraded to a new Rust version. Warnings fixed: - **collapsible_match** (16 instances): Collapsed `if` conditions inside match arms into match guards in `ast.rs`, `folding.rs`, `simplify.rs`, `code_lens.rs`, `hover.rs`, `inlay_hints.rs`, `convert.rs`, `inline_variable.rs`, `pytest_fixture.rs`, `lsp.rs`, `extract.rs` - **unnecessary_sort_by** (3): Replaced `sort_by(|a, b| a.x.cmp(&b.x))` with `sort_by_key(|a| a.x)` in `report.rs`, `semantic_tokens.rs` - **while_let_loop** (3): Converted `loop { let Some(...) = ... else { break }; ... }` to `while let Some(...) = ... { ... }` in `server.rs`, `state.rs` - **dead_code** (1): Removed unused method `enclosing_class_and_metadata_keys` in `scope.rs` - **manual_checked_ops** (1): Replaced manual division-by-zero check with `checked_div` in `server.rs` - **useless_conversion** (1): Removed unnecessary `.into_iter()` in `dict_completions.rs` - **iter_kv_map** (1): Replaced `.iter().flat_map(|(h, _)| ...)` with `.keys().flat_map(|h| ...)` in `state.rs` - **Redundant guard** (1): Removed duplicate condition check in `simplify.rs` where the match guard already checked the same condition as the inner `if` Reviewed By: stroxler Differential Revision: D103764683 fbshipit-source-id: 0911b3141a9fe6abb171a82ea05153bcb02ca0f7github.com-facebook-pyrefly · 7c011a6b · 2026-05-05
- 0.2ETVRead generic residuals from the call context Summary: Context: this stack migrates generic residuals from being stored on Variable to being stored on CallContext. This has several advantages: * This makes generic residuals look a lot more like overload residuals, which will enable code sharing in a later diff. * Separating residuals and variables makes the solver (a little) more modular. * At least to me, it makes more sense for the conceptual unit to be a *set* of residuals associated with a call, rather than a single residual describing a standalone property of a variable. This diff: switches `generalize_class_targs` and `finish_quantified_with_pruning` to read generic residual information from `GenericResidualCapture` on `CallContext` instead of the `residuals` field on `Variable::Quantified`. Remove the dual-write from the previous diff. One wrinkle is that during Callable subset checking, contravariant parameter comparisons negate the `argument_side`, which disables `record_deferred_residual_target_vars` for parameter-side vars. Those vars only appear in `witness_vars` indirectly — through union-find unification with vars that ARE in `witness_vars`. To handle this, we have to resolves vars through the union-find root before matching against `witness_vars`. Also stores generic residuals in overload branch snapshots, so `materialize_overload_residual_branch_value` can determine whether a snapshotted `Quantified` var should produce a `callable_residual_generic` type. Reviewed By: stroxler Differential Revision: D106163696 fbshipit-source-id: 1570cdb954f63fe6d829b94b5118178538b661f1github.com-facebook-pyrefly · ea593dfd · 2026-05-27
- 0.2ETVRemove unnecessary parameters from `FuncMetadata::def` Summary: `FuncMetadata::def` took (module, cls, func, def_index), but really only needs to take cls and func. The module can be computed from the class, and def_index was None at every call site. Note: callers were previously inconsistent about whether we used the module from the class or the current module, but we really should be using the module from the class. Reviewed By: migeed-z Differential Revision: D103759635 fbshipit-source-id: ce16b175376a592406b7a43fe555680ffd1144d9github.com-facebook-pyrefly · 4ecf8c7f · 2026-05-06
- 0.2ETVExpand recursive type aliases in `infer_with_decomposed_hint` Summary: Contextual typing did not work properly for recursive type aliases, because we treated the recursive reference as a single hint rather than splitting it up. This diff fixes that by replacing the recursive reference with the actual value of the alias in `infer_with_decomposed_hint`. Reviewed By: yangdanny97 Differential Revision: D109517652 fbshipit-source-id: d58eb6af0c3e86b07cac553c5f8347de442bf369github.com-facebook-pyrefly · 33023108 · 2026-06-24
- 0.2ETVIntroduce `expr_with_options` Summary: Context: There are 11 (!!) methods in `expr.rs` whose names begin with `expr` and which do some variation of inferring and/or checking a type for an `Expr`. This stack slims things down to a pair of implementation functions (`expr_infer_impl` and `expr_infer_impl_helper`), one intermediate function that delegates to the implementation functions (`expr_with_options`), and some thin wrappers for common options. The final state will be (**bold** = added, ~~strikethrough~~ = removed): | Function | Status | | --- | --- | | expr_check | kept as a thin wrapper, renamed from expr | | expr_infer | kept as a thin wrapper | | expr_infer_with_hint | kept as a thin wrapper | | expr_infer_with_hint_promote | kept, helper that calls expr_infer_with_hint + promotes | | **expr_with_options** | new intermediate function, delegates to impl | | expr_infer_impl | kept, renamed from expr_infer_type_info_with_hint | | expr_infer_impl_helper | kept, renamed from expr_infer_type_no_trace | | ~~expr_with_separate_check_errors~~ | removed | | ~~expr_with_separate_check_errors_with_call_context~~ | removed | | ~~expr_type_info~~ | removed | | ~~expr_type_info_with_separate_check_errors~~ | removed | | ~~expr_type_info_with_separate_check_errors_with_call_context~~ | removed | --- This diff: adds `ExprOptions` and the `expr_with_options` intermediate function that delegates to `expr_infer_impl` and checks the inferred type against the expected type depending on the options. Re-implements the various existing `expr` functions in terms of `expr_with_options`. A couple are dead now, but we don't remove them yet; we'll do all the deletions in one go later. Reviewed By: yangdanny97 Differential Revision: D107697708 fbshipit-source-id: eedf1561b6ded986852d16f7af523db054097566github.com-facebook-pyrefly · 77598710 · 2026-06-08
- 0.2ETVAdd ability to filter by a parameter set when displaying ParamsList Summary: Adds a `ParamOverlay` enum to control which parameters are included when displaying a ParamsList. The enum has two variants: `All` (include all params) and `Subset(SmallSet<Name>)` (include only this set of params). Anonymous params (name=None) are always included. Params that are not included are replaced with `...`. `/` and `*` markers are always included. This will be used in the next diff to improve signature display in no-matching-overload errors. Context: This stack is a ground-up re-implementation of https://github.com/facebook/pyrefly/pull/1447. It has a narrower focus (just omits irrelevant parameter types, doesn't try to do any handling of other kinds of call errors), reuses the existing signature display code, tracks parameters by name instead of index, and filters all overload signatures rather than just the closest one. Reviewed By: grievejia Differential Revision: D108230385 fbshipit-source-id: 50a4425640cdd31caf8bfc644f07d3cab7fc6545github.com-facebook-pyrefly · 9eebde3e · 2026-06-12