Nine patches into LightGBM

Austin Wagner

Nine pull requests reviewed by LightGBM's maintainers and merged, including a C++ networking bug in the distributed-training path.

Project
LightGBM, the gradient-boosting framework, then at microsoft/LightGBM, now its own organisation.
Merged
9, between January and March 2026.
Attempted
12 authored: 9 merged, 2 open, 1 closed without merging.
Languages
C++ and Python: networking, test coverage, and the typed scikit-learn predict path.

What the patches did

PRChange
7137C++ networking: socket timeout was broken on POSIX because setsockopt was given the wrong type
7131Fixed a test that was not exercising all of its parameter combinations
7133Test coverage for Booster.rollback_one_iter()
7130Fixed a numpy integer cast in plot_importance
7115Python type annotations through 7118: TypeGuard, return types on the scikit-learn predict methods, DTypeLike and Literal
7119Positional arguments for np.arange in the predictor

The socket fix is the one worth reading. It was a real defect in distributed training rather than a documentation change, and it was wrong in a way that only shows up on POSIX: the old call handed setsockopt an int where POSIX wants a struct timeval, so it failed with EINVAL and the timeout was never set. The merged change, 11 lines added and 2 removed in the wrapper:

-  inline void SetTimeout(int timeout) {
-    setsockopt(sockfd_, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char*>(&timeout), sizeof(timeout));
+  inline void SetTimeout(int timeout_ms) {
+#if defined(_WIN32)
+    DWORD timeout = static_cast<DWORD>(timeout_ms);
+    setsockopt(sockfd_, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<const char*>(&timeout), sizeof(timeout));
+#else
+    struct timeval tv;
+    tv.tv_sec = timeout_ms / 1000;
+    tv.tv_usec = (timeout_ms % 1000) * 1000;
+    setsockopt(sockfd_, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
+#endif
   }

PR 7137, src/network/socket_wrapper.hpp, the diff as merged in 80ab6d3.

Nine of twelve, and where the three went

Twelve were authored. Nine merged, two are open, and one was closed without merging.

All three of the unmerged are C++ in the distributed-training path, the hardest part of that codebase, and the part where a maintainer will not merge something they are unsure of. 7139 was closed; 7178 is the same fix reopened in a different shape; 7138 is open in the same area.

Nine merged with the denominator left off would read better and say less. Nine of twelve, with the failures concentrated in the hardest area, is the more useful number.

Why a merged patch is different evidence

Getting a change into a library at this level of use means passing review by maintainers with no reason to be generous. It is also checkable in ten seconds by someone with no time to read a portfolio, which is rarer than it sounds.

The companion evidence is the opposite shape: a gradient-boosting implementation written from scratch, benchmarked against LightGBM inside one harness. One shows the algorithm is understood; the other shows a large unfamiliar codebase can be worked in under review.

Record

Every figure above is bound to a named section of the wiki page lightgbm-contributions and checked mechanically before this page can deploy. That page carries the GitHub API query behind each count and the date it was last re-run, 2026-09-14, when every count was unchanged.

Known limits. The project moved organisations. The old API path answers a permanent redirect with no body, so a script following it reads a missing key and reports zero merged rather than failing; query the current organisation. Until 2026-09-14 the table folded 7119 into the annotations row; its title is a positional-argument fix, so it has its own.

Sources

  • Every pull request, on GitHub: the author query lists the twelve; the merged filter lists the nine. Ten seconds, no portfolio required.
  • The socket fix: #7137, merged 2026-01-23; the unmerged three: #7139 (closed), #7178 and #7138 (open).
  • The API call that reproduces the counts: gh api --paginate 'search/issues?q=is:pr+author:wagner-austin+repo:lightgbm-org/LightGBM', twelve items, merged_at non-null on nine.
  • This article's manifest: provenance.json.