Shai Szulanski
90d · built 2026-09-08
Performance
What Shai Szulanski shipped in the selected window, measured in ETV, and how it compares with the 90 days before it.
Effective capacity
+2.1engineers
delivers like 3.1 (3.1x pre-AI)
Output (ETV)
20.2ETV
+62.4% vs 12.5 prior
Features share
41.6%
+5.6 pp vs prior window
Fixes share
18.0%
−10.2 pp vs prior window
Work mix
41.6% Features15.5% Maintenance24.5% Tests0.3% Docs18% Fixes
112 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 59 %
- By Features share
- Top 32 %
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.
- 4.0ETVAdd shared-parser Thrift formatter binary Summary: Add the `thrift-fmt` binary and formatter library using the shared recursive-descent parser core for grammar validation and token collection from the first formatter diff. Formatter-specific trivia handling and layout remain in the formatter implementation; the semantic AST is not used as a formatting transport. Port the existing formatter snapshot coverage into C++ and add fixture round-trip/idempotence coverage plus the fbcode compatibility target. This implementation exactly preserves the behavior of the existing formatter, including all of its deficiencies, to facilitate deployment. The goal is to fix these issues individually and end up with a better formatter, using the flexibility of controlling the whole stack to make the behavior fully configurable while also eliminating divergence caused by parser duplication as the language evolves. Reviewed By: hchokshi, sadroeck Differential Revision: D108951643 fbshipit-source-id: d00e3ec3d0976ece612e7186c842257aa4ab0a2fgithub.com-facebook-fbthrift · 3751dd95 · 2026-06-29
- 0.8ETVEmit object-key containers from compiler Summary: Lift the Hack generator restriction on non-arraykey map keys and set elements by emitting `\ThriftMap<K, V>` and `\ThriftSet<E>` for struct/union keys, bool/float keys, and adapted keys or set elements. The generated type specs mark these fields with `'format' => 'object_key'`, shape methods convert through `toShape()` / `fromShape()` and `toVec()` / `fromVec()`, and JSON/from-map paths continue to skip object-key fields that cannot be represented there. `edward-io.Wrapper`-affected object-key map keys and set elements are still rejected because they participate in serialized-key identity, while wrapped object-key map values are supported by wrapping/unwrapping values during generated shape and thrift-only conversions. Regenerated compiler fixtures include the dedicated `hack-object-key-containers` fixture for struct keys/elements, primitive object keys, recursive union keys, adapted typedef keys/elements, adapted map values, and wrapped map values. Reviewed By: a-lafrance Differential Revision: D108350999 fbshipit-source-id: 53b5242745f9eea9dabdc0062d150d0583a0e94agithub.com-facebook-fbthrift · a61cd84d · 2026-06-18
- 0.8ETVAdd thrift key serializer Summary: Add `ThriftKeySerializer`, the canonical identity layer for object-key containers. It serializes thrift-form values to compact-protocol bytes so equal thrift values produce the same key regardless of object identity, while preserving list order, sorting unordered set/map contents recursively by serialized bytes, and writing structs/unions in field-id order. Adapters and wrappers are unwrapped through `ThriftSerializationHelper::unwrapApplyAdapter` so adapted Hack values compare by their thrift representation. Reviewed By: sadroeck, prakashgayasen, a-lafrance Differential Revision: D108350995 fbshipit-source-id: dc6ad842aa7a49f54a7b180adb3dbf982817694bgithub.com-facebook-fbthrift · aedd1a3a · 2026-06-18
- 0.7ETVCompare Thrift structs in one traversal Summary: Optimize `op::compare` for generated Thrift ordering by making compare the primitive operation for structured values. `CompareThreeWay` walks struct, exception, union, list, set, and map values directly, and `LessThan` delegates to whether that result is `std::partial_ordering::less`, so struct comparison no longer synthesizes ordering by first evaluating equality and then less-than over the same fields. The adapter path keeps the existing `compareThreeWay` customization point as the top precedence hook and only falls back to `equal`/`less` synthesis when no compare hook is available. The default comparison implementation now uses `<=>` when available, otherwise it falls back to `std::equal_to` and `std::less`. Add `TestsetListListString` and `TestsetMapStringSetI64` cases to `thrift/test/benchmarks:compare` to measure public `op::compare` against the old equal-then-less baseline over generated `testset` structs with large nested containers and late differences. Final benchmark run at the rebased stack tip: | Benchmark | Equal-then-less baseline | `op::compare` | Relative | |---|---:|---:|---:| | `TestsetListListString` | `426.69us` | `233.66us` | `182.61%` | | `TestsetMapStringSetI64` | `1.06ms` | `637.02us` | `166.33%` | Reviewed By: hchokshi Differential Revision: D108952049 fbshipit-source-id: b4c3519ca8c388917abba17298f17b3591aa9b12github.com-facebook-fbthrift · eb1821fd · 2026-06-25
- 0.7ETVStore path selectors as `DynamicValue` Summary: Store set elements and map selectors directly as `DynamicValue` and retain `TypeRef` for Any traversal. Traversal consumes selectors in place in `DynamicValue.cpp`, and schema validation advances type context without inventing typed keys for ordinal-only diagnostics. Reviewed By: praihan Differential Revision: D117553807 fbshipit-source-id: 0e422ba7cb29a71f151e38faea7b441fe6a3a1f7github.com-facebook-fbthrift · af4b18bb · 2026-09-04
- 0.6ETVDefine concepts for adapters Summary: Define `ThriftConstAdapter`, `ThriftTypeAdapter`, `ThriftFieldAdapter`, and `ThriftAdapter` concepts together with concepts for the runtime customization points: construct, clear, isEmpty, comparison, hash, in-place conversion, serialized size, encode, and decode. Migrate runtime detection and dispatch from SFINAE/`folly::overload` probes to constraints and `if constexpr`. The new predicates match the calls they guard: `less` and `serializedSize` are const-correct, serialized-size detection uses the real `ZeroCopy` value, field-adapter detection uses the real `FieldId`, and adapted hashing checks invocability. This also removes an accidental default-constructibility requirement on adapters. The adapter inventory covered structured and legacy `cpp.adapter` annotations, including field-only and constant-only adapters, move-only adapted values, by-value and mutable in-place `toThrift`, inline/incomplete wrappers, custom protocol hooks, templated adapters, indirection, comparison/hash hooks, and legacy Carbon adapters. Reviewed By: vitaut Differential Revision: D116515187 fbshipit-source-id: d9cafb64c7a54f2b9d9f8da6834d3c6ee611c4d4github.com-facebook-fbthrift · 68771985 · 2026-08-24
- 0.6ETVExtract reusable Thrift parser core Summary: Move the recursive-descent parser implementation behind a templated internal `parser_core`, keep the compiler-facing `parse(lexer&, parser_actions&, diagnostics_engine&)` API as an adapter over `parser_actions`, and leave regular parser behavior unchanged while making the grammar reusable by concrete consumers. Reviewed By: hchokshi Differential Revision: D109361636 fbshipit-source-id: 22cf6ae6707f3af09eb282fe027d02f98ae4bf72github.com-facebook-fbthrift · 326fc39d · 2026-06-29
- 0.5ETVDeprecate const-qualified field_ref accessors Summary: Document shallow-const semantics for Thrift field-ref wrappers and steer callers to pass and capture these view objects by value without const qualifiers. Add non-const `value()`, `operator*()`, and `operator->()` overloads where needed so normal by-value use remains clean, deprecate the const-object overloads, and fix boxed/intern/union `as_const()` to preserve storage-handle constness while exposing const field values. Reviewed By: Mizuchi Differential Revision: D108449523 fbshipit-source-id: d53a81595a2f19ffcb79a5ab45d6ab4b7142008dgithub.com-facebook-fbthrift · 6d52d6d3 · 2026-06-16
- 0.4ETVConvert between concrete and dynamic values Summary: Add standalone conversions between concrete Thrift-compatible C++ values and schema-typed `DynamicValue` values. Traverse concrete values directly using Thrift type tags and runtime schema metadata, without serialization or an intermediate representation. Compile-time scalar tags must match the runtime kind (opaque aliases are matched through their underlying kind), and already-dynamic inputs must already have the requested type identity. Preserve runtime enum and opaque-alias types and reserve container storage. Reviewed By: ahilger Differential Revision: D117598089 fbshipit-source-id: 532e19040b81a6e5aa7b3fe46a78c335489f37a5github.com-facebook-fbthrift · 4088e462 · 2026-09-02
- 0.4ETVAvoid over-wrapping inline formatter output Summary: Keep formatter decisions source-shape aware when doing so does not hide trivia. This preserves source-inline `throws` clauses and structured annotation bodies, keeps source-block-formatted values and generic types block-formatted, and preserves explicit `optional`/`required` tokens even when semantic parsing normalizes them away. The formatter still falls back to multiline output whenever comments would be hidden. Reviewed By: vitaut Differential Revision: D110337471 fbshipit-source-id: 18087446ef669e4f73b162126d262e18c015df59github.com-facebook-fbthrift · 57d9846b · 2026-07-01