Sam Goldman
90d · built 2026-09-08
Performance
What Sam Goldman shipped in the selected window, measured in ETV, and how it compares with the 90 days before it.
Effective capacity
+0.8engineers
delivers like 1.8 (1.8x pre-AI)
Output (ETV)
25.6ETV
+68.3% vs 15.2 prior
Features share
25.4%
−18.2 pp vs prior window
Fixes share
15.7%
+6.0 pp vs prior window
Work mix
25.4% Features49.9% Maintenance6.8% Tests2.1% Docs15.7% Fixes
118 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 52 %
- By Features share
- Top 78 %
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.9ETVBorrow calculated answers through solver scopes Summary: This stack eliminates per-answer `Arc` storage to reduce allocation and atomic refcount overhead and improve memory use. After giving provisional SCC answers stable storage, retaining cross-module answer providers, and preserving intentional `TParams` sharing, downstream solver APIs can borrow calculated results directly. This diff changes `AnswersSolver`, `LookupAnswer`, and exported-key solving to return references for completed and provisional calculations. Published results borrow from `Answers` or `Solutions`; provisional SCC results borrow from their retained generation. Truly synthesized shortcut and depth-limit answers are retained by `AnswerScope` so they can use the same scope lifetime. Solver consumers now accept the borrowed values directly. `TParams` consumers can clone the semantic `Arc<TParams>` when constructing shared `TArgs` without copying the underlying parameters. Forward-like producers temporarily use a narrow `get_idx_arc` compatibility API, preserving their existing cheap `Arc` clone without copying `TypeInfo`. A later diff makes these aliases explicit and removes that final owned-result API. Reviewed By: rchen152 Differential Revision: D117087359 fbshipit-source-id: c70410b108d41418a5389a8021ac0fea8e6c9089github.com-facebook-pyrefly · 1e656e20 · 2026-08-26
- 1.3ETVPublish calculation results with atomic status Summary: This stack eliminates per-answer `Arc` storage to reduce allocation and atomic refcount overhead and improve memory use. Its first phase removes the need to clone exported answers one by one when transitioning from Answers to Solutions. To share that storage efficiently, calculating answer cells must become pointer-sized and avoid calculation-only synchronization overhead once published. This diff replaces each calculation mutex and condition variable with atomic publication status. Ordinary results transition directly from unpublished to published, while SCC results use ordered reservations and a short busy-wait when another worker owns a slot. The intended correctness invariant is that workers computing the same recursive component converge on the same SCC. Because every worker reserves members in `CalcId` order and waits on pending reservations, one worker serializes identical contenders and publishes every answer. We retain a weaker fallback because this invariant is not guaranteed: the iteration limit can leave workers with different entrypoint-dependent partial SCCs, and dynamic answer-dependent discovery could theoretically produce different SCCs even after convergence. Each worker therefore attempts every member even if it loses the lowest member, publishes every slot it reserves, and skips results already published or evicted. If workers find disjoint SCCs for the same recursive computation, this can mix results from different workers, potentially producing strange typing behavior; the correctness of that fallback is not proven. The next diff can combine this status with the result pointer, moving answer cells toward the pointer-sized representation needed for shared solution storage. Reviewed By: grievejia Differential Revision: D115246286 fbshipit-source-id: 935a783068cb6199a0091a489ce5b4f8a20464cdgithub.com-facebook-pyrefly · eb3b23a1 · 2026-08-18
- 1.1ETVMake calculation stack pushes panic-safe Summary: Stable SCC answer storage will allow solver operations to return borrowed results, but calculation evaluation may still unwind while its `CalcId` is present on the thread-local stack. Leaving that entry behind also leaves the `position_of` reverse index inconsistent for any code that catches the panic. Represent each pushed calculation with a small RAII guard. Normal completion consumes the guard while taking a completed SCC; unwinding drops it and restores both stack indexes. The guard owns no answers and imposes no lifetime boundary on result references. Reviewed By: stroxler Differential Revision: D115772355 fbshipit-source-id: 5d9b300b5a50c5825723cf10a597ba03577d31d4github.com-facebook-pyrefly · 378c432b · 2026-08-19
- 1.0ETVLazy materialize implicit builtins Summary: Eagerly adding the full `builtins` and `__builtins__` wildcard set to every module gives every file hundreds of retained `Key::Import` and `Binding::Import` rows even though most files read only a small subset. This changes name lookup so a true module-scope miss checks the shared builtin wildcard exports and materializes only the builtin names that are actually read, using the same path for full checks and LSP. The lazy static entry is still represented as an import binding after the binding pass, so downstream consumers that inspect bindings can resolve it, while export collection and special-export lookup preserve shadowing and avoid treating fallback builtins as real module definitions. Flow merging treats these implicit builtins as defined so a first use inside one branch does not become a conditional local. Benchmark Results: Paired AB/BA measurements from optimized binaries. Baseline is `D108438904`, the ignore-based file traversal diff; experiment is this diff grafted on top. CPU is user+system time; deltas are experiment minus baseline. MaxRSS is maximum resident set size from `/usr/bin/time -v`. Confidence intervals are 95% bootstrap CIs over paired deltas. Positive deltas are regressions. Max concurrency of 64 threads. | workload | pairs | CPU delta | CPU 95% CI | wall delta | wall 95% CI | MaxRSS delta | MaxRSS 95% CI | | `homeassistant-core` | 10 | -16.652s (-10.74%) | [-18.029, -15.460]s | -0.322s (-8.39%) | [-0.423, -0.226]s | -255.0 MB (-12.93%) | [-267.2, -242.1] MB | | `transformers` | 10 | -4.868s (-3.05%) | [-13.248, +3.296]s | -0.049s (-1.02%) | [-0.247, +0.140]s | -117.9 MB (-7.07%) | [-132.7, -102.9] MB | | `tensorflow` | 15 | -3.877s (-5.85%) | [-6.256, -1.321]s | -0.073s (-3.58%) | [-0.179, +0.042]s | -51.2 MB (-7.06%) | [-61.1, -41.7] MB | | `pandas-stubs` | 15 | -1.653s (-4.03%) | [-2.091, -1.207]s | -0.029s (-1.35%) | [-0.127, +0.079]s | -24.8 MB (-3.72%) | [-27.3, -22.4] MB | | `pytorch` | 15 | -3.239s (-6.48%) | [-3.647, -2.823]s | -0.023s (-1.55%) | [-0.081, +0.050]s | -41.1 MB (-3.85%) | [-49.9, -32.6] MB | | `airflow` | 15 | -3.277s (-4.72%) | [-4.174, -2.482]s | -0.004s (-0.19%) | [-0.076, +0.082]s | -91.9 MB (-9.90%) | [-96.4, -87.5] MB | | `prefect` | 15 | +0.087s (+0.14%) | [-1.715, +1.932]s | +0.027s (+1.21%) | [-0.056, +0.104]s | -80.0 MB (-6.18%) | [-83.1, -76.8] MB | | `open-webui` | 15 | -1.891s (-11.25%) | [-2.633, -1.302]s | -0.099s (-3.65%) | [-0.240, +0.024]s | -62.1 MB (-4.76%) | [-68.8, -55.5] MB | | `numpy` | 40 | -1.469s (-19.11%) | [-1.581, -1.358]s | -0.030s (-4.04%) | [-0.073, +0.014]s | -18.8 MB (-5.04%) | [-21.3, -16.3] MB | | `ray` | 40 | -1.755s (-27.77%) | [-1.796, -1.713]s | -0.079s (-13.21%) | [-0.111, -0.050]s | -27.3 MB (-7.92%) | [-29.8, -24.7] MB | | `scipy` | 40 | -1.827s (-28.84%) | [-1.862, -1.791]s | -0.056s (-8.15%) | [-0.078, -0.034]s | -30.6 MB (-8.68%) | [-32.8, -28.3] MB | | `sqlalchemy` | 40 | -1.647s (-18.88%) | [-1.720, -1.576]s | -0.078s (-11.83%) | [-0.096, -0.059]s | -21.4 MB (-5.51%) | [-24.4, -18.4] MB | | `sympy` | 40 | -2.111s (-27.62%) | [-2.160, -2.054]s | -0.068s (-12.05%) | [-0.105, -0.034]s | -30.9 MB (-7.18%) | [-34.6, -27.4] MB | | `small-suite` | 40 | -8.917s (-24.12%) | [-9.123, -8.722]s | -0.291s (-8.87%) | [-0.397, -0.199]s | -30.8 MB (-7.16%) | [-34.4, -27.1] MB | Reviewed By: kinto0 Differential Revision: D108495967 fbshipit-source-id: 83126b252defbc766fb5c829fc76dfcd2843a420github.com-facebook-pyrefly · 86f0da71 · 2026-06-16
- 1.0ETVWalk project files with the `ignore` crate Summary: Before this diff, we used `glob::glob` to walk the file system, using `read_dir` to manually recurse in a single thread. This diff replaces this traversal with the `ignore` crate, significantly improving performance. In addition to parallelism, the `ignore` also makes better use of filesystem APIs. Before, we issued a separate `stat` call per file via the `is_dir` check. The `ignore` crate uses the `d_type` field of the dirent struct, when available, avoiding the extra stat call. Lastly, this traversal avoids walking directories by checking the excludes filters during traversal. This helps a lot in practice, especially in the common case where a large `.venv` directory is in the project root. For workspace indexing, which has a file limit, we use a single-threaded, sorted walk to preserve deterministic results. Using a single thread is fine, since we stop the traversal after only 2000 results anyway. This diff changes error reporting in some cases, and could lead to errors for misconfigured projects which were silent before. For example, broken symlinks and symlink loops are now reported as failures, unless the symlink is excluded. Benchmark results show that parallel directory traversal is significantly more performant than `eden glob` for EdenFS file systems (common in Meta, uncommon in OSS). Benchmark Results: Paired AB/BA measurements from optimized binaries. Baseline is the trunk parent of `D108434328`; experiment is this diff, including `D108434328`. CPU is user+system time; deltas are experiment minus baseline. Confidence intervals are 95% bootstrap CIs over paired deltas. Positive deltas are regressions. Max concurrency of 64 threads. | workload | pairs | CPU delta | CPU 95% CI | wall delta | wall 95% CI | | `homeassistant-core` | 10 | +2.112s (+1.38%) | [+0.971, +3.118]s | -2.122s (-35.66%) | [-2.249, -1.954]s | | `transformers` | 10 | +5.437s (+3.51%) | [-0.296, +10.752]s | -0.042s (-0.87%) | [-0.149, +0.056]s | | `tensorflow` | 15 | +0.336s (+0.52%) | [-1.501, +2.093]s | -0.201s (-8.79%) | [-0.321, -0.075]s | | `pandas-stubs` | 15 | -0.183s (-0.44%) | [-0.731, +0.319]s | -0.093s (-4.33%) | [-0.225, +0.005]s | | `pytorch` | 15 | -1.495s (-2.93%) | [-2.012, -0.957]s | -0.195s (-11.45%) | [-0.232, -0.159]s | | `airflow` | 15 | +0.131s (+0.19%) | [-1.543, +1.800]s | -0.190s (-8.15%) | [-0.307, -0.087]s | | `prefect` | 15 | -4.295s (-6.82%) | [-5.857, -2.675]s | -3.797s (-64.36%) | [-3.983, -3.646]s | | `open-webui` | 15 | -0.117s (-0.70%) | [-0.375, +0.147]s | +0.005s (+0.20%) | [-0.050, +0.064]s | | `numpy` | 40 | -0.085s (-1.12%) | [-0.205, +0.035]s | -0.051s (-7.23%) | [-0.085, -0.022]s | | `ray` | 40 | -0.014s (-0.22%) | [-0.057, +0.030]s | -0.061s (-8.54%) | [-0.095, -0.028]s | | `scipy` | 40 | -0.194s (-2.96%) | [-0.235, -0.150]s | -0.036s (-4.34%) | [-0.071, +0.003]s | | `sqlalchemy` | 40 | -0.080s (-0.89%) | [-0.137, -0.022]s | -0.041s (-5.82%) | [-0.065, -0.019]s | | `sympy` | 40 | -0.097s (-1.27%) | [-0.142, -0.052]s | -0.079s (-12.58%) | [-0.120, -0.043]s | | `small-suite` | 40 | -0.522s (-1.41%) | [-0.702, -0.352]s | -0.262s (-7.64%) | [-0.380, -0.145]s | Reviewed By: connernilsen Differential Revision: D108438904 fbshipit-source-id: 3eb3c4abff5d470526ad468c6c2be30998cb5d4egithub.com-facebook-pyrefly · 33fba019 · 2026-06-13
- 0.9ETVStore calculation results in tagged box pointers Summary: The broader goal of this stack is to eliminate the `Arc` stored for every calculation result, reducing allocation, atomic refcount, and memory overhead. Earlier diffs made published and provisional answers borrowable and removed downstream dependencies on Arc ownership. This diff replaces permanent per-answer `Arc` storage with `Box` allocations. Each result slot is a single atomic pointer whose low bits independently record whether publication is pending and whether the pointer is a non-owning alias. Untagged pointers own their allocation, while alias slots point at an owning slot in the same result table. Because the table retains and drops all of its slots together, aliases can share an answer without refcount operations or double-freeing the allocation. An aligned wrapper guarantees the two tag bits for every answer type. The pointer directly addresses the answer, avoiding the arena lookup and metadata required by compact integer slots. SCC generations already own boxed answers, so final publication transfers those boxes into their result slots without copying the answer. Reviewed By: grievejia Differential Revision: D117087366 fbshipit-source-id: f857a696951a296cfd1ccd7bf8d202f991611399github.com-facebook-pyrefly · 9284873b · 2026-08-27
- 0.7ETVSkip receiver parameters in variance inference Summary: Receiver annotations on methods were counted as ordinary contravariant parameters when inferring class variance, which made classes like `Container[T]` invariant even though method lookup either binds the receiver dynamically or requantifies it for class access. This teaches variance inference to use Pyrefly's existing class-field method/property classification and skip only receiver-bound first parameters, preserving normal callable fields and staticmethods. Reviewed By: rchen152 Differential Revision: D108473085 fbshipit-source-id: b75b61eca968d62f06fcc35efe175b8374cdc221github.com-facebook-pyrefly · c4e212d3 · 2026-06-15
- 0.7ETVRetain provisional answer generations in solver scopes Summary: This stack eliminates per-answer `Arc` storage to reduce allocation and atomic refcount overhead. SCC provisional answers are one remaining source of per-answer ownership: borrowing them requires their generation storage to remain stable even when SCC stack mutations release the original owner. This diff introduces `AnswerScope`, an append-only owner that retains each borrowed generation at most once. Each top-level binding and SCC iteration gets a scope, and temporary cross-module solver views share it. Provisional answer references are tied to the scope lifetime, so they remain valid independently of SCC stack mutations without unsafe code or calculation-wide answer retention. The values remain `Arc`-backed for now; this establishes the ownership boundary needed to replace them with boxes later. Reviewed By: stroxler Differential Revision: D115789811 fbshipit-source-id: b15e1263cc1dfc5fa0fb397ba0743431821b3a58github.com-facebook-pyrefly · 5e1672f8 · 2026-08-26
- 0.7ETVEliminate project tree scans from venv discovery Summary: Pyrefly discovered project virtual environments by enumerating Python-looking executables below the project root and then checking whether they belonged to a virtual environment. Even with directory pruning, this performed unnecessary synchronous filesystem traversal before type checking began. Find `pyvenv.cfg` at bounded conventional locations in each project ancestor, then derive the interpreter from standard platform paths. A real config root or the inferred import root now consistently anchors virtualenv and `typings/` discovery across CLI and LSP workflows. Preserve `.venv`, `venv`, `env`, symlinked environments, and nearest-ancestor lookup while rejecting arbitrary nested environment names. This removes the generic walker and its `walkdir` dependency. Conda now probes standard interpreter locations from the environment prefix. Besides removing the walker, this fixes active `CONDA_PREFIX` discovery on macOS and Linux and named `--conda-environment` discovery on Windows. Reviewed By: grievejia Differential Revision: D115531084 fbshipit-source-id: 6c0a1216c374bf7a43179c176a2eeaa7018eacddgithub.com-facebook-pyrefly · ef9e9a0e · 2026-08-18
- 0.6ETVShare exported result storage with solutions Summary: This stack eliminates per-answer `Arc` storage to reduce allocation and atomic refcount overhead and improve memory use. The first phase addresses one reason every answer needed an Arc: transitioning from Answers to Solutions previously copied exported results one by one by cloning each result Arc. With pointer-sized answer slots available, this diff constructs exported `SolutionsData` during the Answers phase and routes exported keys directly into it. The transition to Solutions now clones one `Arc<SolutionsData>` instead of every exported answer individually. Results remain Arc-backed for now, but this removes the phase-transition dependency on per-answer Arc ownership. Reviewed By: grievejia Differential Revision: D115246289 fbshipit-source-id: 5e4f03304b2164b9d819e639a9a5e44a1440bad3github.com-facebook-pyrefly · 0b0f577e · 2026-08-19