Daily edition

Oct 30, 2026

The edition exactly as it was published. Nothing here is re-selected on a later reading.

Oct 31, 20265 reads · 137 merged PRs screened

core implementation

holoviz/panel · #8937

Files changed →View PR ↗

fix: Send updates from long running sync callbacks before they returnPython · 51 + / 2 −

Introduces 3 new declarations in panel/io/document.py.

Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.

panel/io/document.py ↗ · 2 files

@@ -651,6 +653,46 @@ def _suppress_property_callbacks(             event.callback_invoker = None     return events +async def _write_message(+    doc: Document, connections: list[ServerConnection], message: Message+) -> None:+    for conn in connections:+        lock = getattr(conn._socket, 'write_lock', None)+        with (await lock.acquire()) if lock is not None else nullcontext():+            await _await_writes(_socket_dispatcher(conn._socket)(conn, msg=message))++def _write_from_worker_thread(+    doc: Document,+    connections: Iterable[ServerConnection],+    events: list[DocumentChangedEvent]+) -> bool:+    """+    Writes events generated by a locked callback that bokeh runs on a+    worker thread right away, rather than leaving them to bokeh, which+    only writes them once the callback returns, so that a long running+    callback can still report progress.++    Only safe while bokeh has no pending writes of its own: the message+    is serialized here, while the callback holds the Document lock, and+    the write is scheduled on the event loop ahead of bokeh's, so the+    client always receives models before they are referenced.+    """+    patches = [e for e in events if isinstance(e, DocumentPatchedEvent)]+    if state._on_loop_thread or not patches or len(patches) != len(events):+        return False+    loop = state._document_loop(doc)+    asyncio_loop = t.cast(+        'asyncio.AbstractEventLoop | None', getattr(loop, 'asyncio_loop', loop)

systems design

kubernetes/kubernetes · #141600

Files changed →View PR ↗

Refactor flags and options in `kubectl api-resources` cmdGo · 76 + / 42 −

Introduces 4 new declarations in staging/src/k8s.io/kubectl/pkg/cmd/apiresources/apiresources.go.

Adds new systems design rather than adjusting what was there. Tests changed with it, with code of their own.

staging/src/k8s.io/kubectl/pkg/cmd/apiresources/apiresources.go ↗ · 3 files

@@ -126,33 +148,44 @@ func (o *APIResourceOptions) Validate() error { 	return nil } -// Complete adapts from the command line args and validates them-func (o *APIResourceOptions) Complete(restClientGetter genericclioptions.RESTClientGetter, cmd *cobra.Command, args []string) error {+// ToOptions converts from CLI inputs to runtime inputs+func (flags *APIResourceFlags) ToOptions(cmd *cobra.Command, args []string) (*APIResourceOptions, error) { 	if len(args) != 0 {-		return cmdutil.UsageErrorf(cmd, "unexpected arguments: %v", args)+		return nil, fmt.Errorf("unexpected arguments: %v", args) 	} -	discoveryClient, err := restClientGetter.ToDiscoveryClient()+	discoveryClient, err := flags.RESTClientGetter.ToDiscoveryClient() 	if err != nil {-		return err+		return nil, err 	}-	o.discoveryClient = discoveryClient -	o.groupChanged = cmd.Flags().Changed("api-group")-	o.nsChanged = cmd.Flags().Changed("namespaced")+	o := &APIResourceOptions{+		SortBy:     flags.SortBy,+		APIGroup:   flags.APIGroup,+		Namespaced: flags.Namespaced,+		Verbs:      flags.Verbs,+		Cached:     flags.Cached,+		Categories: flags.Categories,++		groupChanged: cmd.Flags().Changed("api-group"),+		nsChanged:    cmd.Flags().Changed("namespaced"), 

framework internals

huggingface/transformers · #49527

Files changed →View PR ↗

🚨 build and expand once the tp/ep_plan/fsdp_planPython · 239 + / 188 −

Introduces 14 new declarations in src/transformers/distributed/mixin.py.

Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.

src/transformers/distributed/mixin.py ↗ · 16 files

@@ -195,6 +187,101 @@ def prepare_distribute_model(          return distributed_config, device_map, mesh_manager +    def _validate_parallel_plan(+        self, plan: dict[str, str], supported_styles, plan_name: str, names: set[str] | None = None+    ) -> None:+        """Raise on a style that `supported_styles` does not know, warn on a rule that names nothing in the model."""+        unsupported_styles = {style for style in plan.values() if style not in supported_styles}+        if unsupported_styles:+            raise ValueError(+                f"Unsupported `{plan_name}` styles: {unsupported_styles}. Supported styles are {list(supported_styles)}"+            )++        if names is None:+            names = {+                replace_layer_number_by_wildcard(n) for n, _ in chain(self.named_modules(), self.named_parameters())+            }+        if unused := plan.keys() - names:+            if _get_torch_distributed_rank() == 0:+                logger.warning(+                    f"`{plan_name}` rules {sorted(unused)} match nothing in {type(self).__name__} and will not be applied."+                )++    def _expand_parallel_plan(self, plan: dict[str, str]) -> dict[str, str]:+        """Replace the `*` of the plan's rules with the layer numbers of the model, one entry per module or parameter."""+        expanded_plan = {}++        for module_name, module in self.named_modules():+            module_style = _get_parameter_plan(parameter_name=module_name, plan=plan, is_weight=False)++            if module_style in ALL_FSDP_STYLES:+                # FSDP: list the module to wrap.+                expanded_plan[module_name] = module_style

framework internals

vercel/next.js · #100871

Files changed →View PR ↗

turbopack: drop ASTs of tree-shaken modulesRust · 141 + / 6 −

Introduces 9 new declarations in turbopack/crates/turbopack-core/src/module_graph/binding_usage_info.rs.

Adds new framework internals rather than adjusting what was there. Tests changed with it, with code of their own.

turbopack/crates/turbopack-core/src/module_graph/binding_usage_info.rs ↗ · 15 files

@@ -374,6 +381,23 @@ pub async fn compute_binding_usage_info(         span.record("visit_count", visit_count);         span.record("unused_reference_count", unused_references.len()); +        if drop_unused_module_data {+            // The traversal visits every module that is reachable via used references (and sets+            // its usage), so the remaining ones are unused.+            graph_ref+                .iter_nodes()+                .filter(|module| !used_exports.contains_key(module))+                .map(async |module| {+                    module+                        .into_trait_ref()+                        .await?+                        .drop_code_gen_data_hint()+                        .await+                })+                .try_join()+                .await?;+        }+         #[cfg(debug_assertions)]         {             use std::sync::LazyLock;

core implementation

pandas-dev/pandas · #70499

Files changed →View PR ↗

BUG: Index.copy treating name as a list of names (GH#19171)Python · 55 + / 41 −

Introduces 2 new declarations in pandas/core/indexes/base.py.

Adds new core implementation rather than adjusting what was there. Tests changed with it, with code of their own.

pandas/core/indexes/base.py ↗ · 6 files

@@ -1880,42 +1903,6 @@ def name(self, value: Hashable) -> None:         maybe_extract_name(value, None, type(self))         self._name = value -    @final-    def _validate_names(-        self,-        name: Hashable = None,-        names: Sequence[Hashable] | None = None,-        deep: bool = False,-    ) -> list[Hashable]:-        """-        Handles the quirks of having a singular 'name' parameter for general-        Index and plural 'names' parameter for MultiIndex.-        """-        from copy import deepcopy--        if names is not None and name is not None:-            raise TypeError("Can only provide one of `names` and `name`")-        if names is None and name is None:-            new_names = deepcopy(self.names) if deep else self.names-        elif names is not None:-            if not is_list_like(names):-                raise TypeError("Must pass list-like as `names`.")-            new_names = names-        elif not is_list_like(name):-            new_names = [name]-        else:-            new_names = name--        if len(new_names) != len(self.names):  # pyright: ignore[reportArgumentType]-            raise ValueError(-                f"Length of new names must be {len(self.names)}, got {len(new_names)}"  # pyright: ignore[reportArgumentType]-            )

Read today’s edition →