Danny Yang
90d · built 2026-09-08
Performance
What Danny Yang shipped in the selected window, measured in ETV, and how it compares with the 90 days before it.
Effective capacity
−0.1engineers
delivers like 0.9 (0.9x pre-AI)
Output (ETV)
14.8ETV
−11.4% vs 16.7 prior
Features share
29.3%
+1.9 pp vs prior window
Fixes share
46.4%
+1.4 pp vs prior window
Work mix
29.3% Features6.5% Maintenance13.1% Tests4.6% Docs46.4% Fixes
94 commits over 90 days, ending 2026-09-08.
Where this dev ranks
Percentile against the global top-100 leaderboard (all-time totals).
- By commits
- Top 20 %
- By Features share
- Top 62 %
Daily performance
Daily ETV, stacked by Features, Maintenance, Tests, Docs and Fixes.
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
Most impactful commits
Top 10 by ETV in the last 90 days.
- 1.5ETVfix Pydantic alias_generator (#2946) Summary: Fixes #2942 teaching Pydantic config parsing to recognize built-in alias generators from pydantic.alias_generators, carry that through model metadata, and synthesize generated __init__ keyword names when a field has no explicit alias. closes https://github.com/facebook/pyrefly/pull/2946 Reviewed By: rchen152, connernilsen Differential Revision: D113289645 fbshipit-source-id: f4b9ca768768a5f4b79e0d46cd9aac982f85472cgithub.com-facebook-pyrefly · 18a7a3b6 · 2026-07-24
- 0.6ETVOnly treat written `*args: Any, **kwargs: Any` as a gradual signature Summary: Per the typing spec, a signature whose `*args` and `**kwargs` are both typed `Any` is equivalent to `...`. Pyrefly detected this by inspecting the (already-substituted) parameter types, so `Proto[Any]` over `*args: T, **kwargs: T` was wrongly treated as gradual and accepted incompatible callables. Record the property at definition time in a `FuncMetadata` flag instead, so an `Any` introduced by type-parameter substitution no longer counts. Fixes the `callables_annotation` conformance mismatch. Reviewed By: rchen152 Differential Revision: D114691415 fbshipit-source-id: bf27b1a34d4426cffee214d77418fe248ed0b5bcgithub.com-facebook-pyrefly · 40beb729 · 2026-08-04
- 0.6ETVdon't offer statement keywords in expression context Summary: if we're in an expression, we don't need to offer keyword completions like try, while, etc. fixes https://github.com/facebook/pyrefly/issues/4067 Reviewed By: ndmitchell Differential Revision: D111056254 fbshipit-source-id: 72ac5f9bd66f088f276e0914e0f5d1342ef644a0github.com-facebook-pyrefly · 9daf80f6 · 2026-07-08
- 0.5ETVAdd options to automatically remove unused baseline entries & error if baseline has unused entries Summary: A baseline check only fails when there are new unsuppressed errors. As code gets fixed, entries in the baseline stop matching anything and nothing notices, so the file can silently drift out of date until someone remembers to rerun `--update-baseline`. To fix this we can track which baseline entries matched an error during a run, and expose the leftovers through two new flags: - `--error-unused` exits non-zero when the baseline has unused entries, so CI fails until the baseline is refreshed. - `--remove-unused` rewrites the baseline with only the entries that still match. Unlike `--update-baseline` it records no new errors, so the set of suppressed errors can only shrink. Both are mutually exclusive with `--update-baseline` and with each other. fixes https://github.com/facebook/pyrefly/issues/4449 part of https://github.com/facebook/pyrefly/issues/4448 Reviewed By: grievejia Differential Revision: D115145149 fbshipit-source-id: 6f25ee68e4c90b0fb8f88503e812fe945020af13github.com-facebook-pyrefly · 23ba3003 · 2026-08-12
- 0.5ETVHandle error swallowing context manager in reachability/termination calculation Summary: We can't determine whether a context manager swallows errors at the binding step, so whether or not a raise inside a context manager terminates control flow needs to be deferred to the solving step. This is similar to our mechanisms for handling calls to never-returning functions, and various exhaustiveness checks that depend on the narrowed types. Reviewed By: grievejia Differential Revision: D114761866 fbshipit-source-id: 1dd4f2d06eae2778c59a8b3ff391f474391a1859github.com-facebook-pyrefly · 33b28795 · 2026-08-05
- 0.4ETVfix markdown diagnostic emission/parsing Summary: Now that lsp-types is updated for 3.18, we can fix this bug fixes https://github.com/facebook/pyrefly/issues/3823 Reviewed By: stroxler Differential Revision: D109722234 fbshipit-source-id: 7be2e9d3ecf03e66c0cf8d6c78d496f17d951b3agithub.com-facebook-pyrefly · 81db4cab · 2026-06-26
- 0.4ETVFix mypy config migration Summary: Preserve platform, untyped-body, and follow_imports behavior across mypy config formats. Reviewed By: samwgoldman Differential Revision: D115424186 fbshipit-source-id: dc0565570d6cdf153f708ed54a7843d445d0b74agithub.com-facebook-pyrefly · af138ffb · 2026-08-10
- 0.4ETVReport invalid StrEnum TypedDict assignment keys Summary: TypedDict item assignment already has special handling so valid literal keys and invalid literal keys report TypedDict-specific diagnostics instead of going through `__setitem__`. StrEnum members are string-like but not string literals, so assignments like `td[MyEnum.i] = value` fell through to the generic magic-method path and incorrectly reported that the TypedDict has no `__setitem__`. Keep string-like non-literal keys on the TypedDict assignment path. Uniform extra-item TypedDicts still accept dynamic string keys as before; non-uniform TypedDicts now report that a string literal key is required, which points at the actual key issue instead of suggesting item assignment is unsupported. fixes https://github.com/facebook/pyrefly/issues/4255 Reviewed By: stroxler Differential Revision: D113403263 fbshipit-source-id: 5608c01d3dd3a2c428679568da546c9bcfa0f92cgithub.com-facebook-pyrefly · 9a8fa00f · 2026-07-23
- 0.4ETVRead sequence element captures relationally from the narrowed subject Summary: After the facet `isinstance` parent-filter, matching a union of tuples narrows the subject to the matching member, but sibling element captures still read the widened join: `case (str() as x, y)` on `tuple[str, int] | tuple[int, str]` narrows the match subject to `tuple[str, int]`, but `y` still reads from `tuple[str, int] | tuple[int, str]` and has type `int | str` instead of `int` The reason is that a sequence sub-pattern name binds to `UnpackedValue(subject_idx, Index(i))`, and `subject_idx` was narrowed only by `IsSequence + LenEq` -- not by the sibling elements' constraints. The proposed solution in this diff is to fold each leaf sibling element constraint into the subject narrow. A new helper maps a sub-pattern to the atomic narrow op it imposes on its element; these become facet narrows added to the subject's `Narrow` binding. Constraints are derived from the pattern AST, so there is no binding cycle. For https://github.com/facebook/pyrefly/issues/3805 Reviewed By: stroxler Differential Revision: D111908477 fbshipit-source-id: a639d50aecd8e70a8a5a0c4bbe595bcefb0b79b5github.com-facebook-pyrefly · 7a48e983 · 2026-07-23
- 0.3ETVskip value completions when typing a keyword-argument name Summary: followup for ttps://github.com/facebook/pyrefly/issues/4063 when we are typing `func(foo=1, ba|)` at the | we know we are typing a keyword argument because preceding argument is a keyword argument, so we don't need to do value completions. Reviewed By: ndmitchell Differential Revision: D111044534 fbshipit-source-id: 77ae2fd481bd18c27b236b4a3fcc6bdd03561bfbgithub.com-facebook-pyrefly · a7b29203 · 2026-07-08