<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nikoloz Turazashvili (@axrisi)</title>
    <description>The latest articles on DEV Community by Nikoloz Turazashvili (@axrisi) (@axrisi).</description>
    <link>https://dev.to/axrisi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3226798%2F0c0a8594-658c-4146-a639-8068ede85f67.jpg</url>
      <title>DEV Community: Nikoloz Turazashvili (@axrisi)</title>
      <link>https://dev.to/axrisi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/axrisi"/>
    <language>en</language>
    <item>
      <title>Google Cloud outage in London: what one zone's power event broke</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Tue, 20 Oct 2026 15:30:00 +0000</pubDate>
      <link>https://dev.to/axrisi/google-cloud-outage-in-london-what-one-zones-power-event-broke-4map</link>
      <guid>https://dev.to/axrisi/google-cloud-outage-in-london-what-one-zones-power-event-broke-4map</guid>
      <description>&lt;p&gt;On Tuesday morning a Google Cloud outage hit London. A power event took out one zone of the europe-west2 region, &lt;code&gt;europe-west2-b&lt;/code&gt;, and for a few hours UK banking apps, a delivery firm and the courts' remote-hearing video links reported problems. If you run anything on a public cloud, this one is worth ten minutes: zones exist precisely so that one building's bad morning stays one building's problem, and on Tuesday that only partly worked.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/UhEKYvv7Wbc" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Google's &lt;a href="https://status.cloud.google.com/incidents/Xs2XTHzAVC9YnafnPyzj" rel="noopener noreferrer"&gt;status page&lt;/a&gt; puts the start at 23:08 PDT on October 19, which is 07:08 in London. For hours the only description was "elevated errors and intermittent network failures", and the workaround field said "None for now".&lt;/li&gt;
&lt;li&gt;At 12:12 London time Google named the cause: "Due to a power event we had suffered an outage within europe-west2-b zone." Services in that zone were unavailable, and "some services in europe-west2 region may experience elevated errors". Thirty-eight products are listed on the incident.&lt;/li&gt;
&lt;li&gt;By 13:10 London time Google said most workloads were recovering, and at 15:03 it called the issue mitigated for most customers and promised a full analysis. It recovered existing workloads first and warned that customers might not yet be able to create new ones.&lt;/li&gt;
&lt;li&gt;Revolut &lt;a href="https://www.bbc.co.uk/news/articles/cxdd8mm6qy4mo" rel="noopener noreferrer"&gt;told the BBC&lt;/a&gt; its disruption came from a third-party issue. HSBC apologised and said the situation was "also affecting other organisations". The BBC notes most firms had not officially tied their problems to Google.&lt;/li&gt;
&lt;li&gt;The same region failed in July 2022 after a cooling failure, and Google's own &lt;a href="https://status.cloud.google.com/incidents/fmEL9i2fArADKawkZAa2" rel="noopener noreferrer"&gt;incident report&lt;/a&gt; admitted that regional services, which are designed to survive the loss of one zone, were hit anyway.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What happened in the Google Cloud outage, hour by hour
&lt;/h2&gt;

&lt;p&gt;Google writes its incident updates in Pacific time, which is a slightly cruel choice for a London outage, so here is the log converted. All quotes are from incident &lt;code&gt;Xs2XTHzAVC9YnafnPyzj&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;London time (BST)&lt;/th&gt;
&lt;th&gt;What Google said&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;07:08&lt;/td&gt;
&lt;td&gt;Start time given in the incident: "beginning on Monday, 2026-10-19 23:08 PDT"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;09:35&lt;/td&gt;
&lt;td&gt;First post. "Multiple Google Cloud services are experiencing elevated errors and intermittent network failures in europe-west2 region." Workaround: "None for now"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10:24&lt;/td&gt;
&lt;td&gt;Workaround changes to: migrate the workload "to another available location (zone or region)", if feasible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12:12&lt;/td&gt;
&lt;td&gt;Cause: "a power event", outage "within europe-west2-b zone". "The power event is mitigated."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12:58&lt;/td&gt;
&lt;td&gt;Recovery of services, "prioritizing the recovery of existing workloads. Customers may not be able to yet create new workloads."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13:44&lt;/td&gt;
&lt;td&gt;"Recovery of services for most workloads in europe-west2 as of … 05:10 PDT" (13:10 London)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15:03&lt;/td&gt;
&lt;td&gt;"Mitigated for most of the customers", "a very small number of customers" still affected; "No further updates will be provided here. We will publish an analysis of this incident…"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two details stand out. The first public post went up almost two and a half hours after the start time Google gave. And the best advice on offer was to move your workload somewhere else, which only works if you built for it before the morning started.&lt;/p&gt;

&lt;p&gt;At 15:03 London time Google called it mitigated for most customers, closed the public update stream, and promised an analysis once its internal investigation is complete. There is still no root cause beyond "power event". I am not going to guess what failed in the building; when the analysis lands, that is the document to read.&lt;/p&gt;

&lt;h2&gt;
  
  
  How availability zones are supposed to contain a power event
&lt;/h2&gt;

&lt;p&gt;A Google Cloud region is a geographic area, here London, split into zones. Google's &lt;a href="https://cloud.google.com/compute/docs/regions-zones" rel="noopener noreferrer"&gt;regions and zones documentation&lt;/a&gt; puts the idea plainly: "Putting resources in different zones in a region reduces the risk of an infrastructure outage affecting all resources simultaneously. Putting resources in different regions provides an even higher degree of failure independence." europe-west2 has three zones, a, b and c.&lt;/p&gt;

&lt;p&gt;Some resources are zonal. A Compute Engine VM lives in exactly one zone, and so does a zonal persistent disk. If your VM and its disk sit in &lt;code&gt;europe-west2-b&lt;/code&gt;, Tuesday's power event was your outage, and no amount of Google's regional engineering changes that. Other services are regional: Google runs them across zones so that the loss of one zone costs capacity, and customers do not see an outage.&lt;/p&gt;

&lt;p&gt;That gives you three layers to think about:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your setup&lt;/th&gt;
&lt;th&gt;What a single-zone power event does to you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Everything in one zone&lt;/td&gt;
&lt;td&gt;Full outage until that zone recovers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spread across two or three zones in one region&lt;/td&gt;
&lt;td&gt;Lost capacity in one zone; the service stays up if the remaining zones can carry the load&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A second region, or a second cloud&lt;/td&gt;
&lt;td&gt;Survives even a region-wide failure, at real cost and complexity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The middle row is the one most teams can afford, and it still costs money: you have to pay for spare capacity in the surviving zones, or accept a slower service while they absorb the load. That cost is the usual reason teams skip it.&lt;/p&gt;

&lt;p&gt;A rough way to audit your own Google Cloud project is to list where your instances actually live:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud compute instances list &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"table(name,zone,status)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If one zone dominates that list for a production service, the next zone outage has your name on it. Google's docs also describe regional managed instance groups, which can spread instances across a region's zones; check that before the next incident rather than during it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why did one zone hit the whole region?
&lt;/h2&gt;

&lt;p&gt;This is the part Tuesday's incident has not answered yet. Google's wording is that services in &lt;code&gt;europe-west2-b&lt;/code&gt; were unavailable and "some services in europe-west2 region may experience elevated errors and intermittent network issues". So the other two zones did not fail, and yet some regional services degraded with the dark zone.&lt;/p&gt;

&lt;p&gt;London has been here before. On July 19, 2022, in a heatwave, "a simultaneous failure of multiple, redundant cooling systems in one of the data centers that hosts the zone europe-west2-a impacted multiple Google Cloud services", according to Google's &lt;a href="https://status.cloud.google.com/incidents/fmEL9i2fArADKawkZAa2" rel="noopener noreferrer"&gt;incident report&lt;/a&gt;. The report's "Regional Impact" section is unusually honest. It says regional services were affected "despite regional services being designed to survive the failure of a single zone", and it names two reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"We inadvertently modified traffic routing for internal services to avoid all three zones in the europe-west2 region, rather than just the impacted europe-west2-a zone."&lt;/li&gt;
&lt;li&gt;Regional storage, including Cloud Storage and BigQuery, replicates across zones, but because of that routing change those services "were unable to access any replica for a number of storage objects."&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In other words, in 2022 the zone failed the way zones are allowed to fail, and a response step turned it into a regional problem. Google promised then to take "immediate steps … to improve the region's resilience." I can't tell you whether anything similar happened on Tuesday; Google's analysis is not out yet. What I can say is that the symptom pattern, one dark zone plus regional errors, is the same shape, which is why the report is worth waiting for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who was hit: Revolut, HSBC, Lloyds and the courts
&lt;/h2&gt;

&lt;p&gt;Here is what the companies actually said, mostly to the BBC, which ran both an &lt;a href="https://www.bbc.co.uk/news/articles/cxdd8mm6qy4mo" rel="noopener noreferrer"&gt;explainer article&lt;/a&gt; and a &lt;a href="https://www.bbc.co.uk/news/live/c58jd2kjp93xt" rel="noopener noreferrer"&gt;live page&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Revolut&lt;/strong&gt;: "We are currently experiencing a service disruption affecting multiple services," and its problems came from a third-party issue. It added that "all our customers' money and data are safe." Downdetector logged more than 1,500 user reports for Revolut shortly after 08:00 London time; those are user reports, which only tell you that people noticed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HSBC&lt;/strong&gt;: "We are aware that some customers are experiencing difficulties accessing our services," and the situation "is also affecting other organisations."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lloyds&lt;/strong&gt;: its app was functioning normally, but "we understand some are having issues with certain online services this morning." Halifax and Bank of Scotland, both in Lloyds Banking Group, also had problems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HM Courts and Tribunals Service&lt;/strong&gt; said the video platform for remote hearings was affected, and the Criminal Bar Association said barristers could not proceed with some trials and hearings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DPD&lt;/strong&gt; reported connection issues and later said they were resolved. The budgeting app Emma said it was back up after the Google Cloud outage, and the e-bike service Forest said part of its service had been affected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The careful version: the BBC says most of these firms had not officially tied their problems to Google. Revolut said "third party" without naming it. I'm repeating what each company said, and I'm not claiming any specific bank runs on Google Cloud.&lt;/p&gt;

&lt;p&gt;On &lt;a href="https://news.ycombinator.com/item?id=50163961" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt; one commenter suggested that UK data-residency requirements push companies into a single in-country region. That's a guess from a commenter, and I have seen nothing that confirms it for any of the firms above, but it is the right question to ask your own compliance team: does "data stays in the UK" really require "everything in one region"?&lt;/p&gt;

&lt;h2&gt;
  
  
  What does a real backup look like?
&lt;/h2&gt;

&lt;p&gt;Monzo has &lt;a href="https://monzo.com/blog/tolerating-full-cloud-outages-with-monzo-stand-in" rel="noopener noreferrer"&gt;written up&lt;/a&gt; the far end of the table. Its main platform runs on AWS, and "Monzo Stand-in is an independent set of systems that run on Google Cloud Platform (GCP) and is able to take over from our Primary Platform … in the event of a major incident." Stand-in supports the essentials: card spending, cash withdrawals, bank transfers, balances and freezing cards. It's a smaller system on a different provider, and it exists for exactly the morning a provider has a bad day. That's an editorial pick of a good pattern; I'm making no claim about Monzo's status on Tuesday.&lt;/p&gt;

&lt;p&gt;Most teams don't need a second cloud. The useful checklist after Tuesday is shorter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Know which of your production resources are zonal, and in which zone.&lt;/li&gt;
&lt;li&gt;Run stateless services across at least two zones, behind a regional load balancer.&lt;/li&gt;
&lt;li&gt;Use regional or replicated storage for anything the service needs to start.&lt;/li&gt;
&lt;li&gt;Practise losing a zone. A failover plan you have never run is a hope.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Also today: DHS orders DeepSeek out of federal agencies, and DeepInfer goes open source
&lt;/h2&gt;

&lt;p&gt;The US Department of Homeland Security &lt;a href="https://public-inspection.federalregister.gov/2026-21447.pdf" rel="noopener noreferrer"&gt;ordered&lt;/a&gt; DeepSeek products out of federal civilian agencies, under the Federal Acquisition Supply Chain Security Act of 2018, with publication in the Federal Register scheduled for October 20. The order excludes DeepSeek's products and services from civilian agency procurements and removes "all DeepSeek and DeepSeek-affiliate products, and third-party products and services developed using DeepSeek implementations, from civilian agency information technology." If you sell software to US agencies, that third-party clause is the line to read; I'm not interpreting its scope.&lt;/p&gt;

&lt;p&gt;The same day, DeepSeek's newly open-sourced inference engine, &lt;a href="https://github.com/deepseek-ai/DeepInfer" rel="noopener noreferrer"&gt;DeepInfer&lt;/a&gt;, reached the top of &lt;a href="https://news.ycombinator.com/item?id=50163277" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt;. DeepSeek describes it as "the high-performance inference framework that powers DeepSeek's large-scale production services", released under Apache 2.0. This release supports one model, DeepSeek-V4.1-Flash, on NVIDIA SM100 GPUs or Huawei Ascend 950 NPUs, for offline inference. The README lists what's missing for a complete service: a KV cache system, prefill and decode disaggregation, and load balancing across replicas. The feature I'd look at first is batch-invariant inference, which keeps results identical across different batch compositions when enabled (NVIDIA only).&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: NEEDS REVIEW
&lt;/h2&gt;

&lt;p&gt;I stamped it NEEDS REVIEW. A zone losing power is the failure zones exist for, and Google's zone design did keep the other two zones running. The open questions are why some regional services wobbled with one dark zone, in the same region where a 2022 report already explained how that can happen, and why so many UK services had one zone's worth of resilience on a Tuesday morning. I want the first answer from Google's incident report and the second from the companies themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What caused the Google Cloud outage in London on October 20, 2026?&lt;/strong&gt;&lt;br&gt;
Google says a power event caused an outage in the &lt;code&gt;europe-west2-b&lt;/code&gt; zone. It called the issue mitigated for most customers at 15:03 London time and promised an analysis; no detailed root cause had been published when this was written.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was all of europe-west2 down?&lt;/strong&gt;&lt;br&gt;
Google said services were unavailable in &lt;code&gt;europe-west2-b&lt;/code&gt;, while some services elsewhere in the region saw elevated errors and intermittent network issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was Revolut down because of Google Cloud?&lt;/strong&gt;&lt;br&gt;
Revolut said its disruption came from a third-party issue and that customers' money and data were safe. The BBC reported that most affected firms had not officially confirmed a link to Google.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are availability zones?&lt;/strong&gt;&lt;br&gt;
Zones are separate parts of a cloud region designed to fail independently. Spreading resources across zones reduces the chance that one infrastructure failure takes them all down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://status.cloud.google.com/incidents/Xs2XTHzAVC9YnafnPyzj" rel="noopener noreferrer"&gt;Google Cloud Service Health: incident Xs2XTHzAVC9YnafnPyzj, europe-west2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bbc.co.uk/news/articles/cxdd8mm6qy4mo" rel="noopener noreferrer"&gt;BBC News: Google Cloud says 'power event' behind outage hitting UK banks and websites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bbc.co.uk/news/live/c58jd2kjp93xt" rel="noopener noreferrer"&gt;BBC News live page on the outage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://status.cloud.google.com/incidents/fmEL9i2fArADKawkZAa2" rel="noopener noreferrer"&gt;Google Cloud incident report, europe-west2, July 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/compute/docs/regions-zones" rel="noopener noreferrer"&gt;Google Cloud documentation: regions and zones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://monzo.com/blog/tolerating-full-cloud-outages-with-monzo-stand-in" rel="noopener noreferrer"&gt;Monzo: Tolerating full cloud outages with Monzo Stand-in&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=50163961" rel="noopener noreferrer"&gt;Hacker News discussion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://public-inspection.federalregister.gov/2026-21447.pdf" rel="noopener noreferrer"&gt;DHS notice of order, Federal Register 2026-21447&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/deepseek-ai/DeepInfer" rel="noopener noreferrer"&gt;DeepInfer on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=UhEKYvv7Wbc" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/2026-10-20-gcp-london-outage/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>devops</category>
      <category>google</category>
      <category>sre</category>
    </item>
    <item>
      <title>Namecheap account locked after an ID check: why every domain went down</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Mon, 19 Oct 2026 16:30:00 +0000</pubDate>
      <link>https://dev.to/axrisi/namecheap-account-locked-after-an-id-check-why-every-domain-went-down-1cg0</link>
      <guid>https://dev.to/axrisi/namecheap-account-locked-after-an-id-check-why-every-domain-went-down-1cg0</guid>
      <description>&lt;p&gt;A long-time Namecheap customer says his account was locked after he missed a single ID-verification email, and every domain in it stopped working, including the domains his account email ran on. His &lt;a href="https://www.reddit.com/r/sysadmin/comments/1x8cycd/namecheap_just_seized_and_disabled_all_my_domains/" rel="noopener noreferrer"&gt;post on r/sysadmin&lt;/a&gt; reached the &lt;a href="https://news.ycombinator.com/item?id=50142866" rel="noopener noreferrer"&gt;Hacker News front page&lt;/a&gt; with more than six hundred points. If you keep domains at Namecheap, or at any registrar, the useful part of this story is the dependency it exposes: the account that can lock your domains is often reachable only through those same domains.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/WtA38A-NWEE" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A customer of twelve years says Namecheap's email gave him 72 hours to complete ID verification. He was away, missed it, and came back to dead servers. The quoted email calls it a "routine account information accuracy check-up" and says the account "has been locked pending your response".&lt;/li&gt;
&lt;li&gt;His account's contact email lived on the domains that were disabled, so the lock also cut the channel Namecheap uses to reach him.&lt;/li&gt;
&lt;li&gt;Namecheap's own registration agreement mentions five business days for answering inquiries about your information. ICANN's registrar contract uses fifteen days. Namecheap has not said publicly which process it applied here.&lt;/li&gt;
&lt;li&gt;The agreement also lets Namecheap suspend every service in an account when it has grounds to suspend one domain or service. That clause is the blast radius.&lt;/li&gt;
&lt;li&gt;Practical step for everyone: put your registrar login email on a domain that registrar does not hold.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What happened to the Namecheap account
&lt;/h2&gt;

&lt;p&gt;Everything in this section is the customer's account, posted by u/pinchitony on October 17. I could not see the original email, and the post does not name his domains or business.&lt;/p&gt;

&lt;p&gt;He says he has been a Namecheap customer for twelve years, that all of his domains are renewals, and that the most controversial site among them is a forum that has shown only a placeholder screen for almost fourteen years. After a few days away he found his servers down. In his words: "Apparently I received an email from Namecheap that expected for me to comply with ID verification within 72 hours and I didn't reply on time." The post title calls it "a single email with a 72 hours termination notice".&lt;/p&gt;

&lt;p&gt;He quotes the email's reason as follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;...your account has been flagged to be a part of our routine account information accuracy check-up to establish whether your account information is currently accurate, complete, and up to date. As a result, your account has been locked pending your response to the requests for documentation below.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the whole stated reason. No abuse report, no payment problem and no legal order is mentioned in what he shared.&lt;/p&gt;

&lt;p&gt;He then sent the documents. A day later he still had, as he put it, "no ETA, no reason, nothing, just 'thank you for your cooperation'". Live chat kept deferring to "the Risk management team" and told him that team does not do chat and works only through email.&lt;/p&gt;

&lt;p&gt;Two details from the post are worth keeping because they show the process from the inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The email change.&lt;/strong&gt; He says it took about four hours in chat to get a backup email address added to the account, and that "they never requested ANY information to make sure it was indeed me, the account's owner, yet they still added my email." He has 2FA and had not logged in for about twenty days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The two addresses.&lt;/strong&gt; Namecheap's website told him to write to the security address. He says the replies came from a separate compliance address, about twelve hours later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When I checked on October 19, the post had no update saying the account was restored, and I found no public reply from Namecheap in the Reddit thread or the Hacker News discussion. So this is one customer's side of a story Namecheap has not addressed in public. Treat the specifics accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one locked registrar account takes down everything
&lt;/h2&gt;

&lt;p&gt;Here is the chain, drawn the way it worked for him:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it depends on&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Namecheap account&lt;/td&gt;
&lt;td&gt;Login, 2FA, and a contact email for notices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domains in the account&lt;/td&gt;
&lt;td&gt;The account being in good standing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Websites and APIs&lt;/td&gt;
&lt;td&gt;DNS for those domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business email&lt;/td&gt;
&lt;td&gt;MX records on those domains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The account's contact email&lt;/td&gt;
&lt;td&gt;One of those same domains&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row closes the loop. When the account was locked, his domains were disabled, his servers went down, his mail broke, and the inbox Namecheap writes to for account matters was one of the casualties. He told the thread: "My account's email relies on the domains they disabled, so I had to pay another host to set it up". He is also considering renaming hostnames so some clients stay online while he waits.&lt;/p&gt;

&lt;p&gt;This setup is extremely common. Plenty of us register &lt;code&gt;example.com&lt;/code&gt;, host mail on it, and then use &lt;code&gt;me@example.com&lt;/code&gt; as the registrar login because it is the address we read every day. It works for years. It fails exactly when the registrar needs to reach you urgently.&lt;/p&gt;

&lt;h2&gt;
  
  
  How long does a registrar have to give you?
&lt;/h2&gt;

&lt;p&gt;The customer says his email gave 72 hours. Two documents give other numbers, and they answer slightly different questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ICANN's baseline.&lt;/strong&gt; The &lt;a href="https://www.icann.org/resources/pages/approved-with-specs-2013-09-17-en" rel="noopener noreferrer"&gt;2013 Registrar Accreditation Agreement&lt;/a&gt;, the contract every ICANN-accredited registrar signs, says in section 3.7.7.2 that a registrant's "failure to respond for over fifteen (15) days to inquiries by Registrar concerning the accuracy of contact details" is a material breach and "a basis for suspension and/or cancellation". Its WHOIS Accuracy Program Specification describes verifying an email address or phone number with a returned code. For the account holder, as distinct from the domain's registrant, it says the registrar "shall verify the applicable contact information manually, but is not required to suspend any registration."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Namecheap's own terms.&lt;/strong&gt; The &lt;a href="https://www.namecheap.com/legal/domains/registration-agreement/" rel="noopener noreferrer"&gt;Namecheap Registration Agreement&lt;/a&gt; says in section 14: "Failure by you, for whatever reason, to respond within five (5) business days to any inquiries made by Namecheap to determine the validity of information provided by you, shall also be considered to be a material breach of this agreement." The same agreement asks you to monitor the account email, because you "may lose your rights to the domain name(s)" if you do not respond appropriately.&lt;/p&gt;

&lt;p&gt;Put on one axis, that is fifteen days for ICANN's accuracy inquiries, five business days (about a calendar week) in Namecheap's general clause, and 72 hours in the customer's description of his email. ICANN's numbers are a floor for one kind of inquiry; a registrar can run additional risk or fraud processes under its own terms. Namecheap has not said which rule or process triggered this lock, so I cannot tell you that it broke any of them. I can tell you that a 72-hour window is short for someone who checks email once on a long weekend.&lt;/p&gt;

&lt;h2&gt;
  
  
  The contract sentence that explains the blast radius
&lt;/h2&gt;

&lt;p&gt;The registration agreement has a clause under "Namecheap Rights" that matters more than the deadlines:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If we have grounds to terminate or suspend Service(s) with respect to one domain name or in relation to other Service(s) provided through your account, we may terminate or suspend all Service(s) provided through your account, including Service(s) to other domain names maintained by you with us.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read plainly: a problem with one domain or one service can justify suspending every domain and service in the account. In this case the trigger was an account-level check, so all of his domains were in scope from the start. Again, Namecheap has not said it relied on this clause. It is simply what the contract allows, and you agreed to it when you registered.&lt;/p&gt;

&lt;p&gt;The practical question is how many domains you are willing to put behind one account and one inbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to change in your own registrar setup
&lt;/h2&gt;

&lt;p&gt;This is my editorial advice, not Namecheap guidance, and none of it would have prevented an ID check. It shortens the time between a notice and your answer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Move the registrar login email off the registrar's domains.&lt;/strong&gt; Use an address on a domain registered somewhere else, or a mailbox provider address you control independently. If every domain at the registrar goes dark, that inbox still works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep a current phone number on the account.&lt;/strong&gt; ICANN's verification process can use phone as well as email, and support may need a second channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat compliance and verification emails like an outage page.&lt;/strong&gt; Filter them to something that notifies you, and know your registrar's actual compliance contact before you need it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider splitting critical domains across accounts or registrars.&lt;/strong&gt; The account-wide suspension clause is the reason. One account per business-critical domain group limits what a single lock can reach.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Also in this episode: Let's Encrypt adds two remote perspectives
&lt;/h2&gt;

&lt;p&gt;Registrars are one party that decides whether a domain is yours; certificate authorities are another. &lt;a href="https://community.letsencrypt.org/t/lets-encrypt-is-adding-two-additional-remote-perspectives-for-domain-validation/252166" rel="noopener noreferrer"&gt;Let's Encrypt announced on October 15&lt;/a&gt; that "we will make seven total validation requests, one from the primary datacenter and six from remote perspectives (previously four)." For validation to succeed, "the primary server and a quorum of remote perspectives must receive the correct challenge response."&lt;/p&gt;

&lt;p&gt;The point is to make BGP route hijacks less useful: an attacker who briefly hijacks the route to your server might fool a check from one place, but fooling most of several distant vantage points at once is much harder. The change follows the CA/Browser Forum Baseline Requirements, which require at least five remote network perspectives from December 15, 2026. Staging starts Tuesday, October 27 and production Tuesday, November 10. Let's Encrypt says it expects "little to no impact to users". If your firewall blocks whole regions, validation failures are where you would notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also in this episode: a .com price lawsuit names Verisign and ICANN
&lt;/h2&gt;

&lt;p&gt;Last month I stamped Verisign's deletion of paid-up .name domains a REVERT. Now a class action, &lt;a href="https://www.hbsslaw.com/cases/verisign-com-domain-name-registry-consumer-class-action" rel="noopener noreferrer"&gt;Kessler v. VeriSign&lt;/a&gt; (C.D. Cal., filed September 4), reached the front page of &lt;a href="https://news.ycombinator.com/item?id=50148441" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt;. The plaintiffs' lawyers say Verisign's wholesale price for a .com went from $7.85 to $10.26 since 2021, that running a .com costs Verisign about $3, and that prices are projected to reach about $13.44 by 2030. They also note that every registrar pays the same wholesale fee, so it sits inside your renewal at Namecheap, Cloudflare or anywhere else. These are allegations; nothing has been proven in court.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: REVERT
&lt;/h2&gt;

&lt;p&gt;If his version holds up, a 72-hour lock that also kills the inbox you need to answer it is broken design. Registrars have real verification duties. They should still leave customers a working way to reply, and a lock that disables every domain at once should come with a clear reason and a timeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why would Namecheap lock an account for ID verification?&lt;/strong&gt;&lt;br&gt;
The email the customer quoted calls it a routine account information accuracy check. Namecheap's agreement requires accurate account and WHOIS information and lets it treat unanswered inquiries as a breach. Namecheap has not explained this specific case publicly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can a registrar suspend all my domains because of one problem?&lt;/strong&gt;&lt;br&gt;
Namecheap's registration agreement says that if it has grounds to suspend one domain or service, it may suspend all services in your account, including other domains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does ICANN give registrants to answer accuracy inquiries?&lt;/strong&gt;&lt;br&gt;
The 2013 Registrar Accreditation Agreement treats failure to respond for over fifteen days as a basis for suspension or cancellation. Registrars can apply their own additional processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/sysadmin/comments/1x8cycd/namecheap_just_seized_and_disabled_all_my_domains/" rel="noopener noreferrer"&gt;Customer's post, r/sysadmin (u/pinchitony)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=50142866" rel="noopener noreferrer"&gt;Hacker News discussion 50142866&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.namecheap.com/legal/domains/registration-agreement/" rel="noopener noreferrer"&gt;Namecheap Registration Agreement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.icann.org/resources/pages/approved-with-specs-2013-09-17-en" rel="noopener noreferrer"&gt;ICANN 2013 Registrar Accreditation Agreement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.letsencrypt.org/t/lets-encrypt-is-adding-two-additional-remote-perspectives-for-domain-validation/252166" rel="noopener noreferrer"&gt;Let's Encrypt: two additional remote perspectives&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=50150809" rel="noopener noreferrer"&gt;Hacker News discussion 50150809&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hbsslaw.com/cases/verisign-com-domain-name-registry-consumer-class-action" rel="noopener noreferrer"&gt;Kessler v. VeriSign case page, Hagens Berman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=50148441" rel="noopener noreferrer"&gt;Hacker News discussion 50148441&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=WtA38A-NWEE" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/2026-10-19-namecheap-domain-seizure/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>dns</category>
      <category>sysadmin</category>
      <category>programming</category>
    </item>
    <item>
      <title>API key security after the OpenCode Console breach</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Sun, 18 Oct 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/axrisi/api-key-security-after-the-opencode-console-breach-34lb</link>
      <guid>https://dev.to/axrisi/api-key-security-after-the-opencode-console-breach-34lb</guid>
      <description>&lt;p&gt;OpenCode reports a security breach affecting 1.4% of its Console users, specifically a subset with external providers linked. The &lt;a href="https://x.com/opencode/status/2111519637049319818" rel="noopener noreferrer"&gt;latest edited notice&lt;/a&gt; says those users were emailed and the incident is ongoing. For API key security, the useful first question is which component holds the credential. A familiar product name can hide several different answers.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/0vPlG6f14lg" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The reported percentage is of &lt;strong&gt;Console users&lt;/strong&gt;. Installing the local OpenCode agent alone does not establish inclusion in the affected group.&lt;/li&gt;
&lt;li&gt;Console's documentation says it stores connected provider credentials and serves requests through a shared gateway. That is the documented architecture; the incident's access path remains undisclosed.&lt;/li&gt;
&lt;li&gt;Review the official notification and provider activity. Preserving evidence, revoking suspicious credentials and updating affected integrations are general incident-hygiene advice.&lt;/li&gt;
&lt;li&gt;“Distillation” describes an alleged purpose involving model outputs. The public notice leaves the attacker identity, full customer impact and completed fix open.&lt;/li&gt;
&lt;li&gt;Sphinx and Pele, two other fresh developer tools, have useful documented boundaries of their own. Read those before adopting either one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  OpenCode Console breach: what the statement actually establishes
&lt;/h2&gt;

&lt;p&gt;The original announcement linked from Hacker News has a newer edited version. The newer statement matters because it spells out a condition that changes how a reader interprets the incident: the affected users had external providers linked. The same statement says OpenCode notified them by email and that users who did not receive an email were not impacted. That is the company's current affected-user claim. It should remain attributed to the company when repeated.&lt;/p&gt;

&lt;p&gt;The 1.4% figure needs its denominator attached every time. The population is Console users. The notice does not supply the population's size, so it does not support an absolute victim count. It also does not support applying the percentage to all OpenCode installations, monthly users or GitHub followers. Multiplying two unrelated marketing numbers would make an impressive graphic and an inaccurate one.&lt;/p&gt;

&lt;p&gt;The public statement says the team is working with Anthropic, OpenAI and Google to remediate. It says details cannot be shared yet because the incident is ongoing. Those are response statements. They leave several ordinary incident questions unanswered: how access was gained, what exact credential handling failed, how much unauthorized activity occurred and which changes will prevent a recurrence.&lt;/p&gt;

&lt;p&gt;Individual replies about missing credit or unexpected usage deserve investigation. This article does not independently verify those reports, turn them into a loss total or promise reimbursement. There is no verified reimbursement commitment in the cited notice. A screenshot of somebody's bill would still need an account of what caused the change before it became an incident-wide fact.&lt;/p&gt;

&lt;p&gt;We covered the initial announcement as an overnight side story in the previous episode. This is an explicitly requested follow-up, with more room for the scope and documented architecture. My earlier NEEDS REVIEW verdict remains a useful starting position while the technical report is missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  API key security starts with a credential map
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://opencode.ai/" rel="noopener noreferrer"&gt;OpenCode's product page&lt;/a&gt; describes an open-source coding agent for the terminal, editor and desktop. The &lt;a href="https://opencode.ai/v2/docs/console/models/" rel="noopener noreferrer"&gt;Console model documentation&lt;/a&gt; describes an optional provider that can be used with OpenCode or another coding agent. A person may use OpenCode with a different provider arrangement. The local agent's name therefore cannot establish whether the person used the affected hosted service.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://opencode.ai/v2/docs/console/providers/" rel="noopener noreferrer"&gt;Console provider documentation&lt;/a&gt; supplies a concrete architectural fact: Console stores a connected provider credential and serves that provider through its gateway. Workspace members can use the models without seeing the upstream provider key. Owners and administrators manage these connections through the Providers tab.&lt;/p&gt;

&lt;p&gt;That arrangement has an obvious administrative benefit. A team can share model access without copying an upstream key to every member. It also gives the gateway responsibility for a credential that unlocks an external service. The documented convenience and the documented trust boundary are part of the same design.&lt;/p&gt;

&lt;p&gt;A useful inventory separates the pieces:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;Question to answer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Local coding agent&lt;/td&gt;
&lt;td&gt;Which provider configuration does this agent use?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hosted Console workspace&lt;/td&gt;
&lt;td&gt;Which external accounts have been connected here?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider credential&lt;/td&gt;
&lt;td&gt;Who can revoke it and where can its activity be inspected?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Downstream integration&lt;/td&gt;
&lt;td&gt;Which tools depend on this credential being valid?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is an inventory template. It is not a reconstruction of the attack. Drawing an attacker moving along these boxes would imply knowledge the announcement has not supplied. The exact failure could involve a different part of the service, and the eventual report will have to explain that.&lt;/p&gt;

&lt;p&gt;For the same reason, keeping the percentage narrow does not make the impact trivial. A subset can contain people with serious exposure. Scope helps those people find the right response and helps other readers avoid treating an unrelated component as a confirmed victim.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check when provider credentials may be exposed
&lt;/h2&gt;

&lt;p&gt;Start with the official notice and your own account arrangement. Establish whether external providers were connected through Console. Review the notification the company says it sent. If something about your account remains unclear, use the official support channel and ask about that concrete configuration rather than trying to diagnose it from another person's reply thread.&lt;/p&gt;

&lt;p&gt;Then review provider activity. Preserve the relevant timestamps and records before changing the credential arrangement, where that is practical and consistent with containing suspicious use. If you identify suspicious activity, revoke the exposed credential through the provider that issued it. Update affected integrations with a deliberate replacement rather than leaving a silently failing tool in the background.&lt;/p&gt;

&lt;p&gt;These are general incident-response habits, offered as editorial advice. OpenCode's announcement has not published a complete customer remediation checklist. Follow any newer, account-specific instructions that the company and the affected provider supply. The live notice should be rechecked before this piece is published because an ongoing incident can change while a video is being edited.&lt;/p&gt;

&lt;p&gt;For future integrations, record where a credential lives, which upstream account it reaches and who owns revocation. Restrict its permissions and spending where the provider supports that. Review activity and keep an inventory of dependencies that will need updating after a replacement. The exact controls depend on the provider and account type; a generic “rotate everything” slogan does not perform that inventory for you.&lt;/p&gt;

&lt;p&gt;I would also distinguish the service's access controls from the agent's working permissions. A code-review hook, terminal prompt or confident model answer supplies a different kind of assurance. It does not establish the security of a hosted credential store. Developers already spend enough time asking whether a green badge means what they think it means.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “distillation attack” tells us
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.anthropic.com/news/detecting-and-preventing-distillation-attacks" rel="noopener noreferrer"&gt;Anthropic's background explanation&lt;/a&gt; defines distillation as training a less capable model on the outputs of a stronger one. The technique also has legitimate uses. A provider can distill its own models into smaller versions; unauthorized extraction campaigns use outputs for a different purpose.&lt;/p&gt;

&lt;p&gt;OpenCode associates this breach with a large-scale distillation attack. The useful reading is that this describes the alleged purpose of the activity. It leaves the access mechanism open. The words do not identify an attacker, explain how credentials were handled or quantify what happened to customers.&lt;/p&gt;

&lt;p&gt;Anthropic's February article discusses separate cases. Its named organizations and account totals must stay attached to those cases. They provide no attribution for this OpenCode incident. A story can have a plausible motive while still lacking a public technical cause, and the two should remain separate fields in the reporting.&lt;/p&gt;

&lt;p&gt;The later report should help customers answer what changed in the system they actually used. Until then, an elaborate attack diagram would mainly demonstrate how well the illustrator can connect arrows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also today: Sphinx asks you to explain the diff
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/parthh01/sphinx" rel="noopener noreferrer"&gt;Sphinx&lt;/a&gt; is a Git hook that pauses protected-branch pushes for an understanding check. A separate reviewer reads the committed change without the generating chat. It asks about behavior and failure cases. Its published worker/redelivery conversation is illustrative; we have not installed Sphinx or measured a production-review improvement.&lt;/p&gt;

&lt;p&gt;The adoption caveats deserve attention. Installation changes the global Git hook path. The reviewer provider receives changed code and answers. Filename-based exclusions cannot catch a secret embedded in ordinary source. There is no default cap on model calls; a typical check uses five to eight requests plus about one per answer. Local hooks can be bypassed, and the examiner can be wrong. This is an exercise in understanding with costs and data flow to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also today: Pele changes the theme while keeping the SVG
&lt;/h2&gt;

&lt;p&gt;Obsidian's kepano released &lt;a href="https://pele.run/" rel="noopener noreferrer"&gt;Pele&lt;/a&gt;, a Mermaid-to-SVG renderer with CSS-variable theming. Its bundle table reports about 230 kB compressed against Mermaid's 1.6 MB. Speed comparisons remain the project's measurements; we did not reproduce them.&lt;/p&gt;

&lt;p&gt;We did make a small behavior check in the real homepage editor. Changing the documented CSS variables preserved the same SVG node and four labels while the computed background and line colors changed. That demonstrates the advertised theme behavior, with no claim about render speed.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://pele.run/security" rel="noopener noreferrer"&gt;security page&lt;/a&gt; says displayed images can make network requests, and the application owns supplied icon markup and internal-link navigation. Links and images can be disabled. Source/output limits are documented. A smaller dependency still arrives with responsibilities for its caller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: NEEDS REVIEW
&lt;/h2&gt;

&lt;p&gt;I'd keep the Console incident under review until enough information is published to assess the affected credentials and the fix. The practical habit is to identify which service actually holds your provider access. That information remains useful after the current headline leaves the front page.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does using the local OpenCode agent put me in the reported affected group?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Installation alone does not establish that. The official notice names a subset of Console users with external providers linked. Check your own provider arrangement and the company's notification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does 1.4% tell us how many people were affected?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The total Console population is undisclosed in the cited notice. An absolute count cannot be calculated from that statement alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Has OpenCode published the root cause or completed fix?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The reviewed notice says the incident is ongoing and additional details cannot yet be shared. It states that the team is working with three providers to remediate. It does not establish completion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will an AI understanding check secure my provider credentials?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A tool such as Sphinx asks a different question: whether you can explain a committed change. Its own documentation exposes reviewer limitations and data flow. Credential storage needs its own reviewed controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://x.com/opencode/status/2111519637049319818" rel="noopener noreferrer"&gt;Latest edited OpenCode notice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opencode.ai/" rel="noopener noreferrer"&gt;OpenCode product&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opencode.ai/v2/docs/console/providers/" rel="noopener noreferrer"&gt;Console provider gateway&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opencode.ai/v2/docs/console/models/" rel="noopener noreferrer"&gt;Optional Console models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news/detecting-and-preventing-distillation-attacks" rel="noopener noreferrer"&gt;Distillation background&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/parthh01/sphinx" rel="noopener noreferrer"&gt;Sphinx documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pele.run/" rel="noopener noreferrer"&gt;Pele&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pele.run/security" rel="noopener noreferrer"&gt;Pele security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/kepano/status/2111575190081847776" rel="noopener noreferrer"&gt;Pele maintainer explanation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=0vPlG6f14lg" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/2026-10-18-opencode-console-breach/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Local AI on four Macs: MLX capacity, speed and trust boundaries</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Sun, 18 Oct 2026 00:23:54 +0000</pubDate>
      <link>https://dev.to/axrisi/local-ai-on-four-macs-mlx-capacity-speed-and-trust-boundaries-4pla</link>
      <guid>https://dev.to/axrisi/local-ai-on-four-macs-mlx-capacity-speed-and-trust-boundaries-4pla</guid>
      <description>&lt;p&gt;Local AI gets a hardware question before it gets a leaderboard question: can the model and its working memory fit on the machine? Apple's distributed MLX demonstration shows how several Mac Studios can make a very large Meta model usable at a desk. Its own measurements also show why adding a second computer can leave generation speed almost unchanged.&lt;/p&gt;

&lt;p&gt;This is the October 17 edition, published on October 18. The hardware source was published on October 15; the OpenCode Console notice below is explicitly an overnight October 18 GMT+7 update. The dates matter because an interesting result can circulate for several days, while an ongoing security notice can change within hours.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/HkZzHWiqzZA" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Apple reports Muse Spark Open generating above human reading speed on four M5 Ultra Mac Studios. This is its vendor benchmark, with a stated model, precision and context.&lt;/li&gt;
&lt;li&gt;More machines provide capacity. Pipeline and tensor parallelism use that capacity differently, with different consequences for a reply's latency.&lt;/li&gt;
&lt;li&gt;A change in time to first token describes prompt processing and waiting. Tokens per second describes generation. Keep the two clocks separate.&lt;/li&gt;
&lt;li&gt;Before buying, test a representative task and inspect the services handling prompts and credentials. A selected benchmark map leaves many work tasks unmeasured.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What four Macs make possible
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://machinelearning.apple.com/research/mlx-distributed-inference" rel="noopener noreferrer"&gt;Apple's article&lt;/a&gt; starts on one Mac Studio and scales out using MLX and the RDMA-over-Thunderbolt driver. MLX is an open-source array framework for machine learning on Apple silicon. Within a Mac, its unified-memory arrangement lets CPU and GPU work with shared memory.&lt;/p&gt;

&lt;p&gt;Across multiple Macs, communication remains a real boundary. The individual machines retain their own memory and execution. Software partitions the model and moves the necessary intermediate results between them. You should not picture four computers turning into a single ordinary shared-memory bus.&lt;/p&gt;

&lt;p&gt;The largest model in the article is Meta's Muse Spark Open. Apple's table separates total parameters from active parameters: it is a mixture-of-experts architecture, so an inference step uses a fraction of the model's experts. That reduces compute for an individual step while leaving a substantial model to store.&lt;/p&gt;

&lt;p&gt;In its native precision, Apple says the parameter storage alone would exceed 1.6 TB. Evaluating the model at four-bit NVFP4 reduces that footprint to about 493 GB. A single supported Mac Studio configuration can reach 512 GB, but inference also requires memory for intermediate computations. The headline weight size therefore fails to establish that the full workload fits.&lt;/p&gt;

&lt;p&gt;This is a useful buying distinction. A configuration ceiling is not the capacity of every machine with the same product name. Weight storage is also only one part of the runtime requirement. Additional workspace can make a nearly full memory configuration inadequate, even when the initial model file appears to fit.&lt;/p&gt;

&lt;p&gt;Our video represents that workspace as an additional unquantified requirement. It does not invent an extra memory measurement or pretend that a conceptual diagram is a hardware trace. Apple's text establishes the fitting problem; the diagram explains the relationship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipeline parallelism: splitting layers
&lt;/h2&gt;

&lt;p&gt;Pipeline parallelism divides the model through its sequence of layers. In Apple's two-machine description, the first Mac evaluates the earlier layers and sends their output to the second Mac, which evaluates the later layers.&lt;/p&gt;

&lt;p&gt;For a single generated token, the later work depends on the earlier result. The same token does not receive both halves of its computation simultaneously. Apple consequently reports that decode speed with pipeline parallelism is generally very similar to a single machine, since the layers are still evaluated sequentially.&lt;/p&gt;

&lt;p&gt;The single-machine comparison uses models that fit on one Mac. Qwen and Mistral provide those baselines. The article does not establish a single-Mac Muse generation baseline, because the large Muse configuration needs more than one machine to fit. Substituting an imaginary baseline would turn an architecture explanation into a misleading race.&lt;/p&gt;

&lt;p&gt;Prompt processing can have a different result. Apple also reports a benefit for pipeline prefill at large context. A blanket claim that a pipeline can never help would discard that part of its findings. The useful question is which phase and workload your application needs to accelerate.&lt;/p&gt;

&lt;p&gt;This is why a second machine can be worthwhile even when one reply's token rate changes little. It can enable a model that previously could not run in the available memory. The capacity result is still valuable. It simply answers a different purchase question from a promise of doubled speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tensor parallelism: sharing each layer
&lt;/h2&gt;

&lt;p&gt;Tensor parallelism partitions work across a layer. Multiple machines calculate pieces of that layer and combine the results before continuing. This introduces parallel work within the step that a single token needs, offering a route to improved generation speed.&lt;/p&gt;

&lt;p&gt;It also introduces repeated communication. Combining partial results must be cheap enough that the calculation saved exceeds the coordination cost. The interconnect and its implementation become part of the inference system rather than an afterthought you can replace without measurement.&lt;/p&gt;

&lt;p&gt;Apple uses low-latency RDMA over Thunderbolt for this configuration. The source identifies the driver and MLX backend versions; ordinary Ethernet should not silently replace that tested arrangement in a performance claim. Hardware, operating-system support and the actual software backend all matter.&lt;/p&gt;

&lt;p&gt;In our conceptual animation, the same model identities move from a sequential split into pieces of the same layer. The connectors show the required relationships. Their pulses do not claim to reproduce measured packet traffic or exact hardware timing.&lt;/p&gt;

&lt;p&gt;For a production decision, retain the configuration details. Check the machines and memory you actually own, the operating-system requirements, the communication topology, the model format and the context length. A similarly named system can have a different bottleneck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two clocks in the reported result
&lt;/h2&gt;

&lt;p&gt;Apple reports Muse Spark Open exceeding 36 tokens per second on a four-Mac cluster. The relevant generation figure uses an 8,192-token context. This is a vendor measurement, with the M5 Ultra systems and the evaluation format specified in the source.&lt;/p&gt;

&lt;p&gt;An additional experiment studies the wait for the first token at a larger context. Its reported values are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt-processing setup&lt;/th&gt;
&lt;th&gt;Reported time to first token&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One cable per peer link&lt;/td&gt;
&lt;td&gt;About 50.5 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two cables per peer link&lt;/td&gt;
&lt;td&gt;About 40.6 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That experiment uses a 65,536-token context. Its roughly ten-second reduction is a waiting-time result. It is not a new decode throughput figure, and it should not be mixed into the smaller-context generation chart.&lt;/p&gt;

&lt;p&gt;These clocks describe different user experiences. A large prompt can produce a substantial initial wait even if the answer subsequently streams at a comfortable rate. A short coding interaction may care more about startup and tool latency than a sustained benchmark run.&lt;/p&gt;

&lt;p&gt;There is also a precision boundary. Apple's table evaluates Muse in NVFP4 and the smaller comparison models in their native formats. A real Hacker News reaction questioned that comparison; the table itself supplies the format facts. This does not establish a measured quality difference between formats. It tells you what comparison was actually run.&lt;/p&gt;

&lt;p&gt;We did not own or reproduce this Mac cluster. The research ledger records an informal reader claim for a different model, but there were no controlled same-model artifacts to validate it. We therefore present Apple's figures as vendor-reported and avoid constructing an independent defeat from incomparable results.&lt;/p&gt;

&lt;h2&gt;
  
  
  A local AI purchase needs your own workload
&lt;/h2&gt;

&lt;p&gt;Start with a task you can judge. Retain the prompt length, tool calls, completion requirements and acceptance checks. Measure whether the model fits, how long the interaction waits, how quickly useful output arrives and whether the whole task succeeds.&lt;/p&gt;

&lt;p&gt;A running process can behave differently from a cold startup. A model that comfortably stores its weights can still struggle when the prompt and intermediate state grow. A higher token rate can have little effect on an interaction dominated by another stage. Those are reasons to record the complete path.&lt;/p&gt;

&lt;p&gt;Utilization also matters to the economics. Apple has not supplied a universal break-even price against hosted APIs for everyone's workload. The model, frequency of use and required configuration affect that calculation. An occasional assistant can leave an expensive machine spending most of its time decorating a desk.&lt;/p&gt;

&lt;p&gt;Local inference can provide a useful administrative boundary around prompts when the actual setup keeps those prompts local. Inspect the surrounding components too: clients, external services, authentication and any provider connections. The physical location of the model does not describe every service your workflow uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mercor's map: missing coverage leaves a question
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.mercor.com/research/labor-index/benchmark-map/" rel="noopener noreferrer"&gt;Mercor mapped a selected set of AI benchmarks&lt;/a&gt; onto a US work-task taxonomy. Its index contains roughly nine hundred covered tasks against almost nineteen thousand tasks in the underlying taxonomy.&lt;/p&gt;

&lt;p&gt;The map estimates that 90% of working hours involve tasks with little or no benchmark coverage. That is a coverage finding. It does not measure a 90% failure rate or prove that those jobs are automated. Unmeasured capability remains an open question.&lt;/p&gt;

&lt;p&gt;The mapping was AI-assisted, with expert review on a subset of Mercor's own benchmark prompts. Reviewers accepted roughly three quarters of the first-choice mappings they judged. The methodology's review boundary deserves attention alongside its large headline percentage.&lt;/p&gt;

&lt;p&gt;For a buyer, the practical consequence is straightforward: a general leaderboard cannot replace representative tasks and acceptance checks from your own work. The awkward parts after the polished demo still belong in the evaluation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overnight update: OpenCode Console scope
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://x.com/opencode/status/2111519637049319818" rel="noopener noreferrer"&gt;edited official OpenCode notice&lt;/a&gt; describes a security breach affecting 1.4% of Console users. It narrows that scope to a subset with external providers linked and says affected users were emailed. The company calls it a large-scale distillation attack and describes the incident as ongoing.&lt;/p&gt;

&lt;p&gt;That statement does not supply a public root cause or evidence of compromise in every local OpenCode installation. Replies include users reporting lost provider credit; those reports do not independently establish each loss or a compensation commitment.&lt;/p&gt;

&lt;p&gt;Apple's article explicitly names OpenCode as a client that can connect to a local MLX server. The client interface and the hosted Console are distinct parts of a setup. Follow the official notice and provider-account remediation guidance where applicable; inspect the specific services holding your credentials. We have drawn no speculative attack route.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: NEEDS REVIEW
&lt;/h2&gt;

&lt;p&gt;I'd test the actual workload before buying the cluster. Apple's result makes large local inference more practical, and its pipeline measurements show why capacity alone cannot predict the response speed you want. Keep the task evaluation and service review beside the purchase order.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Will two Macs generate one reply twice as fast?
&lt;/h3&gt;

&lt;p&gt;Apple's pipeline result generally keeps a token's layer evaluation sequential. Tensor parallelism shares each layer's work and repeatedly combines results. Measure the scheme and workload you actually use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do Apple's numbers establish better answers from the largest model?
&lt;/h3&gt;

&lt;p&gt;The cited figures measure inference performance. The table discloses evaluation precision. We have no controlled quality reproduction here; use acceptance checks for the task you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does a local model make every surrounding service local?
&lt;/h3&gt;

&lt;p&gt;Trace the actual client, endpoint and credential-bearing services. Apple describes a local MLX server; the overnight OpenCode notice explicitly concerns a subset of hosted Console users. Keep those scopes separate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://machinelearning.apple.com/research/mlx-distributed-inference" rel="noopener noreferrer"&gt;Apple: Local and Distributed Large LLM Inference with MLX and RDMA on Mac Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=50118320" rel="noopener noreferrer"&gt;Apple discussion and precision reaction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mercor.com/research/labor-index/benchmark-map/" rel="noopener noreferrer"&gt;Mercor: A benchmark map of the US economy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=50121179" rel="noopener noreferrer"&gt;Mercor discussion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/opencode/status/2111519637049319818" rel="noopener noreferrer"&gt;OpenCode: edited official Console notice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=50133401" rel="noopener noreferrer"&gt;OpenCode discussion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=HkZzHWiqzZA" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/2026-10-17-apple-mac-cluster/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>apple</category>
      <category>ai</category>
      <category>opencode</category>
    </item>
    <item>
      <title>Python performance: native loops, NumPy and the vectorize trap</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Sat, 17 Oct 2026 10:47:01 +0000</pubDate>
      <link>https://dev.to/axrisi/python-performance-native-loops-numpy-and-the-vectorize-trap-3pbj</link>
      <guid>https://dev.to/axrisi/python-performance-native-loops-numpy-and-the-vectorize-trap-3pbj</guid>
      <description>&lt;p&gt;Python performance discussions tend to reach for a language migration before measuring the work. A numerical loop makes the problem easier to see: you can keep the calculation unchanged, move its repeated execution into a native operation, and finish much sooner on the same CPU. You can also spend the entire gain converting the data around that operation.&lt;/p&gt;

&lt;p&gt;We tested both situations, plus a compiled Python-syntax loop and the tempting &lt;code&gt;np.vectorize&lt;/code&gt; wrapper. The result gives you a practical question to ask before rewriting anything: where does the loop actually run, and which input and output does your caller need?&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/obejoryK8HE" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Numeric NumPy operations can process typed arrays through compiled implementations, reducing repeated interpreter and object work.&lt;/li&gt;
&lt;li&gt;The ready-array case was dramatically faster in our workload. A Python-list input/output contract removed that advantage.&lt;/li&gt;
&lt;li&gt;Small inputs favored a comprehension. A warmed Numba loop was fast too; its initial compilation had a separate cost.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;np.vectorize&lt;/code&gt; provides a convenient array-facing wrapper around a Python function. Its documented implementation still calls that function across elements.&lt;/li&gt;
&lt;li&gt;Profile the complete path and retain the result representation that the next operation can use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this Python performance test measures
&lt;/h2&gt;

&lt;p&gt;The calculation was &lt;code&gt;y = x*x + x&lt;/code&gt;. Every implementation received the same numerical values, and every checked answer matched exactly. Inputs were bounded, integer-valued floating-point numbers, making this expression's rounding behavior straightforward. This was an elementwise calculation, with no reduction whose summation order could change the answer.&lt;/p&gt;

&lt;p&gt;The primary run used this environment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Tested configuration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Interpreter&lt;/td&gt;
&lt;td&gt;CPython 3.10.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Array library&lt;/td&gt;
&lt;td&gt;NumPy 2.2.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compiler&lt;/td&gt;
&lt;td&gt;Numba 0.67.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Machine&lt;/td&gt;
&lt;td&gt;Intel Core i9-13900HX, WSL2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution&lt;/td&gt;
&lt;td&gt;One logical CPU affinity; no GPU backend&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We retained eleven warmed timing trials per method and case, shuffled method order, and recorded output correctness and the environment. All forty correctness comparisons passed.&lt;/p&gt;

&lt;p&gt;There were two contracts. &lt;strong&gt;Ready inputs&lt;/strong&gt; prepared a Python list or numeric array before the timer and allowed the implementation's normal output representation. &lt;strong&gt;Python-list input/output&lt;/strong&gt; began with a Python list and required a fresh Python list at the end. The numerical backends therefore included conversion into an array and conversion back out.&lt;/p&gt;

&lt;p&gt;For one million values, these were the primary run's median milliseconds:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Implementation&lt;/th&gt;
&lt;th&gt;Ready inputs&lt;/th&gt;
&lt;th&gt;Python-list input/output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Explicit Python loop&lt;/td&gt;
&lt;td&gt;43.326&lt;/td&gt;
&lt;td&gt;36.698&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comprehension&lt;/td&gt;
&lt;td&gt;32.538&lt;/td&gt;
&lt;td&gt;27.613&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NumPy numeric expression&lt;/td&gt;
&lt;td&gt;0.917&lt;/td&gt;
&lt;td&gt;27.848&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python callback through &lt;code&gt;np.vectorize&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;86.829&lt;/td&gt;
&lt;td&gt;105.721&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warmed Numba loop&lt;/td&gt;
&lt;td&gt;0.379&lt;/td&gt;
&lt;td&gt;27.566&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The ready-array gain is substantial. The common-list comparison is a near tie between the comprehension and the numerical implementations. Those are answers to different caller requirements.&lt;/p&gt;

&lt;p&gt;These are shared-workstation observations. Frequencies were not isolated, and the recorded ranges show noise. Garbage collection was disabled during timing and restored afterward; allocation and release of results remained inside the timed calls. Imports, input preparation and initial JIT compilation were outside the warmed measurements. Cross-scope changes in the same comprehension should not be interpreted as a causal optimization.&lt;/p&gt;

&lt;h2&gt;
  
  
  The work surrounding an ordinary Python loop
&lt;/h2&gt;

&lt;p&gt;CPython compiles source into bytecode and executes those instructions through its interpreter. Its own implementation is native code. The relevant difference here is the work repeated around each numerical value.&lt;/p&gt;

&lt;p&gt;The actual tested function was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;python_loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its saved CPython 3.10 disassembly includes iteration, multiplication and addition instructions. The &lt;a href="https://docs.python.org/3.10/library/dis.html" rel="noopener noreferrer"&gt;version-specific bytecode documentation&lt;/a&gt; is important: newer interpreters can specialize or execute this work differently.&lt;/p&gt;

&lt;p&gt;A Python list stores references to objects. The &lt;a href="https://raw.githubusercontent.com/python/cpython/v3.10.12/Include/cpython/listobject.h" rel="noopener noreferrer"&gt;CPython list declaration&lt;/a&gt; exposes that arrangement as &lt;code&gt;PyObject **ob_item&lt;/code&gt;. General Python operations support a much wider range of objects than this repetitive arithmetic needs. Our input happened to contain only floats; we measured no heterogeneous-data workload.&lt;/p&gt;

&lt;p&gt;A comprehension improves the expression of this particular job and was faster than the explicit loop in the recorded large-input cases. Replacing the spelling of a loop does not automatically remove its per-element execution path.&lt;/p&gt;

&lt;h2&gt;
  
  
  How NumPy vectorization changes the contract
&lt;/h2&gt;

&lt;p&gt;A numeric ndarray carries a declared type and a layout that its implementation understands. The &lt;a href="https://numpy.org/doc/2.2/reference/arrays.ndarray.html" rel="noopener noreferrer"&gt;NumPy array documentation&lt;/a&gt; describes a container of items with the same type and size, and explains strides and views. Our arrays were contiguous float64 arrays. Other layouts are supported, so contiguous storage is a property of this test rather than a promise about every ndarray.&lt;/p&gt;

&lt;p&gt;The tested batch function was short:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;numpy_batch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For this numeric array, the arithmetic hands whole batches to native operations. The &lt;a href="https://numpy.org/doc/2.2/user/basics.ufuncs.html" rel="noopener noreferrer"&gt;ufunc documentation&lt;/a&gt; notes that many built-in functions have compiled C implementations. The loop continues to exist inside that implementation, where known numeric types permit a different execution path.&lt;/p&gt;

&lt;p&gt;Keep three concepts separate: a batch interface, a native implementation and processor vector instructions. Itamar Turner-Trauring's &lt;a href="https://pythonspeed.com/articles/vectorization-python-alternatives/" rel="noopener noreferrer"&gt;explanation of vectorization's limits&lt;/a&gt; makes that distinction explicit. A function accepting an array gives you little evidence about the code that handles each element.&lt;/p&gt;

&lt;p&gt;This expression also performs two operations and creates a temporary product before producing the final output. One attractive line of Python can request multiple traversals and buffers. It is worth looking at supported output-buffer reuse or compilation when temporary arrays become the expensive part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversion and small inputs can reverse the result
&lt;/h2&gt;

&lt;p&gt;At eight values, the primary run's ready-input comprehension beat the numeric NumPy expression. Library dispatch and setup were a larger part of the tiny task. The larger ready arrays pulled ahead in the measured size sweep.&lt;/p&gt;

&lt;p&gt;Then the caller contract changed. The numerical path had to turn a Python list into an array, compute the expression, and turn the output into Python objects again. The arithmetic stayed fast. The complete path acquired work on both sides of it.&lt;/p&gt;

&lt;p&gt;We independently repeated the identical source on CPython 3.13.2, with the same NumPy and Numba versions. Another forty exact checks passed. The small-input comprehension win, ready-array advantage and callback penalty persisted. With one million values under the common-list contract, the comprehension took about 23 milliseconds while NumPy took about 33. In that observation the numerical path lost.&lt;/p&gt;

&lt;p&gt;The two separately timed runs do not isolate the causal effect of a Python version change. They reinforce a more useful boundary: conversion can consume the benefit, and a universal speed multiplier would misdescribe the evidence. Neither run claims to measure the latest Python release.&lt;/p&gt;

&lt;p&gt;Follow the next operation. If it accepts an array, keeping that representation avoids a needless round trip. If an external interface truly requires Python objects, its conversion cost belongs in your measurement. Input preparation, parsing and network waits may require their own profiling too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The &lt;code&gt;np.vectorize&lt;/code&gt; callback trap
&lt;/h2&gt;

&lt;p&gt;Here is the function and wrapper from the actual test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scalar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;

&lt;span class="n"&gt;vectorized_callback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;vectorize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scalar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;otypes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The name is easy to mistake for an execution guarantee. NumPy's &lt;a href="https://numpy.org/doc/2.2/reference/generated/numpy.vectorize.html" rel="noopener noreferrer"&gt;vectorize documentation&lt;/a&gt; describes the wrapper as primarily a convenience feature and states: “The implementation is essentially a for loop.”&lt;/p&gt;

&lt;p&gt;The wrapper offers broadcasting behavior while repeatedly invoking the supplied Python function. Our million-value ready-input callback case took about 87 milliseconds, slower than the comprehension. Returning through the callback preserved the kind of per-element work we wanted to reduce. The stopwatch never received the memo about that impressive function name.&lt;/p&gt;

&lt;p&gt;Convenience can still be the right objective. Keep the wrapper when its interface solves your problem and its runtime is acceptable. For a performance objective, inspect the implementation and measure the actual function call path.&lt;/p&gt;

&lt;h2&gt;
  
  
  A compiled Python loop can be fast
&lt;/h2&gt;

&lt;p&gt;Numba's &lt;a href="https://numba.readthedocs.io/en/stable/user/performance-tips.html" rel="noopener noreferrer"&gt;performance guide&lt;/a&gt; explicitly demonstrates loops. Our tested numerical function retained loop syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;numba&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;njit&lt;/span&gt;

&lt;span class="nd"&gt;@njit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fastmath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parallel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;compiled_loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;empty_like&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Numba compiled this supported function for the array types it received. The primary warmed result was below half a millisecond with ready arrays. Initial compilation plus execution took about a second and was recorded separately.&lt;/p&gt;

&lt;p&gt;Those two clocks serve different questions. A long-running process that repeatedly calls a supported kernel can amortize compilation. A tiny one-off task may spend most of its time setting up. Our warmed number does not establish the best choice for cold scripts or arbitrary Python objects.&lt;/p&gt;

&lt;p&gt;You can combine the Python snippets above and check them with the following input. We executed this check against the article's actual snippets. It verifies answers; the earlier performance protocol additionally records warmed repeated timings and the caller contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;asarray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;python_loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;float64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nf"&gt;numpy_batch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;vectorized_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;compiled_loop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assert_array_equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A profiling-first checklist
&lt;/h2&gt;

&lt;p&gt;Locate the operation that consumes the time. Establish its real input and required output. Then compare candidates under that contract.&lt;/p&gt;

&lt;p&gt;For numerical hot paths, check whether the data already fits a numeric array, whether subsequent operations can retain it, and whether temporary buffers dominate. If supported Python-syntax loops can compile into a useful kernel, test that alternative with both cold and warmed costs visible.&lt;/p&gt;

&lt;p&gt;For callback wrappers, inspect what runs once per element. For parsing or network waits, measure those stages directly. Changing a numerical loop can have little effect on a program dominated by a different stage.&lt;/p&gt;

&lt;p&gt;Keep repeated timings and verify outputs. Record the interpreter and library versions so somebody else can reproduce the comparison. A saved fast result is useful when you know the question its timer answered. Starting a language migration before that would be an expensive way to avoid opening a profiler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: SHIP IT
&lt;/h2&gt;

&lt;p&gt;I'd ship batching for a measured numerical hot path when the data and caller contract support it. Ordinary loops can remain the clearest implementation when they already perform adequately. The mechanism worth learning is the execution boundary, together with the cost of crossing data representations.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does normal NumPy arithmetic use my GPU?
&lt;/h3&gt;

&lt;p&gt;This test used NumPy CPU ndarrays. A backend such as &lt;a href="https://docs.cupy.dev/en/stable/user_guide/basic.html" rel="noopener noreferrer"&gt;CuPy&lt;/a&gt; provides GPU arrays and operations, with its own memory and transfer requirements. We performed no GPU timing comparison.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does native execution guarantee SIMD or multiple cores?
&lt;/h3&gt;

&lt;p&gt;No. NumPy's &lt;a href="https://numpy.org/doc/2.2/reference/simd/index.html" rel="noopener noreferrer"&gt;CPU/SIMD machinery&lt;/a&gt; can select supported implementations, but feature availability does not identify the instructions used by a particular expression. We took no hardware-counter trace and assigned no fraction of the gain to SIMD.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is a comprehension always the fastest ordinary Python spelling?
&lt;/h3&gt;

&lt;p&gt;Our comprehension won over the explicit loop in the recorded large-input cases. Different work, versions and implementations can produce different results. Measure the operation you actually need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I replace every loop with &lt;code&gt;np.vectorize&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;Use it for appropriate convenience and broadcasting requirements. Its callback execution means that a shorter array-facing interface can retain Python work for every element. A numeric ufunc or supported compiled loop is a different implementation choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/library/dis.html" rel="noopener noreferrer"&gt;CPython 3.10 disassembly and bytecode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/python/cpython/v3.10.12/Include/cpython/listobject.h" rel="noopener noreferrer"&gt;CPython 3.10.12 list representation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://numpy.org/doc/2.2/reference/arrays.ndarray.html" rel="noopener noreferrer"&gt;NumPy 2.2 ndarray types, layout and strides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://numpy.org/doc/2.2/user/basics.ufuncs.html" rel="noopener noreferrer"&gt;NumPy universal functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pythonspeed.com/articles/vectorization-python-alternatives/" rel="noopener noreferrer"&gt;The limits of Python vectorization as a performance technique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://numpy.org/doc/2.2/reference/generated/numpy.vectorize.html" rel="noopener noreferrer"&gt;NumPy vectorize documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://numba.readthedocs.io/en/stable/user/performance-tips.html" rel="noopener noreferrer"&gt;Numba performance tips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://numpy.org/doc/2.2/reference/simd/index.html" rel="noopener noreferrer"&gt;NumPy CPU/SIMD support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.cupy.dev/en/stable/user_guide/basic.html" rel="noopener noreferrer"&gt;CuPy basics and array backends&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The local experiments and their raw trials are preserved in the production evidence. The tables report our measurements, independently of the illustrative benchmarks in these sources.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=obejoryK8HE" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/2026-10-17-python-native-loops/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>numpy</category>
      <category>numba</category>
    </item>
    <item>
      <title>Meta AI training: what the new business terms ask of your website</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Fri, 16 Oct 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/axrisi/meta-ai-training-what-the-new-business-terms-ask-of-your-website-5ag7</link>
      <guid>https://dev.to/axrisi/meta-ai-training-what-the-new-business-terms-ask-of-your-website-5ag7</guid>
      <description>&lt;p&gt;Meta AI training permission is showing up somewhere a small publisher or developer might usually skim: the commercial terms attached to using Facebook for business. The &lt;a href="https://www.facebook.com/legal/commercial_terms_preview" rel="noopener noreferrer"&gt;upcoming version of Meta's Commercial Terms&lt;/a&gt;, effective October 30, 2026, explicitly asks for permission to crawl associated websites and use their content to train covered products. Managing a Facebook Page is among the activities covered, subject to the document's separate-terms exceptions. That puts a website decision inside a relationship many businesses maintain for distribution.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/09ohGPzAVNY" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The change is upcoming. On this episode's October 16 release date, the stated effective date is still two weeks away.&lt;/li&gt;
&lt;li&gt;The preview names automated website collection, periodic updates, test credentials and training uses. It requests permission; enforceability remains unresolved.&lt;/li&gt;
&lt;li&gt;Meta told Nieman Lab that the update consolidates existing language, leaves future publisher crawling unchanged and preserves robots.txt controls.&lt;/li&gt;
&lt;li&gt;Meta documents different crawler roles. Its user-requested link fetcher has an existing robots.txt exception, which predates this terms update.&lt;/li&gt;
&lt;li&gt;A business needs someone to review contractual authority as well as someone to manage crawler rules. Those responsibilities can fall on different people.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Meta AI training permission appears in the commercial terms?
&lt;/h2&gt;

&lt;p&gt;The key paragraph is in the preview's “Licenses &amp;amp; Rights You Provide Meta” section. It authorizes Meta, or entities acting on its behalf, to use automated software to access and collect from domains, pages or URLs associated with the user's products or services, or made available through their Meta use. The wording includes scrapers, crawlers and the ability to “create test credentials.” It also allows periodic pulls of updates.&lt;/p&gt;

&lt;p&gt;The next part expressly lists uses including developing, improving, researching and training covered products, services or features. Training is written into the proposed permission. The paragraph contains no licensing-payment offer, which is the narrow point behind the episode's “FREE / TRAINING DATA” thumbnail. Copyright ownership remains a separate question; this wording establishes no ownership transfer.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.facebook.com/legal/commercial_terms" rel="noopener noreferrer"&gt;current Commercial Terms page&lt;/a&gt; already contains a license for content shared, posted or uploaded on or in connection with Meta Products. The preview puts a much more explicit website-crawling paragraph on that commercial page. That comparison gives us a useful document change to examine. It provides a limited view of an agreement stack with supplemental contracts elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.niemanlab.org/2026/10/metas-new-commercial-terms-will-allow-the-scraping-of-news-sites-legal-experts-say/" rel="noopener noreferrer"&gt;Nieman Lab's October 15 reporting&lt;/a&gt; is important here because it includes both independent legal analysis and Meta's response. The report quotes Cornell professor James Grimmelmann interpreting the language as permission for AI training on publishers' websites. That is an expert reading of the proposed terms. A disputed case would still require its own legal analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is affected by Meta's business terms?
&lt;/h2&gt;

&lt;p&gt;The opening applies to access or use for a business or commercial purpose, with exceptions where separate terms govern. Its examples extend across activities such as advertising, developing apps and managing a Page or a business-purpose Group. A company can therefore encounter this agreement through routine Facebook work, without setting out to buy an AI service.&lt;/p&gt;

&lt;p&gt;That distinction matters for small teams. The person who manages the Facebook Page may have access to the social account while someone else manages the website. The proposed permission reaches across those organizational boundaries. Reviewing only the social posts misses the part of the document discussing associated domains and content.&lt;/p&gt;

&lt;p&gt;Agencies deserve particular attention. The terms address people acting for third parties and their authority to bind those parties. They also require the rights needed to grant the relevant licenses. For a developer maintaining a client site, the useful question is who has authority to accept the platform agreement on the client's behalf, and which content rights the client actually controls.&lt;/p&gt;

&lt;p&gt;A page can contain the publisher's own writing alongside licensed photos or syndicated material. Those rights can belong to different parties. The presence of an acceptance button gives a team no automatic answer about its authority over everything displayed on the website. This is a good item for an actual contract owner, which is an exciting promotion for whichever intern still remembers the Facebook password.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meta's response and the October 30 decision
&lt;/h2&gt;

&lt;p&gt;Meta told Nieman Lab that the update consolidates language previously spread across its terms, including generative advertising terms. Its spokesperson said it would leave future publisher crawling unchanged, and that owners could still use robots.txt to control access. That response belongs beside the proposed permission whenever this story is summarized.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.facebook.com/legal/terms/ad_creative_generative_ai_terms" rel="noopener noreferrer"&gt;older supplemental generative advertising terms&lt;/a&gt; are one relevant part of that wider contractual picture. This episode does not claim to have compared every agreement Meta has used. The explicit wording on the commercial preview and the company's account of existing permissions need to be evaluated together.&lt;/p&gt;

&lt;p&gt;The updates clause says continued commercial access or use after notice binds users to the revised terms. Nieman reports that no separate business-account opt-out was being offered ahead of the deadline. The terms describe stopping commercial use as an available exit for users who disagree. Ordinary personal Facebook use falls outside the blanket claim that every user must make this business decision.&lt;/p&gt;

&lt;p&gt;The human example in Nieman's reporting is Stephen Beale, founder and editor of The Steampunk Explorer. He told the reporters he was seriously considering shutting his accounts before the deadline. His audience was entrenched on Facebook, making departure costly for an independent publication. He had reached the considering stage. The reporting establishes no completed shutdown or mass publisher departure.&lt;/p&gt;

&lt;p&gt;That distribution cost is the story's leverage. A publisher can dislike the permission request while depending on the audience reached through the account. Reading the agreement carefully makes the decision clearer. It does little to make the audience easier to move.&lt;/p&gt;

&lt;h2&gt;
  
  
  robots.txt and the different Meta crawlers
&lt;/h2&gt;

&lt;p&gt;Meta's &lt;a href="https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers" rel="noopener noreferrer"&gt;web crawler documentation&lt;/a&gt; separates several jobs. Meta-ExternalAgent is documented as collecting for foundation-model training and indexing. Meta-ExternalFetcher retrieves individual links at a user's request and has a separately documented robots.txt exception. The documentation was updated May 21, 2026, so that exception already existed before this October terms story.&lt;/p&gt;

&lt;p&gt;Here is the documentation's example for the training agent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User-agent: meta-externalagent
Allow: /
Disallow: /private/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sample allows crawling generally while disallowing &lt;code&gt;/private/&lt;/code&gt;. Copying it would communicate that particular preference. Calling it a complete website block would misdescribe the configuration. Read the paths and intended scope before adopting any example from a documentation page.&lt;/p&gt;

&lt;p&gt;The docs also say robots.txt can be cached for up to twenty-four hours. If a team changes its instructions, it should account for that documented delay when reviewing subsequent requests. The episode contains no experiment measuring real-world compliance by either crawler.&lt;/p&gt;

&lt;p&gt;For log review, the distinction between agent names is useful. A request associated with a user-directed fetch has a different documented purpose from a request associated with the training agent. A generic “Meta visited” summary throws away information needed to understand the traffic. The existing fetcher exception establishes no finding that the training crawler ignores blocking instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep contract review, crawler preferences and authentication separate
&lt;/h2&gt;

&lt;p&gt;There are several questions to assign inside the business. Who can accept the commercial terms? Which content is associated with the covered sites? Who controls the relevant rights? Which crawler preferences should the site publish, and who reviews the requests it receives?&lt;/p&gt;

&lt;p&gt;Robots rules express preferences to crawlers. Server authentication controls access to private content. A team should keep private material behind real authorization and inspect its server-side behavior independently of the robots file. The legal review concerns the permission being requested and the authority to grant it. Each layer needs an owner.&lt;/p&gt;

&lt;p&gt;The phrase “create test credentials” also deserves precise treatment. Grimmelmann told Nieman it could mean registering as a user to get past a registration wall. Meta declined to answer the report's question about paywalled material. Registration, a paid subscription and password circumvention involve different mechanisms. This episode establishes no demonstrated paywall bypass.&lt;/p&gt;

&lt;p&gt;Lawyers quoted by Nieman question how contractual authorization and blocking instructions might interact. Attorney Matt Topic says enforceability is unclear and publishers should assume the language could be enforceable. That is a reason to seek advice specific to the business before the deadline. Treating a robots edit as a complete answer to every contractual question would leave part of the review unfinished.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: NEEDS REVIEW
&lt;/h2&gt;

&lt;p&gt;I stamped this NEEDS REVIEW because website training permission is being bundled into a business distribution relationship. Meta's statement that practical crawling will remain unchanged is important. So is the explicit permission it is asking commercial users to grant. Before October 30, someone should own that decision and document which sites, rights and business accounts the review covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do the new terms apply to everyone with a personal Facebook account?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The commercial terms address business or commercial access and use, with separate-terms exceptions. Managing a Page is one example. The episode makes no blanket claim about ordinary personal use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Meta get ownership of my website?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The preview requests collection and usage permissions. It establishes no transfer of website or copyright ownership, and disputed enforceability remains unresolved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does robots.txt stop every Meta request?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meta documents different crawler roles and exceptions, including user-requested link fetching. Read the specific agent's documentation and keep authentication in place for private content. We have performed no compliance test.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the change already effective?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The preview states October 30, 2026. At the October 16 episode release, that date is still ahead. This article examines the upcoming text and the reporting available for this episode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/legal/commercial_terms_preview" rel="noopener noreferrer"&gt;Meta's upcoming Commercial Terms, effective October 30&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/legal/commercial_terms" rel="noopener noreferrer"&gt;Current Meta Commercial Terms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.niemanlab.org/2026/10/metas-new-commercial-terms-will-allow-the-scraping-of-news-sites-legal-experts-say/" rel="noopener noreferrer"&gt;Nieman Lab: the reporting, legal experts and Meta's response&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.facebook.com/documentation/sharing/webmasters/web-crawlers" rel="noopener noreferrer"&gt;Meta for Developers: Web Crawlers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.facebook.com/legal/terms/ad_creative_generative_ai_terms" rel="noopener noreferrer"&gt;Meta's supplemental generative advertising terms&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=09ohGPzAVNY" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/2026-10-16-meta-website-permission/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>meta</category>
      <category>facebook</category>
      <category>ai</category>
      <category>webcrawlers</category>
    </item>
    <item>
      <title>OpenAI Conference Room Bug, Anthropic's Scion vs. Meta's Mononoke, and Cloudflare's Yandex Bot Trace</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Thu, 15 Oct 2026 15:15:00 +0000</pubDate>
      <link>https://dev.to/axrisi/openai-conference-room-bug-anthropics-scion-vs-metas-mononoke-and-cloudflares-yandex-bot-trace-25h3</link>
      <guid>https://dev.to/axrisi/openai-conference-room-bug-anthropics-scion-vs-metas-mononoke-and-cloudflares-yandex-bot-trace-25h3</guid>
      <description>&lt;p&gt;Most people assume that planting a covert listening bug inside a frontier AI lab's executive conference room involves custom silicon or nation-state spyware. According to a federal criminal complaint unsealed in San Francisco on Tuesday, October 13, 2026, it took a $23.99 hobbyist microcontroller board wrapped in a triangle of toilet paper — and a series of prompts to a cloud chatbot that included the board's own MAC address.&lt;/p&gt;

&lt;p&gt;In today's edition of &lt;strong&gt;The Daily Diff&lt;/strong&gt;, we break down three stories where physical hardware, version control, and network infrastructure collided with the reality of how modern software and automation actually work:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The $23.99 ESP32-S3 audio recorder found behind an OpenAI executive conference room TV&lt;/strong&gt; (and how chatbot logs + a second bag left in a printer room built the FBI's timeline).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic replacing Git with an in-house version control system called Scion&lt;/strong&gt; after Claude pushed monorepo merges from 2,500 to over 30,000 per day — and why Meta Mononoke's co-creator called out Scion's "derived data" architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Radar's postmortem on the October Yandex data-center outage&lt;/strong&gt;, proving that while 93.6% of Yandex Search traffic was verified web crawlers, malicious bots on Yandex.Cloud migrated to rival hosts within hours carrying the exact same JA4 TLS fingerprint.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. The $23.99 Microcontroller in OpenAI's Executive Conference Room
&lt;/h2&gt;

&lt;p&gt;On September 30, 2026, OpenAI's technical surveillance countermeasures team conducted a sweep of an executive conference room at the company's San Francisco headquarters. According to the unsealed &lt;a href="https://www.justice.gov/opa/pr/saudi-national-arrested-installing-surreptitious-audio-recording-device-openai" rel="noopener noreferrer"&gt;U.S. Department of Justice complaint (Press Release 26-1173)&lt;/a&gt;, meetings in that room regularly covered proprietary research, product roadmaps, commercial partnerships, and government briefings.&lt;/p&gt;

&lt;p&gt;Plugged into a USB port on the back of the conference room television — and concealed inside folded toilet paper — was &lt;strong&gt;Recording Device 1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqp90y3mkrg1dz6800mhb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqp90y3mkrg1dz6800mhb.jpg" alt="DOJ complaint exhibit showing Recording Device 1 plugged into the TV USB port and the Seeed Studio 2.4G antenna"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Court filings cited by &lt;a href="https://sfstandard.com/2026/10/13/openai-engineer-arrested-alleged-bugging-executive-conference-room/" rel="noopener noreferrer"&gt;The San Francisco Standard&lt;/a&gt; identify the hardware as a &lt;strong&gt;Seeed Studio XIAO ESP32-S3 Sense&lt;/strong&gt;, a thumb-sized development board equipped with a digital microphone, microSD card slot, and 2.4 GHz Wi-Fi/BLE antenna that retails on Amazon for $23.99. OpenAI determined the board had been installed around September 28 and that its onboard storage was encrypted.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the Investigation Connected the Dots
&lt;/h3&gt;

&lt;p&gt;According to the criminal complaint and FBI affidavit, prosecutors traced the device to 35-year-old Abdulrahman Alfozan, an engineer who joined OpenAI's product team in July 2025 after five years as a senior systems engineer at Meta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Internal workspace queries:&lt;/strong&gt; Prior to September 28, the complaint alleges Alfozan used an internal productivity tool to query OpenAI building addresses, conference room capacities, room calendars, and the locations of leadership and external partner meetings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chatbot prompts with hardware identifiers:&lt;/strong&gt; Between September 24 and September 30, a chatbot account associated with Alfozan's spouse — which shared identifiers and attributes with his own account — submitted prompts asking how to &lt;em&gt;"build a continuous audio recorder,"&lt;/em&gt; &lt;em&gt;"customize Wi-Fi connectivity,"&lt;/em&gt; &lt;em&gt;"improve audio and live listening,"&lt;/em&gt; and &lt;em&gt;"encrypt the SD card."&lt;/em&gt; On September 27 and 28, that same account submitted prompts referencing the specific device later recovered, including its custom header and &lt;strong&gt;unique MAC address&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI forensic analysis &amp;amp; the motion camera:&lt;/strong&gt; On X, &lt;a href="https://x.com/OpenAINewsroom/status/2110095403198849132" rel="noopener noreferrer"&gt;@OpenAINewsroom stated&lt;/a&gt; that investigators used OpenAI's own models to analyze forensic images of the device's storage, understand how it operated, and identify who planted it. On October 5, a motion-activated camera placed behind the conference room television captured Alfozan entering the room and looking behind the screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu4172bx8wt4wbg748nz9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu4172bx8wt4wbg748nz9.jpg" alt="DOJ complaint exhibit showing Oct 5 motion-camera capture behind the conference room television"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Unattended Bag in the Printer Room
&lt;/h3&gt;

&lt;p&gt;The most surreal detail in the FBI affidavit happened that same day, October 5. Prosecutors allege Alfozan left a bag unattended in a printer room inside an OpenAI building. When security personnel opened the bag to identify the owner, they found his wallet, his ID, and &lt;strong&gt;Recording Device 2&lt;/strong&gt; — a second customized microcontroller recorder similar to the first.&lt;/p&gt;

&lt;p&gt;Security confiscated the recording device. When Alfozan retrieved the bag on October 6, he filed an internal report stating that his credit card, approximately $500 in cash, two pairs of AirPods, headphones, sunglasses, and a power bank had been stolen from the bag — while making no mention of the missing recording device.&lt;/p&gt;

&lt;p&gt;Alfozan was arrested on Friday, October 9, and charged under &lt;strong&gt;18 U.S.C. § 2511&lt;/strong&gt; (intercepting oral communications), which carries a maximum penalty of five years in federal prison and a $250,000 fine. OpenAI stated it found no indication that model weights, source code, or customer data were accessed. On Wednesday, October 14, Alfozan's defense attorney, William Pernik, &lt;a href="https://sfstandard.com/2026/10/14/abdulrahman-alfozan-who-openai-engineer-accused-hiding-recording-device/" rel="noopener noreferrer"&gt;pushed back against the government's framing&lt;/a&gt;, stating that the allegations "appear wholly out of character for him," noting that he is charged under a recording statute rather than espionage or trade-secret theft, and reminding the public that an accusation is not a finding of guilt. A detention hearing is set for October 19.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Why Anthropic Replaced Git With "Scion" at 30,000 Merges a Day
&lt;/h2&gt;

&lt;p&gt;Across town at Anthropic, the bottleneck wasn't physical security — it was Git itself.&lt;/p&gt;

&lt;p&gt;On October 13, Anthropic's engineering team published &lt;a href="https://www.anthropic.com/engineering/redesigning-source-control" rel="noopener noreferrer"&gt;Redesigning source control at Anthropic&lt;/a&gt;, detailing how autonomous coding loops and internal agents pushed their monorepo past the limits of distributed version control:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Merge velocity (12× in 4 months):&lt;/strong&gt; In May 2026, Anthropic averaged roughly &lt;strong&gt;2,500 merged changes per day&lt;/strong&gt;. By September 2026, daily merges exceeded &lt;strong&gt;30,000 per day&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkout bandwidth:&lt;/strong&gt; The &lt;code&gt;main&lt;/code&gt; branch history approached &lt;strong&gt;100 GB&lt;/strong&gt; (with a compressed working copy over &lt;strong&gt;25 GB&lt;/strong&gt;), while CI and research jobs executed &lt;strong&gt;25 million checkouts per day&lt;/strong&gt; — equivalent to &lt;strong&gt;600 petabytes per day&lt;/strong&gt; if fetched naively. Even with hundreds of internal Git mirrors and blob-storage seeds, mirror disks and memory saturated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2gqxf1lshnqmxtnefmap.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2gqxf1lshnqmxtnefmap.jpg" alt="Anthropic monorepo merged changes per day from January to September 2026"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How Scion Works
&lt;/h3&gt;

&lt;p&gt;A team of &lt;strong&gt;seven engineers&lt;/strong&gt; built an in-house version control system called &lt;strong&gt;Scion&lt;/strong&gt; (alongside an internal code review system called &lt;strong&gt;Antique&lt;/strong&gt;) and migrated the entire monorepo off Git in &lt;strong&gt;five months&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Always-online client/server asymmetry:&lt;/strong&gt; Because almost all clients are cloud CI runners and agent sandboxes that are online by definition, Scion drops Git's local packfiles and full-history clones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three-tier object streaming:&lt;/strong&gt; The CLI (&lt;code&gt;scn&lt;/code&gt;) talks over a local socket to a node-level &lt;code&gt;scion-daemon&lt;/code&gt;, which pulls missing trees and blobs from regional in-memory &lt;code&gt;scion-cache&lt;/code&gt; servers, backed by &lt;code&gt;scion-server&lt;/code&gt;, Spanner, and cloud blob storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;99%+ cache hit rate &amp;amp; 200× smaller footprint:&lt;/strong&gt; Each tier maintains a &amp;gt;99% cache hit rate, cutting source-control CPU and memory infrastructure by &lt;strong&gt;200×&lt;/strong&gt; compared to their Git mirror fleet and freeing &lt;strong&gt;25% of total CI CPU capacity&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agents building &amp;amp; watching agent infrastructure:&lt;/strong&gt; Anthropic reported that an early internal snapshot of &lt;strong&gt;Claude Mythos Preview&lt;/strong&gt; rewrote their handwritten Git-to-Scion ingestion prototype to use &lt;strong&gt;20× less memory and run 4× faster&lt;/strong&gt;, while dedicated &lt;strong&gt;Claude Tag "superfans"&lt;/strong&gt; sit in Slack channels monitoring telemetry for individual components (&lt;code&gt;scion-daemon&lt;/code&gt;, &lt;code&gt;scion-cache&lt;/code&gt;, and the merge queue).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The "Derived Data" Controversy: Scion vs. Meta's Mononoke
&lt;/h3&gt;

&lt;p&gt;In explaining how Scion handles &lt;code&gt;git blame&lt;/code&gt; and file history without storing full trees on every commit, Anthropic wrote that Scion records minimal write-ahead-log &lt;strong&gt;changesets&lt;/strong&gt; (only the files changed relative to the first parent) and computes blame, path history, and skip lists recursively through a generic mechanism they call &lt;strong&gt;"derived data."&lt;/strong&gt; The post credited Google's Piper and Meta's Sapling for general &lt;em&gt;"hard-won lessons,"&lt;/em&gt; without mentioning &lt;strong&gt;Mononoke&lt;/strong&gt; once.&lt;/p&gt;

&lt;p&gt;On October 14, &lt;strong&gt;Rain&lt;/strong&gt; (&lt;a href="https://sunshowers.io/posts/anthropic-mononoke/" rel="noopener noreferrer"&gt;sunshowers.io&lt;/a&gt;), one of the engineers who built Meta's open-source &lt;a href="https://github.com/facebook/sapling/tree/main/eden/mononoke" rel="noopener noreferrer"&gt;Mononoke source control server&lt;/a&gt; in 2017–2018, placed Anthropic's paragraph directly alongside Rain's own 2022 Oxide engineering write-up describing Mononoke:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fluvz68bgxzpou3fy89w1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fluvz68bgxzpou3fy89w1.jpg" alt="Anthropic's 2026 description of Scion derived data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsymmendlauor8chrc27z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsymmendlauor8chrc27z.jpg" alt="Rain's 2022 description of Mononoke derived data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store lightweight parent-relative changesets ("Bonsai changesets" in Mononoke; "changesets" in Scion).&lt;/li&gt;
&lt;li&gt;Use the exact phrase &lt;strong&gt;"derived data"&lt;/strong&gt; for secondary Merkle/blame indices computed recursively from parent changesets outside the critical write path.&lt;/li&gt;
&lt;li&gt;Turn &lt;code&gt;blame&lt;/code&gt; from an $O(\text{commits in repo})$ traversal into $O(\text{commits touching file})$.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because Mononoke is open source inside the &lt;code&gt;facebook/sapling&lt;/code&gt; repository, it sits directly in frontier LLM training corpora. As Rain pointed out, when you paste Scion's architecture into &lt;strong&gt;Claude Opus 5.5&lt;/strong&gt; or &lt;strong&gt;GPT-6 Astra&lt;/strong&gt; and ask about prior art, both models immediately identify &lt;strong&gt;Meta's Mononoke&lt;/strong&gt;. Using open-source architecture is good engineering; omitting attribution when an LLM reconstructs it from training data is the problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Cloudflare Radar: Did the Yandex Outage Actually Stop Russian Botnets?
&lt;/h2&gt;

&lt;p&gt;Between October 7 and October 11, 2026, reported drone strikes hit three Yandex data-center facilities in Russia (Sasovo, Kaluga, and Vladimir). By October 11, HTTP traffic on &lt;strong&gt;Yandex Search (&lt;code&gt;AS13238&lt;/code&gt;)&lt;/strong&gt; plunged &lt;strong&gt;99% below baseline&lt;/strong&gt;, and &lt;strong&gt;Yandex.Cloud (&lt;code&gt;AS200350&lt;/code&gt;)&lt;/strong&gt; dropped &lt;strong&gt;90%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Social media threads quickly declared that Russian bot farms and influence operations had been knocked offline because aggregate automated traffic from Russia fell ~8%. On October 14, Cloudflare published &lt;a href="https://blog.cloudflare.com/yandex-outage/" rel="noopener noreferrer"&gt;Yandex outage: data shows that instead of going dark, malicious bots went on the move&lt;/a&gt;, demonstrating why raw ASN volume is a terrible proxy for threat intelligence:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feop1mboqumiyoyy6kaqu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feop1mboqumiyoyy6kaqu.jpg" alt="Cloudflare Radar chart showing Yandex AS13238 and AS200350 traffic collapse on October 11"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;AS13238&lt;/code&gt; (Yandex Search) was 93.6% legitimate search crawlers:&lt;/strong&gt; Of the 99.5% automated traffic on Yandex's search ASN, 78.1% was verified &lt;code&gt;YandexBot&lt;/code&gt;, 11.5% was &lt;code&gt;YandexRenderResourcesBot&lt;/code&gt;, and 1.9% was &lt;code&gt;YandexImages&lt;/code&gt;. News and publishing sites saw a 44% drop in Yandex traffic simply because search indexing paused.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;AS200350&lt;/code&gt; (Yandex.Cloud) malicious automation relocated within hours:&lt;/strong&gt; While opportunistic WordPress plugin scanning (−90%) and generic vulnerability probing (−93%) dipped on Yandex.Cloud, high-volume targeted bots never stopped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The JA4 TLS Fingerprint Match:&lt;/strong&gt; On a heavily targeted gambling customer, bot requests from &lt;code&gt;AS200350&lt;/code&gt; dropped to zero immediately after the October 8 disruption — and simultaneously appeared from alternative Russian hosting providers (&lt;strong&gt;Selectel&lt;/strong&gt; and &lt;strong&gt;Radist&lt;/strong&gt;) carrying the &lt;strong&gt;exact same JA4 TLS client fingerprint&lt;/strong&gt;, identical uncommon request paths/headers, and identical custom &lt;code&gt;User-Agent&lt;/code&gt; strings. Total Russian bot volume against that sector actually rose &lt;strong&gt;+1.4%&lt;/strong&gt; (from 167.7M to 170.1M requests) over the week.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Verdict: &lt;code&gt;REVERT&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On physical &amp;amp; operational security:&lt;/strong&gt; Pasting your covert recording board's unique MAC address and SD-card encryption questions into a cloud chatbot — and then filing a lost-property claim for the $500 cash in the bag where security found your second recorder — is an automatic &lt;strong&gt;REVERT&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On agent-designed systems:&lt;/strong&gt; Building Scion in five months with a seven-person team is genuinely impressive systems engineering, and crediting the open-source &lt;strong&gt;Mononoke&lt;/strong&gt; team whose "derived data" architecture sits in your model's training set costs zero tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is the worst Git monorepo bottleneck you have hit at work? Let me know in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=QmXXXykihoc" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/2026-10-15-openai-conference-bug/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>git</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Gemini 4 Argon API and Android NDK #2260: Google at two speeds</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Wed, 14 Oct 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/axrisi/gemini-4-argon-api-and-android-ndk-2260-google-at-two-speeds-3oom</link>
      <guid>https://dev.to/axrisi/gemini-4-argon-api-and-android-ndk-2260-google-at-two-speeds-3oom</guid>
      <description>&lt;p&gt;Software engineering at Google is currently moving at two distinct speeds for outside developers. Inside Google, teams report using &lt;a href="https://deepmind.google/models/gemini/" rel="noopener noreferrer"&gt;Gemini 4 Argon&lt;/a&gt; to refactor millions of lines of Chromium and optimize Python repositories overnight, and on October 13 Google opened the &lt;code&gt;gemini-4-argon&lt;/code&gt; endpoint on the paid Gemini API. At the same time, an &lt;a href="https://github.com/android/ndk/issues/2260" rel="noopener noreferrer"&gt;Android NDK bug report (#2260)&lt;/a&gt; showed that developers debugging September's Android 17 update on Pixel phones had to pull &lt;code&gt;libc.so&lt;/code&gt; off the device and read ARM64 disassembly because the public Android Open Source Project (AOSP) branch still reflects a March snapshot.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/c8gws-9SAcU" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Android 17 Pixel &lt;code&gt;wcscspn()&lt;/code&gt; and &lt;code&gt;wcspbrk()&lt;/code&gt; bug&lt;/strong&gt;: On September 2026 Android 17 builds (&lt;code&gt;CP3A.260905.009&lt;/code&gt;) tested on Pixel 7 and Pixel 8a, Bionic's wide-character complement scan stops at the first character &lt;code&gt;&amp;gt;= U+0100&lt;/code&gt; whenever the reject set has two or more characters &lt;code&gt;&amp;lt; U+0100&lt;/code&gt;. That produces false matches across 1,111,808 Unicode code points (&lt;code&gt;U+0100&lt;/code&gt; to &lt;code&gt;U+10FFFF&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disassembly required to diagnose open-source Android&lt;/strong&gt;: June's public &lt;code&gt;android17-release&lt;/code&gt; branch uses a working loop from &lt;code&gt;llvm-libc&lt;/code&gt;. Because Google's &lt;a href="https://source.android.com/docs/whatsnew/site-updates?year=2026#aosp-changes" rel="noopener noreferrer"&gt;2026 AOSP release policy&lt;/a&gt; publishes source code twice a year in Q2 and Q4, the September Pixel binary shipped months ahead of its corresponding public source drop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The unit test that asserted the bug&lt;/strong&gt;: When Google's Bionic maintainer checked the internal tree, he discovered an existing test at &lt;code&gt;bionic/tests/wchar_test.cpp:1475&lt;/code&gt; (&lt;code&gt;wcscspn(L"he\ufffelo", L"lo")&lt;/code&gt;) that asserted the buggy return value &lt;code&gt;2u&lt;/code&gt; instead of &lt;code&gt;3u&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 4 Argon general availability and pricing&lt;/strong&gt;: On &lt;a href="https://ai.google.dev/gemini-api/docs/changelog" rel="noopener noreferrer"&gt;October 13, 2026&lt;/a&gt;, Google released &lt;code&gt;gemini-4-argon&lt;/code&gt; to general availability on the paid Gemini API and for Google AI Ultra subscribers. Introductory API pricing of $2.00 per 1M input tokens and $10.00 per 1M output tokens runs through November 30, 2026, then doubles to $4.00 input and $20.00 output on December 1, 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human code review remains mandatory&lt;/strong&gt;: In Google Cloud's &lt;a href="https://developers.googleblog.com/optimizing-a-200000-line-python-codebase-overnight-with-gemini-4-argon/" rel="noopener noreferrer"&gt;11-hour overnight optimization run&lt;/a&gt; on the 205,000-line &lt;code&gt;google/adk-python&lt;/code&gt; repository, human maintainers shipped two of Argon's six proposed optimizations and rejected four during code review.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How one emoji broke Android Bionic's wide-character scan in Android NDK #2260
&lt;/h2&gt;

&lt;p&gt;The regression surfaced in a place nobody expects to stress-test system libraries: &lt;a href="https://github.com/vpinball/libwinevbs/pull/41" rel="noopener noreferrer"&gt;Visual Pinball on Android&lt;/a&gt;. Visual Pinball uses &lt;code&gt;libwinevbs&lt;/code&gt;, a standalone C port of Wine's VBScript engine, to run table scripts. After the September 2026 Android 17 update (&lt;code&gt;CP3A.260905.009&lt;/code&gt;, security patch &lt;code&gt;2026-09-05&lt;/code&gt;) landed on Pixel 7 and Pixel 8a devices, pinball tables began failing to load whenever a VBScript comment line contained an emoji.&lt;/p&gt;

&lt;p&gt;The VBScript lexer called &lt;code&gt;wcspbrk(ptr, L"\n\r")&lt;/code&gt; to scan forward to the end of a comment line. Instead of returning a pointer to the newline or carriage return, &lt;code&gt;wcspbrk()&lt;/code&gt; returned the position of the emoji inside the comment, causing the parser to stop mid-comment and report an invalid character. In the same library, &lt;code&gt;FileSystem.MoveFolder&lt;/code&gt; used &lt;code&gt;wcspbrk(src, L"*?&amp;gt;&amp;lt;")&lt;/code&gt; to check for wildcard characters and treated every file path containing a character at or above &lt;code&gt;U+0100&lt;/code&gt; as a wildcard pattern.&lt;/p&gt;

&lt;p&gt;On October 12, developer &lt;code&gt;francisdb&lt;/code&gt; filed &lt;a href="https://github.com/android/ndk/issues/2260" rel="noopener noreferrer"&gt;Android NDK issue #2260&lt;/a&gt; with a minimal C reproducer built with &lt;code&gt;aarch64-linux-android30-clang&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;wchar.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;wchar_t&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sc"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x1F680&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'b'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'x'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'\n'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"wcscspn(s, L&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;n&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;) = %zu (expected 4)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wcscspn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;L"x&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"wcspbrk(s, L&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;n&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;) = index %ld (expected 4)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;wcspbrk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;L"x&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"wcsspn(s, L&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s"&gt;U0001F680&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;) = %zu (expected 2)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wcsspn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;L"a\U0001F680"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In C, &lt;code&gt;wcscspn(s, reject)&lt;/code&gt; counts how many wide characters appear in &lt;code&gt;s&lt;/code&gt; before the first character that belongs to &lt;code&gt;reject&lt;/code&gt;. In the array above, &lt;code&gt;'a'&lt;/code&gt; is at index 0, &lt;code&gt;0x1F680&lt;/code&gt; (the rocket emoji) is at index 1, &lt;code&gt;0x100&lt;/code&gt; (&lt;code&gt;Ā&lt;/code&gt;) is at index 2, &lt;code&gt;'b'&lt;/code&gt; is at index 3, and &lt;code&gt;'x'&lt;/code&gt; — the first character actually present in &lt;code&gt;L"x\n"&lt;/code&gt; — sits at index 4.&lt;/p&gt;

&lt;p&gt;On an Android 16 Nothing Phone 2 (&lt;code&gt;BP2A.250605.031.A3&lt;/code&gt;), the program prints &lt;code&gt;4&lt;/code&gt;. On the Pixel 7 and Pixel 8a running September's Android 17 build, both &lt;code&gt;wcscspn()&lt;/code&gt; and &lt;code&gt;wcspbrk()&lt;/code&gt; return index &lt;code&gt;1&lt;/code&gt;. A full sweep across Unicode code points from &lt;code&gt;U+0001&lt;/code&gt; to &lt;code&gt;U+10FFFF&lt;/code&gt; (skipping surrogates and the two delimiter characters) showed &lt;code&gt;wcscspn()&lt;/code&gt; returning &lt;code&gt;0&lt;/code&gt; instead of &lt;code&gt;1&lt;/code&gt; for all &lt;strong&gt;1,111,808 code points&lt;/strong&gt; from &lt;code&gt;U+0100&lt;/code&gt; through &lt;code&gt;U+10FFFF&lt;/code&gt;. Any Latin Extended, Greek, Cyrillic, CJK, or emoji character triggers a false match whenever the reject set contains two or more characters that are all below &lt;code&gt;U+0100&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the developer had to disassemble &lt;code&gt;/apex/com.android.runtime/lib64/bionic/libc.so&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;When a standard C library function misbehaves on an open-source operating system, the normal debugging workflow is to open the repository and inspect the implementation. When &lt;code&gt;francisdb&lt;/code&gt; checked the public &lt;code&gt;android17-release&lt;/code&gt; sources (&lt;code&gt;android-17.0.0_r1&lt;/code&gt;, published in June 2026), &lt;code&gt;wcscspn()&lt;/code&gt; and &lt;code&gt;wcspbrk()&lt;/code&gt; were built from &lt;code&gt;external/llvm-libc&lt;/code&gt; as a straightforward nested loop over &lt;code&gt;wchar_t&lt;/code&gt;. That source code did not exhibit the bug.&lt;/p&gt;

&lt;p&gt;Because the source code corresponding to the September Pixel binary was absent from the public repository, &lt;code&gt;francisdb&lt;/code&gt; extracted &lt;code&gt;/apex/com.android.runtime/lib64/bionic/libc.so&lt;/code&gt; from the device and disassembled &lt;code&gt;wcscspn&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foihfptxkgqhqtebptnh5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foihfptxkgqhqtebptnh5.jpg" alt="Android NDK issue 2260 disassembly of Bionic libc.so" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The disassembled ARM64 instructions revealed three execution paths chosen by the contents of the reject set:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single-character reject set&lt;/strong&gt;: runs a direct comparison loop and returns the right index.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reject set containing any character &lt;code&gt;&amp;gt;= 0x100&lt;/code&gt;&lt;/strong&gt;: falls back to calling &lt;code&gt;wcschr()&lt;/code&gt; for each character in the input string and returns the right index.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reject set with two or more characters all &lt;code&gt;&amp;lt; 0x100&lt;/code&gt;&lt;/strong&gt;: populates a 256-byte &lt;code&gt;bool&lt;/code&gt; lookup table on the stack and scans the input string with the following loop:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight armasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;a2564&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;  &lt;span class="nb"&gt;ldrb&lt;/span&gt;  &lt;span class="nv"&gt;w8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x9&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;        &lt;span class="c"&gt;; table[c]&lt;/span&gt;
&lt;span class="nl"&gt;a2568&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;  &lt;span class="nb"&gt;tbnz&lt;/span&gt;  &lt;span class="nv"&gt;w8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;a2578&lt;/span&gt;       &lt;span class="c"&gt;; in set -&amp;gt; stop (correct)&lt;/span&gt;
&lt;span class="nl"&gt;a256c&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;  &lt;span class="nb"&gt;ldr&lt;/span&gt;   &lt;span class="nv"&gt;w8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x22&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="o"&gt;]!&lt;/span&gt;    &lt;span class="c"&gt;; next character&lt;/span&gt;
&lt;span class="nl"&gt;a2570&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;  &lt;span class="nb"&gt;cmp&lt;/span&gt;   &lt;span class="nv"&gt;w8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="mh"&gt;0x100&lt;/span&gt;
&lt;span class="nl"&gt;a2574&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;  &lt;span class="nb"&gt;b.lo&lt;/span&gt;  &lt;span class="nv"&gt;a2564&lt;/span&gt;               &lt;span class="c"&gt;; c &amp;lt; 0x100 -&amp;gt; keep scanning&lt;/span&gt;
&lt;span class="nl"&gt;a2578&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;  &lt;span class="err"&gt;...&lt;/span&gt;                       &lt;span class="c"&gt;; c &amp;gt;= 0x100 -&amp;gt; STOP, reported as a match&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at instructions &lt;code&gt;a2570&lt;/code&gt; and &lt;code&gt;a2574&lt;/code&gt;. After loading the next 32-bit &lt;code&gt;wchar_t&lt;/code&gt; into &lt;code&gt;w8&lt;/code&gt;, the loop compares &lt;code&gt;w8&lt;/code&gt; against &lt;code&gt;0x100&lt;/code&gt; (256 decimal) and branches back to &lt;code&gt;a2564&lt;/code&gt; only when the character is unsigned-lower (&lt;code&gt;b.lo&lt;/code&gt;). When &lt;code&gt;w8 &amp;gt;= 0x100&lt;/code&gt;, execution falls through to &lt;code&gt;a2578&lt;/code&gt; and terminates the scan.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;wcsspn(s, accept)&lt;/code&gt; — which counts characters that &lt;em&gt;belong&lt;/em&gt; to an all-&lt;code&gt;&amp;lt; 0x100&lt;/code&gt; accept set — stopping as soon as a character &lt;code&gt;&amp;gt;= 0x100&lt;/code&gt; appears is the right behavior, because a wide character above &lt;code&gt;0xFF&lt;/code&gt; cannot be inside a lookup table of characters below &lt;code&gt;0x100&lt;/code&gt;. For the complement function &lt;code&gt;wcscspn(s, reject)&lt;/code&gt;, the exact opposite holds: a character &lt;code&gt;&amp;gt;= 0x100&lt;/code&gt; cannot be in an all-&lt;code&gt;&amp;lt; 0x100&lt;/code&gt; reject set, so the scan must continue past it. Because &lt;code&gt;wcspbrk()&lt;/code&gt; is a thin wrapper around &lt;code&gt;wcscspn()&lt;/code&gt;, both functions inherited the bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  The internal Bionic unit test that expected &lt;code&gt;2u&lt;/code&gt; instead of &lt;code&gt;3u&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Three hours after the issue was opened, Google Bionic maintainer Elliott Hughes (&lt;code&gt;enh-google&lt;/code&gt;) confirmed the diagnosis:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"yeah, that all sounds correct, and seems to still be an issue at ToT. (i was going to say 'you know you can just look at the source?', but android-latest-release seems to still be too old to have any of these changes from april :-( )"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thirty-five minutes later, Hughes posted a second comment after checking the internal test suite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ RUN      ] wchar.wcscspn
bionic/tests/wchar_test.cpp:(1475) Failure in test wchar.wcscspn
Expected equality of these values:
  2u
    Which is: 2
  wcscspn(L"he\ufffelo", L"lo")
    Which is: 3
wchar.wcscspn exited with exitcode 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the wide string &lt;code&gt;L"he\ufffelo"&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;index &lt;code&gt;0&lt;/code&gt; is &lt;code&gt;'h'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;index &lt;code&gt;1&lt;/code&gt; is &lt;code&gt;'e'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;index &lt;code&gt;2&lt;/code&gt; is &lt;code&gt;\ufffe&lt;/code&gt; (&lt;code&gt;&amp;gt;= 0x100&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;index &lt;code&gt;3&lt;/code&gt; is &lt;code&gt;'l'&lt;/code&gt; (the first character matching &lt;code&gt;L"lo"&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the table-lookup optimization was written in April, the accompanying unit test at &lt;code&gt;wchar_test.cpp:1475&lt;/code&gt; asserted &lt;code&gt;2u&lt;/code&gt; — the index where the broken loop stopped on &lt;code&gt;\ufffe&lt;/code&gt; — rather than &lt;code&gt;3u&lt;/code&gt;, where &lt;code&gt;'l'&lt;/code&gt; actually sits. Once the bug in &lt;code&gt;wcscspn()&lt;/code&gt; was fixed locally, the unit test failed because the test itself had codified the bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  AOSP source code schedule in 2026: Q2 and Q4 drops vs. shipped Pixel builds
&lt;/h2&gt;

&lt;p&gt;Commenters on GitHub and in the &lt;a href="https://news.ycombinator.com/item?id=50083130" rel="noopener noreferrer"&gt;Hacker News thread&lt;/a&gt; raised a broader question: why was code written in April and shipped to Pixel phones in September still missing from AOSP in mid-October?&lt;/p&gt;

&lt;p&gt;Google collaborator &lt;code&gt;pirama-arumuga-nainar&lt;/code&gt; pointed to the official &lt;a href="https://source.android.com/docs/whatsnew/site-updates?year=2026#aosp-changes" rel="noopener noreferrer"&gt;Android Open Source Project site updates page&lt;/a&gt;, which carries this notice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Effective in 2026, to align with our trunk stable development model and ensure platform stability for the ecosystem, we will publish source code to AOSP in Q2 and Q4. For building and contributing to AOSP, use &lt;code&gt;android-latest-release&lt;/code&gt;."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AOSP remains open source; Google has not made Android closed source. However, the publication cadence creates a multi-month gap between shipped quarterly Pixel releases and public branches. When we inspected the public &lt;a href="https://android.googlesource.com/platform/bionic/+log/refs/heads/android17-release" rel="noopener noreferrer"&gt;&lt;code&gt;refs/heads/android17-release&lt;/code&gt; commit log in &lt;code&gt;platform/bionic&lt;/code&gt;&lt;/a&gt; on October 14, 2026, the top commit (&lt;code&gt;06356e41c5ed7b12220b24c05ba4fdb873b126a7&lt;/code&gt;, &lt;code&gt;Snap for 15110852 ... to 26Q2-release&lt;/code&gt;) was dated &lt;strong&gt;March 28, 2026&lt;/strong&gt;, and &lt;code&gt;tests/wchar_test.cpp&lt;/code&gt; on that branch contained only four ASCII assertions for &lt;code&gt;wcscspn&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As Google engineer Maciej Żenczykowski (&lt;code&gt;zenczykowski&lt;/code&gt;) wrote in the issue thread:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Yes, but where is the source code for Android 17 QPR1 which is what is actually running on Pixel and has been stable for over a month..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Until the Q4 source drop lands, outside developers hitting regressions in September's Android 17 QPR1 binaries have to diagnose them from compiled &lt;code&gt;.so&lt;/code&gt; files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inside Google: Chrome refactoring and the 11-hour overnight ADK run with Gemini 4 Argon
&lt;/h2&gt;

&lt;p&gt;While public AOSP drops follow a twice-yearly schedule, Google's internal teams are publishing case studies on how &lt;a href="https://deepmind.google/models/gemini/" rel="noopener noreferrer"&gt;Gemini 4 Argon&lt;/a&gt; is accelerating internal and open-source codebases.&lt;/p&gt;

&lt;p&gt;On the DeepMind Gemini 4 Argon page, Google reports that Argon helped the Chrome team separate core webpage handling from a roughly &lt;strong&gt;6-million-line legacy folder&lt;/strong&gt; of browser features inside Chromium's &lt;strong&gt;40-million-line codebase&lt;/strong&gt;, piping clean changes across hundreds of files and completing months of architectural refactoring work in weeks. Those numbers are vendor-reported internal claims, and the promised user-facing benefit — moving live webpages between tabs, side panels, and floating windows without reloading — is described as a future unlock.&lt;/p&gt;

&lt;p&gt;A more detailed engineering breakdown arrived on October 13 on the Google for Developers Blog: &lt;a href="https://developers.googleblog.com/optimizing-a-200000-line-python-codebase-overnight-with-gemini-4-argon/" rel="noopener noreferrer"&gt;Optimizing a 200,000-line Python codebase overnight with Gemini 4 Argon&lt;/a&gt;. Google Cloud engineers George Weale, Bo Yang, and Andrew Biernat ran Argon unattended for &lt;strong&gt;11 hours overnight&lt;/strong&gt; in Google Antigravity's &lt;code&gt;/goal&lt;/code&gt; mode against &lt;a href="https://github.com/google/adk-python" rel="noopener noreferrer"&gt;&lt;code&gt;google/adk-python&lt;/code&gt;&lt;/a&gt;, which spans roughly 205,000 lines of Python across nearly 800 files and 16,892 unit tests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjherq6r4a80g6mehq4ql.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjherq6r4a80g6mehq4ql.jpg" alt="ADK overnight optimization proposals shipped vs cut in code review" width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most instructive part of that post is what happened during human code review the next morning. Argon opened a pull request proposing &lt;strong&gt;six optimizations across 32 files&lt;/strong&gt;. The human maintainers &lt;strong&gt;shipped two and rejected four&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Optimization proposed by Argon&lt;/th&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Reason from human code review / internal tests&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Filter in-memory session events before deep-copying&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Shipped&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cut pre-model session overhead by ~40% in 50- and 150-turn sessions (158-turn benchmark dropped from 65.6 s to 56.1 s).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lazy-load heavy modules (&lt;code&gt;import google.adk&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Shipped (modified)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deleting top-level imports directly passed all 16,892 open-source tests, yet &lt;strong&gt;broke 25 internal Google test targets&lt;/strong&gt; that patched those module attributes. Rewritten with lazy module accessors (&lt;code&gt;-21%&lt;/code&gt; cold import time).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-agent event cache using weak references&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cut&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sped up a synthetic benchmark by 17%, yet relied on a weak memory reference that could return stale data across sessions if Python reused a memory address after garbage collection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenTelemetry tracer private-attribute check&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cut&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Read a private attribute on OpenTelemetry's tracer implementation that could break silently on a minor library upgrade.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversation-history formatting rewrite&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cut&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reduced readability on a core code path without improving end-to-end latency on the team's independent holdout benchmark.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflow event replay lookup index&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cut&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Added state-tracking complexity that only helped synthetic replay tests.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As the Google Cloud authors summarized the workflow: &lt;em&gt;"the agent explores, the maintainer subtracts."&lt;/em&gt; Even when a frontier model runs all 16,892 unit tests and audits its own diff, human maintainers still had to reject two-thirds of its optimization ideas and catch 25 broken internal test targets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemini 4 Argon API pricing, tier limits, and the December 1 price increase
&lt;/h2&gt;

&lt;p&gt;When we covered Gemini 4 Argon's initial announcement on October 1 (&lt;code&gt;2026-10-01-gemini-4-argon&lt;/code&gt;), we stamped it &lt;strong&gt;NEEDS REVIEW&lt;/strong&gt; because general developers and consumers could not access the model outside the Fairwind cyber-defense program.&lt;/p&gt;

&lt;p&gt;On &lt;strong&gt;October 13, 2026&lt;/strong&gt;, the &lt;a href="https://ai.google.dev/gemini-api/docs/changelog" rel="noopener noreferrer"&gt;Gemini API Release Notes&lt;/a&gt; marked &lt;code&gt;gemini-4-argon&lt;/code&gt; generally available (GA), alongside a newly published &lt;a href="https://deepmind.google/models/model-cards/gemini-4-argon/" rel="noopener noreferrer"&gt;October 13 Model Card&lt;/a&gt;. However, developers checking where they can use Argon will immediately notice a discrepancy between Google's marketing page and its developer documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On &lt;a href="https://deepmind.google/models/gemini/" rel="noopener noreferrer"&gt;deepmind.google/models/gemini/&lt;/a&gt;, the heading reads: &lt;em&gt;"Gemini 4 Argon is available today for Google AI Pro and Ultra subscribers."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;On the &lt;a href="https://ai.google.dev/gemini-api/docs/pricing#gemini-4-argon" rel="noopener noreferrer"&gt;Gemini Developer API Pricing page&lt;/a&gt; and the &lt;a href="https://ai.google.dev/gemini-api/docs/google-ai-plans" rel="noopener noreferrer"&gt;Google AI plans page for AI Studio&lt;/a&gt; (both updated October 13, 2026), a callout box states: &lt;strong&gt;"Note: Gemini 4 Argon is not available on the Free tier or on the Google AI Pro plan."&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgjnbjqqv8epguy9l8jxa.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgjnbjqqv8epguy9l8jxa.jpg" alt="Gemini 4 Argon API pricing table and AI Pro exclusion note" width="800" height="950"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Google AI Studio and Google Antigravity, interactive developer access requires &lt;strong&gt;Google AI Ultra&lt;/strong&gt; or a &lt;strong&gt;Paid Tier Gemini API key&lt;/strong&gt; with Cloud Billing enabled. And the API pricing table adds an explicit expiration date to Argon's launch rates:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gemini API Tier (&lt;code&gt;gemini-4-argon&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Through Nov 30, 2026 (per 1M tokens)&lt;/th&gt;
&lt;th&gt;Starting Dec 1, 2026 (per 1M tokens)&lt;/th&gt;
&lt;th&gt;Caching &amp;amp; Output Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard (Paid)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$2.00 input / $10.00 output&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$4.00 input / $20.00 output&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Output includes thinking tokens. Implicit caching only ($0.10 -&amp;gt; $0.20); explicit &lt;code&gt;cachedContents&lt;/code&gt; unsupported.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Batch / Flex&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$1.00 input / $5.00 output&lt;/td&gt;
&lt;td&gt;$2.00 input / $10.00 output&lt;/td&gt;
&lt;td&gt;50% discount for asynchronous / flexible workloads.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Priority&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$3.60 input / $18.00 output&lt;/td&gt;
&lt;td&gt;$7.20 input / $36.00 output&lt;/td&gt;
&lt;td&gt;0.3x default standard rate limit allocation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free / Google AI Pro (AI Studio)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not available&lt;/td&gt;
&lt;td&gt;Not available&lt;/td&gt;
&lt;td&gt;Excluded in AI Studio &amp;amp; Gemini API docs.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Developers migrating to &lt;code&gt;gemini-4-argon&lt;/code&gt; via the Interactions API also need to account for three technical constraints documented in the &lt;a href="https://ai.google.dev/gemini-api/docs/latest-model" rel="noopener noreferrer"&gt;What's new in Gemini 4 Argon guide&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unified 1,048,576-token window and 64K synchronous cap&lt;/strong&gt;: Input, thinking, and output tokens share one 1M-token window. Synchronous calls default to a &lt;code&gt;65,536&lt;/code&gt; (&lt;code&gt;64K&lt;/code&gt;) &lt;code&gt;max_output_tokens&lt;/code&gt; ceiling. Generating up to 1M output tokens requires &lt;code&gt;background=True&lt;/code&gt; (long decode), where Google's servers chain 64K-token continuation steps that your client concatenates from &lt;code&gt;interaction.steps&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;15-minute client timeouts and 44-second time to first answer token&lt;/strong&gt;: Google's migration checklist recommends setting HTTP client timeouts to &lt;strong&gt;at least 15 minutes&lt;/strong&gt; for hard prompts. On the independent &lt;a href="https://artificialanalysis.ai/models/gemini-4-argon" rel="noopener noreferrer"&gt;Artificial Analysis benchmark&lt;/a&gt;, &lt;code&gt;Gemini 4 Argon (High)&lt;/code&gt; scores &lt;strong&gt;53&lt;/strong&gt; on the Intelligence Index v4.3.2 (tied with GPT-6 Astra and Claude Fable 5.1, behind Claude Opus 5.5 at 58), and live &lt;a href="https://artificialanalysis.ai/models/gemini-4-argon/providers" rel="noopener noreferrer"&gt;provider benchmarks&lt;/a&gt; measure a median &lt;strong&gt;42.97 seconds (Vertex) to 44.70 seconds (AI Studio)&lt;/strong&gt; before the first answer token arrives on 10k-token prompts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explicit context caching and sampling parameters removed&lt;/strong&gt;: &lt;code&gt;cachedContents&lt;/code&gt; calls fail on &lt;code&gt;gemini-4-argon&lt;/code&gt; (only automatic implicit caching on prompts &lt;code&gt;&amp;gt;= 4,096&lt;/code&gt; tokens is supported), and &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt;, and &lt;code&gt;top_k&lt;/code&gt; are ignored in favor of &lt;code&gt;thinking_level&lt;/code&gt; (&lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Google also published &lt;a href="https://developers.googleblog.com/gemini-4-argon-for-robotics/" rel="noopener noreferrer"&gt;Gemini 4 Argon for Robotics&lt;/a&gt; on October 13, showing a Boston Dynamics Spot quadruped throwing soda cans into a foot-pedal trash bin. Even there, the workflow reinforces the same engineering lesson: before stepping on the physical pedal, Argon builds an articulated &lt;strong&gt;MuJoCo digital twin&lt;/strong&gt; to practice three-leg tripod balance in simulation, operating inside a human-supplied &lt;code&gt;spot-mobile-manipulation&lt;/code&gt; skill and two camera-verification prompts (&lt;code&gt;foot-verifier&lt;/code&gt; and &lt;code&gt;hand-verifier&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: NEEDS REVIEW
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;gemini-4-argon&lt;/code&gt; now live on the paid Gemini API at $2/$10 per million tokens through November 30, it is worth testing on bounded refactors and long-context engineering tasks where your own test suite and code review can filter out bad proposals. At the same time, Google's twice-yearly AOSP source schedule leaves outside Android developers disassembling shipped Pixel libraries to diagnose regressions that Google's own internal unit tests missed. Fast AI code generation inside the house makes timely public source releases and rigorous tests outside the house even more important.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why did &lt;code&gt;wcscspn()&lt;/code&gt; and &lt;code&gt;wcspbrk()&lt;/code&gt; break on September 2026 Android 17 Pixel builds?
&lt;/h3&gt;

&lt;p&gt;On Android 17 build &lt;code&gt;CP3A.260905.009&lt;/code&gt;, Bionic's new table-lookup path for reject sets with two or more characters &lt;code&gt;&amp;lt; 0x100&lt;/code&gt; compares each input &lt;code&gt;wchar_t&lt;/code&gt; against &lt;code&gt;0x100&lt;/code&gt; (&lt;code&gt;cmp w8, #0x100&lt;/code&gt;) and stops scanning whenever a character is &lt;code&gt;&amp;gt;= 0x100&lt;/code&gt;. That reports every non-Latin-1 character (&lt;code&gt;U+0100&lt;/code&gt; to &lt;code&gt;U+10FFFF&lt;/code&gt;) as a match.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the Android Open Source Project (AOSP) still open source in 2026?
&lt;/h3&gt;

&lt;p&gt;Yes. Under Google's 2026 release policy, AOSP remains open source and publishes source code in Q2 and Q4 to align with its trunk-stable model. Because quarterly Pixel releases ship between those drops, the September Android 17 QPR1 binaries on phones ran ahead of the public &lt;code&gt;android17-release&lt;/code&gt; branch (which was last snapped in late March 2026 for the 26Q2 release).&lt;/p&gt;

&lt;h3&gt;
  
  
  Who can access Gemini 4 Argon (&lt;code&gt;gemini-4-argon&lt;/code&gt;) and how much does it cost?
&lt;/h3&gt;

&lt;p&gt;As of October 13, 2026, &lt;code&gt;gemini-4-argon&lt;/code&gt; is generally available on the paid tier of the Gemini API and in Google AI Studio and Antigravity for Google AI Ultra subscribers (the API pricing and AI Studio plan docs exclude the Free and Google AI Pro tiers). Standard API pricing is $2.00 per 1M input tokens and $10.00 per 1M output tokens through November 30, 2026, doubling to $4.00 input and $20.00 output on December 1, 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does Gemini 4 Argon rank on independent benchmarks?
&lt;/h3&gt;

&lt;p&gt;On the Artificial Analysis Intelligence Index v4.3.2, Gemini 4 Argon (High) scores 53, tied for second place with GPT-6 Astra (53) and Claude Fable 5.1 (53), five points behind Claude Opus 5.5 (58). Live provider tests record ~100–116 output tokens per second after a median 43–45 second thinking phase before the first answer token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/android/ndk/issues/2260" rel="noopener noreferrer"&gt;Android NDK Issue #2260 — &lt;code&gt;bionic: wcscspn()/wcspbrk() treat every wchar_t &amp;gt;= 0x100 as a match&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=50083130" rel="noopener noreferrer"&gt;Hacker News — AOSP Source Releases Are So Late Developers Disassemble Libraries to Report Bugs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://source.android.com/docs/whatsnew/site-updates?year=2026#aosp-changes" rel="noopener noreferrer"&gt;Android Open Source Project Site Updates — 2026 Changes to AOSP (Q2 and Q4 cadence)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://android.googlesource.com/platform/bionic/+log/refs/heads/android17-release" rel="noopener noreferrer"&gt;Public AOSP &lt;code&gt;platform/bionic&lt;/code&gt; &lt;code&gt;refs/heads/android17-release&lt;/code&gt; commit log&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vpinball/libwinevbs/pull/41" rel="noopener noreferrer"&gt;Visual Pinball &lt;code&gt;libwinevbs&lt;/code&gt; PR #41 — &lt;code&gt;fix: avoid wcspbrk, broken for chars &amp;gt;= U+0100 on Android 17 bionic&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/changelog" rel="noopener noreferrer"&gt;Gemini API Release Notes — October 13, 2026 (&lt;code&gt;gemini-4-argon&lt;/code&gt; GA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/latest-model" rel="noopener noreferrer"&gt;What's new in Gemini 4 Argon — API guide and migration checklist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/pricing#gemini-4-argon" rel="noopener noreferrer"&gt;Gemini Developer API Pricing — Gemini 4 Argon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/google-ai-plans" rel="noopener noreferrer"&gt;Google AI Plans in AI Studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deepmind.google/models/gemini/" rel="noopener noreferrer"&gt;Google DeepMind — Gemini 4 Argon overview and Chrome refactor claim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deepmind.google/models/model-cards/gemini-4-argon/" rel="noopener noreferrer"&gt;Gemini 4 Argon Model Card (published October 13, 2026)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.googleblog.com/optimizing-a-200000-line-python-codebase-overnight-with-gemini-4-argon/" rel="noopener noreferrer"&gt;Google for Developers Blog — Optimizing a 200,000-line Python codebase overnight with Gemini 4 Argon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.googleblog.com/gemini-4-argon-for-robotics/" rel="noopener noreferrer"&gt;Google for Developers Blog — Gemini 4 Argon for Robotics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://artificialanalysis.ai/models/gemini-4-argon" rel="noopener noreferrer"&gt;Artificial Analysis — Gemini 4 Argon (High) Intelligence, Performance &amp;amp; Price Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://artificialanalysis.ai/models/gemini-4-argon/providers" rel="noopener noreferrer"&gt;Artificial Analysis — Gemini 4 Argon (High) API Provider Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=c8gws-9SAcU" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/2026-10-14-google-source-argon/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>google</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Danfoss cyberattack: French fridge controls and the reset warning</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Tue, 13 Oct 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/axrisi/danfoss-cyberattack-french-fridge-controls-and-the-reset-warning-774</link>
      <guid>https://dev.to/axrisi/danfoss-cyberattack-french-fridge-controls-and-the-reset-warning-774</guid>
      <description>&lt;p&gt;Hackers forced refrigeration equipment at French supermarkets into defrost, and stores discarded affected food. The Danfoss cyberattack discussion concerns refrigeration controllers: France's official alert also names Copeland and Dixell equipment. A normal maintenance function became a way to disrupt cooling. Understanding that function explains the physical damage and why restoring clean settings can leave recovery unfinished. This edition follows the information reviewed for October 13, 2026.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/zMJHbgqax2w" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;French retailers confirmed refrigeration disruption. Reuters reports discarded food and forced, prolonged heating at affected stores.&lt;/li&gt;
&lt;li&gt;Defrost normally removes ice from cooling parts so refrigeration can work properly. Keeping it running puts food at risk.&lt;/li&gt;
&lt;li&gt;CERT-FR names several controller families, including Danfoss, Copeland and Dixell. Its alert establishes neither the attackers' identity nor an exact entry route.&lt;/li&gt;
&lt;li&gt;Recovery advice includes removing public exposure, checking configuration and restoring protected access with the refrigeration provider.&lt;/li&gt;
&lt;li&gt;For exposed, unsupported equipment without security patches, a factory reset alone can remove attacker changes while leaving the device vulnerable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What defrost does inside a supermarket
&lt;/h2&gt;

&lt;p&gt;A supermarket refrigeration system keeps chilled and frozen food cold. Its cooling parts can accumulate ice, which gets in the way of airflow and reduces cooling. Defrost is the maintenance cycle that removes that ice. After a normal cycle, cooling resumes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.danfoss.com/en/service-and-support/articles/dcs/the-secret-behind-danfoss-adaptive-defrost/" rel="noopener noreferrer"&gt;Danfoss's explanation of adaptive defrost&lt;/a&gt; describes that tradeoff. Too many cycles, or cycles that run too long, can harm food quality. The article is historical manufacturer background about the refrigeration mechanism. It adds no extra controller model to the current incident's affected list.&lt;/p&gt;

&lt;p&gt;That relationship makes the attack understandable without a fictional exploit demonstration. The controller can change what the refrigeration equipment does. Holding a maintenance function on for too long changes the conditions the store relies on to keep food safe.&lt;/p&gt;

&lt;p&gt;An ordinary feature already has the necessary physical effect. Access to its controls therefore carries consequences beyond a dashboard. The equipment is attached to stock that somebody must inspect, discard and replace when the cold chain is disrupted.&lt;/p&gt;

&lt;h2&gt;
  
  
  How remote maintenance becomes a control boundary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.abc.net.au/news/2026-10-13/french-supermarkets-hacked-causing-fires-and-food-loss/107258724" rel="noopener noreferrer"&gt;Reuters' report, republished by ABC&lt;/a&gt;, describes refrigeration control panels and remote maintenance adjustments. Maintenance companies can use those controls to manage equipment without sending a technician to every shop for every change.&lt;/p&gt;

&lt;p&gt;The conceptual relationship is straightforward: a remote panel changes controller settings, and those settings affect physical refrigeration. Somebody taking over that panel can misuse a legitimate adjustment. The episode's diagram shows that relationship. It does not reconstruct the attacker's entry path.&lt;/p&gt;

&lt;p&gt;France's official alert does not identify a particular password, vulnerability or exploit chain that explains every affected installation. Manufacturer statements about old firmware and reporting about earlier security research are relevant context. They establish no proof that a particular previously disclosed weakness caused this incident.&lt;/p&gt;

&lt;p&gt;For a developer working on connected equipment, the useful question is who can reach the management function and what authority they get there. The refrigeration contractor needs controlled access; the retailer needs confidence that its cooling configuration remains under that control. Convenience depends on the boundary continuing to hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  What French retailers actually reported
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://x.com/schelcher/status/2109564928881308012" rel="noopener noreferrer"&gt;Coopérative U's chief, Dominique Schelcher, confirmed&lt;/a&gt; on October 12 that a cyberattack had affected cold-production facilities at several stores since the previous night. He described teams working with refrigeration specialists to restore service. That is a retailer's confirmation of refrigeration disruption.&lt;/p&gt;

&lt;p&gt;Reuters reports a more specific account from Les Mousquetaires, Intermarché's owner. The company said fridges at about 150 stores were heated to 50 Celsius. It said the heating continued overnight for six hours. Those are company-reported figures, and the selected sources supply no cabinet-by-cabinet temperature record or measurement of every item's core temperature.&lt;/p&gt;

&lt;p&gt;An Intermarché spokesperson said staff discarded affected food to eliminate health risks. A witness in Paris described carts of thawed food and melted ice cream spilling onto the street. The incident-response work included the pavement. A monitoring dashboard rarely has a field for that.&lt;/p&gt;

&lt;p&gt;Store counts and loss estimates vary between reports. Counting affected stores also cannot establish that every store lost all its food. The reviewed reporting gives no settled industry-wide damage total. Keeping that limit visible prevents an early estimate from becoming a final invoice through repetition.&lt;/p&gt;

&lt;h2&gt;
  
  
  The affected list includes more than Danfoss
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.cert.ssi.gouv.fr/alerte/CERTFR-2026-ALE-012/" rel="noopener noreferrer"&gt;CERT-FR's October 13 revision&lt;/a&gt; lists these equipment families:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copeland xweb.&lt;/li&gt;
&lt;li&gt;Danfoss AK-SC and AK-SM series.&lt;/li&gt;
&lt;li&gt;Dixell xweb.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The alert's revision history records the addition of other targeted equipment. That makes the current list important when sharing a story initially framed around one manufacturer. Operators need to identify their actual installed controller and its support position, then work from the applicable manufacturer guidance.&lt;/p&gt;

&lt;p&gt;The scope is equally important geographically. Dutch retailer Ahold Delhaize reported a separate disruption, and Reuters quotes its statement that there was no reason to link that incident to its French counterparts. The selected evidence supports the French refrigeration attack. It supplies no established single campaign behind every retail incident reported across Europe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a factory reset can leave recovery unfinished
&lt;/h2&gt;

&lt;p&gt;CERT-FR warns against exposing management interfaces directly to the public internet. Its recovery advice includes removing that exposure, checking configuration and restoring access through a secure VPN or protected network. The configuration check specifically includes defrost windows.&lt;/p&gt;

&lt;p&gt;For compromised equipment, the alert describes resetting and reconfiguring the device as part of the response. The condition around its strongest warning matters: it discusses an internet-exposed, end-of-life device for which no security patch is available.&lt;/p&gt;

&lt;p&gt;In that situation, a factory reset can remove the changes or persistence left by a compromise. It does not repair the vulnerable device or the exposed access arrangement. Restoring the same vulnerable conditions leaves the opportunity for another compromise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0sj5w0hr3f9le1agxn6g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0sj5w0hr3f9le1agxn6g.jpg" alt="Labelled excerpt of CERT-FR's factory-reset warning" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The image is a reformatted excerpt of the French alert. In plain English, its warning is that resetting this exposed, unpatched equipment alone is insufficient. A clean configuration and a protected management boundary address different parts of recovery.&lt;/p&gt;

&lt;p&gt;That is the detail I keep in the episode's open loop. Resetting gives an operator a concrete action and a visible result. The remaining questions concern the device's support status, its security updates and who can reach the restored controls. The recovery review has to continue after the reset completes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coordinate recovery with the refrigeration provider
&lt;/h2&gt;

&lt;p&gt;This is physical infrastructure, with service relationships around it. CERT-FR specifically tells operators to coordinate with their refrigeration contractor and check insurance-contract conditions before cutting internet reporting. Disconnecting a connection can affect required monitoring.&lt;/p&gt;

&lt;p&gt;That warning deserves the same attention as the recommendation to remove public exposure. The immediate objective is to protect the management interface while preserving a workable, reviewed maintenance arrangement. Somebody responsible for the installation needs to decide how those requirements fit together.&lt;/p&gt;

&lt;p&gt;The alert also discusses supported firmware, security settings and changing defaults as relevant manufacturer practices. They are defensive measures. Their inclusion supplies no evidence about which weakness an attacker used in this case.&lt;/p&gt;

&lt;p&gt;A useful recovery conversation identifies the installed model, its support status, the configuration that was changed and the protected route through which authorized technicians will regain access. It should also identify who verifies those decisions before service is called restored.&lt;/p&gt;

&lt;p&gt;Those questions are a way to read the alert with the responsible provider, rather than a substitute for their incident response. The normal controls govern equipment whose failures have physical and food-safety consequences. Reopening an aisle requires more than dismissing a software notification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also today: Rust accepted a reference that outlived its data
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/rust-lang/rust/issues/164250" rel="noopener noreferrer"&gt;Rust issue #164250&lt;/a&gt; reports a specific lifetime-check problem. A reference is a handle to data; a lifetime describes how long that reference and the data remain valid. The report describes accepted code retaining a short-lived reference where a longer-lived one is expected. Cleanup later treats the handle as valid after the original data is gone.&lt;/p&gt;

&lt;p&gt;The reporter supplies reproductions and says a memory-checking tool detects the invalid access. Contributors discuss related examples reaching older versions. We did not compile or run those examples. At the episode's source check, the issue was open, marked high priority and had no linked fix. This supplies no claim that every Rust application encounters the path or that production exploitation has been established.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also today: Apple's HomeView checks whose content to show
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.apple.com/newsroom/2026/10/meet-apple-homeview-a-new-way-to-enjoy-entertainment-and-manage-the-home/" rel="noopener noreferrer"&gt;Apple announced HomeView&lt;/a&gt;, a seven-inch display for calls, entertainment and compatible home accessories. Its US starting price is $299. Preorders begin October 13, with availability November 13 in the announced markets.&lt;/p&gt;

&lt;p&gt;Apple says personal Messages and Calendar content appears when an enrolled user's face is recognized and their paired phone or tablet is present and recently unlocked. The devices normally share the same wireless network, with a constrained cellular exception described in the announcement. These are vendor statements about personal-content controls; this edition makes no independent privacy certification.&lt;/p&gt;

&lt;p&gt;Siri's new features start in English and beta. Some server-based features have daily usage limits, with expanded access available for a future fee. Apple also says HomeView will not be sold in the EU while Siri's new capabilities remain unavailable there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: NEEDS REVIEW
&lt;/h2&gt;

&lt;p&gt;I'd insist on protected management access before calling the refrigeration installations recovered. The legitimate maintenance feature remains useful. Its access boundary has to protect the retailer relying on it. Clean settings alone leave an unresolved exposure waiting for the next incident, and the food has already paid for the first one.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Were the French fridges forced into a normal maintenance function?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The reviewed reporting describes prolonged forced defrost. Normal defrost removes ice so cooling can resume; holding it on can put food at risk.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was only Danfoss equipment affected?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CERT-FR's revised alert also lists Copeland and Dixell controller families. Consult the current list and the installed model's manufacturer guidance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the alert identify the exact attack entry route?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The reviewed alert establishes neither an attacker identity nor a specific exploited weakness explaining the campaign. Do not turn a possible cause into a confirmed one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why might resetting the controller be insufficient?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the exposed, unsupported, unpatched equipment described by CERT-FR, resetting can remove attacker changes while leaving the vulnerability and access exposure unresolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cert.ssi.gouv.fr/alerte/CERTFR-2026-ALE-012/" rel="noopener noreferrer"&gt;CERT-FR's official alert and October 13 affected-equipment update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.abc.net.au/news/2026-10-13/french-supermarkets-hacked-causing-fires-and-food-loss/107258724" rel="noopener noreferrer"&gt;Reuters reporting, republished by ABC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/schelcher/status/2109564928881308012" rel="noopener noreferrer"&gt;Dominique Schelcher's retailer confirmation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.danfoss.com/en/service-and-support/articles/dcs/the-secret-behind-danfoss-adaptive-defrost/" rel="noopener noreferrer"&gt;Danfoss background on normal defrost&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rust-lang/rust/issues/164250" rel="noopener noreferrer"&gt;Rust's primary lifetime-check issue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apple.com/newsroom/2026/10/meet-apple-homeview-a-new-way-to-enjoy-entertainment-and-manage-the-home/" rel="noopener noreferrer"&gt;Apple's HomeView announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=zMJHbgqax2w" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/2026-10-13-supermarket-defrost/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>danfoss</category>
      <category>defrost</category>
      <category>rust</category>
      <category>memorysafety</category>
    </item>
    <item>
      <title>Claude Code and Linus Torvalds: the Linux patch tradeoffs</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Mon, 12 Oct 2026 16:30:00 +0000</pubDate>
      <link>https://dev.to/axrisi/claude-code-and-linus-torvalds-the-linux-patch-tradeoffs-299j</link>
      <guid>https://dev.to/axrisi/claude-code-and-linus-torvalds-the-linux-patch-tradeoffs-299j</guid>
      <description>&lt;p&gt;Claude Code helped Linus Torvalds explore a Linux memory-management change, write test programs and draft its explanation. The interesting part is in the cover letter: an experimental patch series reduces the cost of a particular shared-file workload, makes another read path slower and leaves memory accounting unresolved. The work gives reviewers something concrete to examine. It also gives the headline some substantial footnotes. This edition follows the sources reviewed for October 12, 2026.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/xplibHZiasM" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Linus credits Claude Code for the code, test programs, review behind his problem list and the first text draft, all under his direction.&lt;/li&gt;
&lt;li&gt;The experimental branch changes how page-cache memory waits before reuse, allowing a read path to avoid shared reference-count updates.&lt;/li&gt;
&lt;li&gt;His laptop test shows about a quarter of the original processor cost for one tiny, contended read workload. No whole-system speedup is established.&lt;/li&gt;
&lt;li&gt;A missing destination user page makes a read more expensive. Waiting memory remains invisible to important allocator accounting.&lt;/li&gt;
&lt;li&gt;The evidence selected here establishes an experiment and a request for review. It establishes no completed mainline merge or shipped kernel change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Claude Code did for Linus Torvalds
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4c0f3697118eb3a708ea79175f7f07c43339bfab" rel="noopener noreferrer"&gt;primary cover letter&lt;/a&gt; is unusually explicit about the assistant's role:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The code, the test programs, the review behind the list above and the first draft of this text were done with an LLM coding assistant (Claude Code) under my direction. The measurements were run on my machine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That supplies both attribution and a boundary. Linus directed the work and ran the measurements. The attribution includes the assistant's review behind the listed problems; that remains part of this author's account. It supplies no separate independent validation of the series.&lt;/p&gt;

&lt;p&gt;Anthropic's &lt;a href="https://code.claude.com/docs/en/overview" rel="noopener noreferrer"&gt;Claude Code overview&lt;/a&gt; describes a tool that can read projects, edit files and run commands. In this case, those capabilities were applied to a specific kernel problem with testable behavior. The assistant also helped produce the prose explaining it. Even the cover letter brought a coding bot to review.&lt;/p&gt;

&lt;p&gt;The commit is dated Saturday, October 10. &lt;a href="https://www.phoronix.com/news/Linus-Torvalds-Claude-Code" rel="noopener noreferrer"&gt;Phoronix's report&lt;/a&gt; appeared Sunday evening in America, already Monday in GMT+7. The &lt;a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?h=noref-filemap-read-with-llm" rel="noopener noreferrer"&gt;experimental branch&lt;/a&gt; and its eight patches belong to that context. Reading the branch name is a useful first step before treating the headline as a kernel release note.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why reading cached data can create contention
&lt;/h2&gt;

&lt;p&gt;The cover letter describes many threads making small reads from one file. The file data can already be in the page cache, yet the read still has bookkeeping work around its use of memory.&lt;/p&gt;

&lt;p&gt;The existing path takes a reference to the folio and drops it afterwards. A folio is the unit of memory involved in this description. Those operations update its reference count, writing the same &lt;code&gt;struct page&lt;/code&gt; line twice per read. Threads sharing the file can therefore compete over the bookkeeping even while their useful work is reading bytes.&lt;/p&gt;

&lt;p&gt;In the selected test, several readers repeatedly ask for a tiny piece of one page. The analogy is a library where every reader must update the same sign-out sheet. Reading gets crowded around the sheet before it gets crowded around the book.&lt;/p&gt;

&lt;p&gt;The proposed change targets that particular shared cost. That framing matters: identifying a contended counter gives the experiment a mechanism reviewers can inspect. It does not imply that every expensive read in every Linux workload has the same bottleneck.&lt;/p&gt;

&lt;h2&gt;
  
  
  Linux RCU and the memory-reuse guarantee
&lt;/h2&gt;

&lt;p&gt;The idea is to delay the final freeing of a folio removed from the page cache until an RCU grace period. RCU stands for read-copy-update. In the letter's proposed read path, read-side protection allows the cached data to be copied without acquiring the folio reference for that read.&lt;/p&gt;

&lt;p&gt;The lifetime guarantee is about preventing memory reuse during the protected period. The letter explicitly distinguishes that from keeping the reference count above zero. Reclaim, migration and splitting have their own interactions with the count, so replacing that guarantee with a vague promise that the page remains referenced would lose an important detail.&lt;/p&gt;

&lt;p&gt;Removal from the cache and recycling the underlying memory are separate events in this design. A removed page can wait before its memory is handed back to the allocator. The read path gets less shared bookkeeping in exchange for obligations elsewhere in memory management.&lt;/p&gt;

&lt;p&gt;There are additional constraints. The primary letter describes an existing-path fallback when the new path cannot continue, exclusions from deferral and changes needed around reuse without a free. The episode's two-reader diagram is a conceptual simplification. It represents the relationship; the cover letter supplies the implementation-specific review work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benchmark measures one workload on one laptop
&lt;/h2&gt;

&lt;p&gt;The headline comparison uses eight threads reading sixteen bytes from a one-page file. Linus reports kernel cycles per read, explaining that his laptop throttles with temperature and that this cost is more useful for the comparison than reads per second.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shared-file test&lt;/th&gt;
&lt;th&gt;Kernel cycles per read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Baseline, eight threads&lt;/td&gt;
&lt;td&gt;2937–2975&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patch series, eight threads&lt;/td&gt;
&lt;td&gt;725–726&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Those ranges come directly from the letter. Comparing their midpoints gives about a quarter of the baseline processor cost in this test. The measured result supports that narrow statement. Turning it into a claim that Linux as a whole became four times faster would change the claim's subject, workload and metric all at once.&lt;/p&gt;

&lt;p&gt;The machine was an i7-8565U laptop. The letter explicitly says nothing bigger had been measured.&lt;/p&gt;

&lt;p&gt;The setup also has a conspicuous scope line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My laptop only, ext4, mitigations off, CONFIG_HARDENED_USERCOPY off.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsrnr5e8y3axtnfq1tdrn.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsrnr5e8y3axtnfq1tdrn.jpg" alt="Labelled source excerpt of Linus's benchmark scope" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a reformatted source excerpt from the primary letter. Those settings belong beside the result whenever it is shared. The selected sources provide no independent replication. The experiment is useful evidence about a particular path under stated conditions; broader deployment requires broader evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  A missing destination page makes the read slower
&lt;/h2&gt;

&lt;p&gt;The letter supplies a counterexample in the same set of numbers. When the destination user page is absent, the fast path takes a failed exception before the existing path handles the real fault and finishes the read.&lt;/p&gt;

&lt;p&gt;For the sixteen-byte, one-thread case, reported cost rises from 4117–4188 to 6543–6593 kernel cycles per read. That is a different workload from the contended eight-thread comparison. It deserves its own row in a review, rather than disappearing behind the favorable chart.&lt;/p&gt;

&lt;p&gt;The proposal changes how the paths divide the work. A path that benefits from avoiding reference-count updates can coexist with a path that pays for an unsuccessful attempt first. Reviewers need to understand when each occurs and what the additional cost means for the workloads they care about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The waiting-memory bill remains unresolved
&lt;/h2&gt;

&lt;p&gt;The open loop in the episode is what happens after a page is removed. Deferring reuse produces memory that is waiting for a grace period. The primary letter lists a remaining problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The allocator cannot see the waiting pages. They have refcount 0, are not PageBuddy, are on no pcp list and in no counter.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That accounting gap matters to decisions about available memory. The waiting pages appear in neither the relevant LRU counters nor free-page accounting. A subsystem trying to decide whether reclaim can make progress consequently lacks part of the picture.&lt;/p&gt;

&lt;p&gt;The series includes mitigation patches to keep the waiting lists shorter. The letter says they do not make the allocator see the memory on those lists. Shortening a queue and accounting for its contents answer different questions.&lt;/p&gt;

&lt;p&gt;There is an important version boundary here. The cited VM reproducer triggers the OOM killer with the earlier first six patches; the eight-patch series runs it to completion. Claiming that the final series simply reproduces that earlier failure would erase the improvement. Claiming that completion resolves the accounting problem would erase the author's remaining warning.&lt;/p&gt;

&lt;p&gt;The author also asks for measurements outside the read path. Deferred freeing moves work to another place, including worker execution and locking around queues. Reclaim-heavy and truncate-heavy loads need their own numbers. The bookkeeping has found a new desk; somebody still has to examine the desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a reviewer still needs to prove
&lt;/h2&gt;

&lt;p&gt;The letter records testing that was performed and testing that remains absent. It names other machines, memory-pressure cases, lockdep, KASAN, hardened usercopy and other configurations among the gaps. An assistant generating tests does not establish that every relevant test has been run.&lt;/p&gt;

&lt;p&gt;For this experiment, the useful review starts with the lifetime guarantee. Trace the places where cache memory can be removed or reused, then check that the required waiting behavior covers them. Follow the fallback conditions too: a fast path's correctness includes what happens when it stops.&lt;/p&gt;

&lt;p&gt;Performance review should keep the favorable shared-read case, the faulting case and the deferred-free cost together. Each answers a different question. A benchmark can demonstrate that an intended optimization is real while leaving its system-wide tradeoff unfinished.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also in this episode: capability gaps and job decisions
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://x.com/karpathy/status/2109361546505966046" rel="noopener noreferrer"&gt;Andrej Karpathy's fresh post&lt;/a&gt; revisits an April observation about people having very different experiences of AI capability. He emphasizes access, task scale and verifiable work. His population counts are labelled “napkin math”; the selected post supplies no survey methodology. They should retain that estimate label when quoted.&lt;/p&gt;

&lt;p&gt;That argument provides context for the contrast between a chatbot request and a supervised kernel experiment. A task with measurable behavior gives a reviewer different checks to perform. It supplies no guarantee that every ambitious coding task will succeed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cendyne.dev/posts/2026-10-11-fable-took-my-jorb.html" rel="noopener noreferrer"&gt;Cendyne's account&lt;/a&gt; concerns a different decision. The author says they were the last engineer at an unnamed company, and that cheaper AI assistance gave leadership confidence to coast toward a merger or acquisition. This is an attributed firsthand account of management's bet. It establishes no economy-wide replacement count or independent assessment of that employer's needs. The author says they have found something else.&lt;/p&gt;

&lt;p&gt;A staffing decision can happen while arguments about a model's judgment remain unresolved. The consequences land on a person. My joke about the spreadsheet is aimed at the decision-making, never at somebody dealing with a layoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: NEEDS REVIEW
&lt;/h2&gt;

&lt;p&gt;I'd keep the assistant in the workflow and require broader testing before shipping these lifetime changes. The experiment has a mechanism, measurements, a regression and an explicit list of unfinished work. That gives reviewers a starting point. Responsibility stays with the engineer, including responsibility for reading the less exciting section underneath the chart.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Did Linus Torvalds use Claude Code to ship a new Linux kernel?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The reviewed sources describe experimental patches and their explanation. They establish no completed mainline merge or production release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What got about four times cheaper?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kernel cycles per read in the selected eight-thread, sixteen-byte shared-file test on Linus's laptop. The claim does not describe whole-system performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why does the missing destination-page case matter?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The proposed fast path fails before the existing path takes the real fault, adding work. The letter measures a regression in that case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Did the final patches solve the waiting-memory problem?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The mitigation patches improve the cited reproducer and shorten waiting lists. The cover letter still lists the allocator's inability to account for waiting memory as unresolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=4c0f3697118eb3a708ea79175f7f07c43339bfab" rel="noopener noreferrer"&gt;Linus Torvalds's primary cover letter and measurements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/?h=noref-filemap-read-with-llm" rel="noopener noreferrer"&gt;Experimental noref-filemap-read-with-llm branch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.phoronix.com/news/Linus-Torvalds-Claude-Code" rel="noopener noreferrer"&gt;Phoronix report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/overview" rel="noopener noreferrer"&gt;Anthropic's Claude Code overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.com/karpathy/status/2109361546505966046" rel="noopener noreferrer"&gt;Karpathy's capability-gap post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cendyne.dev/posts/2026-10-11-fable-took-my-jorb.html" rel="noopener noreferrer"&gt;Cendyne's firsthand account&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=xplibHZiasM" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/linus-claude-kernel/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>ai</category>
      <category>claudecode</category>
      <category>codereview</category>
    </item>
    <item>
      <title>Model security on Hugging Face: what executes when you load</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Mon, 12 Oct 2026 02:30:00 +0000</pubDate>
      <link>https://dev.to/axrisi/model-security-on-hugging-face-what-executes-when-you-load-2eec</link>
      <guid>https://dev.to/axrisi/model-security-on-hugging-face-what-executes-when-you-load-2eec</guid>
      <description>&lt;p&gt;Local AI gives you control over where your model runs. Model security also depends on what your loader executes along the way. Researchers have documented Hugging Face model packages containing reverse-shell payloads, and an unsafe loading path can give that code the same access as your Python process. Your machine gets the model and, potentially, an ambitious new colleague.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Wk9gxtH5UuI" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Model weights are learned numerical data. A model repository can also carry configuration, executable serialization and Python files.&lt;/li&gt;
&lt;li&gt;JFrog's Goober Two example and ReversingLabs' nullifAI samples contained reverse-shell payloads. The selected reports do not establish credential theft from actual victims.&lt;/li&gt;
&lt;li&gt;A separate Checkmarx research demonstration showed how a missing local model path could resolve to a public repository. Remote-code trust was an important execution prerequisite.&lt;/li&gt;
&lt;li&gt;Safetensors, current patched loaders, reviewed revisions and isolation address different parts of the loading path.&lt;/li&gt;
&lt;li&gt;Readable secrets and available network access determine how much damage code running in the loader can do.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Model security begins before the first answer
&lt;/h2&gt;

&lt;p&gt;Hugging Face is a platform for sharing machine learning models, datasets and applications. A repository is a useful distribution unit: it can contain the weights, the configuration needed to interpret them and, for custom architectures, implementation code. The contents deserve separate questions because their loading behavior differs.&lt;/p&gt;

&lt;p&gt;The weights are the learned numbers. A tensor-data reader interprets their shapes and values. Python object serialization can describe how to rebuild objects, including calls to functions. Repository Python code introduces another execution path when your application authorizes it. Putting all these files under the heading “model” makes installation convenient and the trust boundary easy to miss.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/docs/hub/en/security-pickle" rel="noopener noreferrer"&gt;Hugging Face's Pickle Scanning documentation&lt;/a&gt; states the central warning plainly: “There are dangerous arbitrary code execution attacks that can be perpetrated when you load a pickle file.” The significant verb is &lt;em&gt;load&lt;/em&gt;. Saving bytes to disk and handing those bytes to an unsafe deserializer are different actions.&lt;/p&gt;

&lt;p&gt;For the incidents discussed here, the file's instructions become dangerous when a loading path follows them. That can happen before inference begins. A malicious package does not need to persuade the model to reveal anything in its answer if the surrounding software already lets its code run. The benchmark can wait; the process has started accepting guests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pickle security: opening the parcel
&lt;/h2&gt;

&lt;p&gt;Pickle stores Python objects with instructions for reconstructing them. Deserialization reads those instructions in sequence. An unsafe loader may resolve and call functions during reconstruction, which gives an untrusted file influence over the host process.&lt;/p&gt;

&lt;p&gt;Think of the package as a parcel and the loader as the person opening it. Downloading places the parcel on the shelf. Loading follows the enclosed assembly instructions. If those instructions can invoke arbitrary functions, the activity has crossed from reading data into executing the publisher's choices.&lt;/p&gt;

&lt;p&gt;The exact loading API, library version and settings matter. A security statement about one unsafe path cannot be extended to every model loader. Modern restricted loading modes deliberately reduce what object reconstruction is allowed to do. Conversely, overriding a rejection because an unfamiliar checkpoint “needs it” can reopen the boundary you were relying on.&lt;/p&gt;

&lt;p&gt;This is also why “poisoned weights” needs explanation. The phrase can refer to model behavior changed by training or editing numerical parameters. The cases in this episode concern executable packaging and repository code around model distribution. Those mechanisms have their own entry points, permissions and defenses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three concrete examples, with their limits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Goober Two: a documented reverse shell
&lt;/h3&gt;

&lt;p&gt;In February 2024, &lt;a href="https://jfrog.com/blog/data-scientists-targeted-by-malicious-hugging-face-ml-models-with-silent-backdoor/" rel="noopener noreferrer"&gt;JFrog analyzed &lt;code&gt;baller423/goober2&lt;/code&gt;&lt;/a&gt;. Its Pickle payload initiated a reverse shell during unsafe loading. A reverse shell connects outward and offers command access to the other end of the connection.&lt;/p&gt;

&lt;p&gt;The repository was deleted. JFrog also discussed clues suggesting possible researcher involvement, so attribution remains uncertain. The report supplies evidence for the payload's behavior. It does not establish that criminals stole a named victim's cloud keys, and it does not justify inventing a victim count.&lt;/p&gt;

&lt;p&gt;That distinction leaves the mechanism plenty worrying. Command access under the loader's account is a meaningful foothold. A development environment often gives that account more access than a model experiment needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  nullifAI: unusual packaging and an error that arrived late
&lt;/h3&gt;

&lt;p&gt;In February 2025, &lt;a href="https://www.reversinglabs.com/blog/rl-identifies-malware-ml-model-hosted-on-hugging-face" rel="noopener noreferrer"&gt;ReversingLabs described two model samples&lt;/a&gt;, including &lt;code&gt;glockr1/ballr7&lt;/code&gt;, under the name nullifAI. Both contained platform-aware reverse-shell payloads.&lt;/p&gt;

&lt;p&gt;An important detail is the archive format. These samples used seven-zip packaging where ordinary PyTorch loading expected a different structure. Default &lt;code&gt;torch.load&lt;/code&gt; would reject that packaging. The dangerous path required extraction followed by unsafe Pickle deserialization. A diagram showing an ordinary model download immediately opening these samples would skip a real prerequisite.&lt;/p&gt;

&lt;p&gt;The report also examined broken Pickle streams and a historical scanner blind spot. Its harmless file-writing research test showed that an earlier instruction could execute before a later error stopped loading. The file already existed when the loader complained. Imagine releasing a raccoon from a parcel and then discovering that the shipping label is invalid. The complaint may be accurate; the timing is deeply unhelpful.&lt;/p&gt;

&lt;p&gt;ReversingLabs disclosed the finding on January 20, 2025. Hugging Face removed the reported samples within twenty-four hours and changed the scanner. This example describes a historical finding and its response. It supplies a reason to investigate scanner failures, rather than a claim that the same bypass remains unpatched.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model Confusion: a missing folder resolves somewhere else
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://checkmarx.com/zero-post/hugs-from-strangers-ai-model-confusion-supply-chain-attack/" rel="noopener noreferrer"&gt;Checkmarx's January 2026 Model Confusion article&lt;/a&gt; describes a research demonstration involving an unnamed company's sample. A relative identifier such as &lt;code&gt;checkpoints/some-model&lt;/code&gt; could refer to a local path or a public model namespace. If the local path was missing, resolution could select a matching remote repository.&lt;/p&gt;

&lt;p&gt;Combine that ambiguity with insecure loading and remote-code trust, and the selected repository's code can execute. The company's sample was corrected within a day, according to Checkmarx. The report explicitly describes the demonstration and says it had not found malicious activity in the sensitive-name examples it highlighted.&lt;/p&gt;

&lt;p&gt;Two conditions are doing work here: selecting the unexpected remote package, and authorizing an execution-capable loading path. Checking only whether a string looks like a local folder misses the resolution step. A missing directory should not get to improvise its own landlord.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where readable credentials enter the flow
&lt;/h2&gt;

&lt;p&gt;Once code runs in a process, its access depends on the account, filesystem mounts and other controls around that process. An accessible cloud key, a token available in the environment or a readable private-key file can become a target. Secrets kept outside that access boundary remain outside the straightforward read path.&lt;/p&gt;

&lt;p&gt;Sending a secret elsewhere also requires an available network route. Read access and outbound connectivity are independent conditions. Blocking egress can constrain a transfer; keeping the secret out of the process can prevent the read in the first place. Numerical weights alone supply neither capability.&lt;/p&gt;

&lt;p&gt;The selected reverse-shell reports document command-access payloads. Credential collection and exfiltration are conditional consequences of that access, rather than proven victim outcomes in these reports. The episode's key movement is therefore labeled “possible consequence,” and the original key remains in place while a copy follows the possible route.&lt;/p&gt;

&lt;p&gt;This is where a familiar development setup gets awkward. A container with your home directory or credentials mounted inside exposes those mounted resources to code in the container. The namespace boundary can be useful, but the key you deliberately put inside it is still inside it. A container full of secrets is a gift basket with resource limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safetensors, patched loaders and a useful isolation boundary
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/docs/safetensors/en/index" rel="noopener noreferrer"&gt;Safetensors&lt;/a&gt; provides a tensor-data format designed for safe storage without Pickle's executable object reconstruction. Choosing it addresses that serialization route. A repository can still contain Python code alongside the tensor files, so review the code-loading path as a separate decision.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/docs/transformers/en/models" rel="noopener noreferrer"&gt;Hugging Face's custom model loading documentation&lt;/a&gt; warns about inadvertently executing malicious code and describes &lt;code&gt;trust_remote_code=True&lt;/code&gt;. It also recommends pinning a specific revision. Review the exact revision you intend to run, then keep that decision stable while you evaluate the package.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.pytorch.org/docs/2.14/notes/serialization.html" rel="noopener noreferrer"&gt;PyTorch's serialization documentation&lt;/a&gt; explains that &lt;code&gt;torch.load&lt;/code&gt; defaults to &lt;code&gt;weights_only=True&lt;/code&gt; starting with version 2.6 when no &lt;code&gt;pickle_module&lt;/code&gt; is passed. The restricted unpickler narrows the remote-code-execution surface. The documentation also retains limitations involving denial of service and possible memory corruption, so the setting deserves its actual scope.&lt;/p&gt;

&lt;p&gt;For unfamiliar packages, I would separate acquisition and inspection from execution. Prepare a clean environment with only the files the experiment needs. Leave personal keys outside it. Restrict network access according to the task, and make repository-code trust an explicit reviewed choice. The useful question is what a process could reach if its loading behavior surprised you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: NEEDS REVIEW
&lt;/h2&gt;

&lt;p&gt;I'd keep open models and put the permission boundary around the loader. The documented examples show why model distribution needs the same attention we give other executable inputs. Free access to a model is valuable; deciding who gets access to the development environment is also valuable.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can downloading a Hugging Face model steal my credentials?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The mechanisms discussed here execute during unsafe loading or authorized repository-code execution. Merely saving the model bytes is a different step. Review the path that will open them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does safetensors make a whole repository safe?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It addresses tensor serialization. Review custom Python and dependencies separately, and keep the loader's access appropriately narrow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does a failed load mean nothing happened?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Earlier instructions may have executed before a later error. ReversingLabs' harmless test demonstrated exactly that ordering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Were credentials proven stolen in these examples?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The selected reports establish reverse-shell payloads and a code-execution research demonstration. They do not establish credential theft from actual victims. Readable credentials are a conditional exposure worth preventing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jfrog.com/blog/data-scientists-targeted-by-malicious-hugging-face-ml-models-with-silent-backdoor/" rel="noopener noreferrer"&gt;JFrog: malicious Hugging Face models with a silent backdoor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reversinglabs.com/blog/rl-identifies-malware-ml-model-hosted-on-hugging-face" rel="noopener noreferrer"&gt;ReversingLabs: nullifAI and malicious model samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://checkmarx.com/zero-post/hugs-from-strangers-ai-model-confusion-supply-chain-attack/" rel="noopener noreferrer"&gt;Checkmarx: Model Confusion research demonstration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/docs/hub/en/security-pickle" rel="noopener noreferrer"&gt;Hugging Face: Pickle Scanning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/docs/safetensors/en/index" rel="noopener noreferrer"&gt;Hugging Face: Safetensors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/docs/transformers/en/models" rel="noopener noreferrer"&gt;Hugging Face: loading custom models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.pytorch.org/docs/2.14/notes/serialization.html" rel="noopener noreferrer"&gt;PyTorch: serialization semantics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=Wk9gxtH5UuI" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/2026-10-12-huggingface-model-malware/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>python</category>
      <category>machinelearning</category>
      <category>pytorch</category>
    </item>
    <item>
      <title>Bitwarden licensing: store builds change, GPL continues on GitHub</title>
      <dc:creator>Nikoloz Turazashvili (@axrisi)</dc:creator>
      <pubDate>Sun, 11 Oct 2026 19:57:56 +0000</pubDate>
      <link>https://dev.to/axrisi/bitwarden-licensing-store-builds-change-gpl-continues-on-github-lam</link>
      <guid>https://dev.to/axrisi/bitwarden-licensing-store-builds-change-gpl-continues-on-github-lam</guid>
      <description>&lt;p&gt;Bitwarden says the next release of its store-distributed apps will use commercially licensed builds. The GPLv3 version will continue getting updates on GitHub. Developers choosing a password manager now have a specific distribution boundary to inspect, alongside a staff reply that leaves room for future features to diverge. This edition follows the information available on October 11, 2026.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/yRTyoEMMiJ8" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Upcoming store builds use the commercial license, according to Bitwarden's announcement. A staff clarification also includes direct downloads.&lt;/li&gt;
&lt;li&gt;Bitwarden says all current features are available in both versions, and its free plan commitment remains.&lt;/li&gt;
&lt;li&gt;The client repository already separates GPLv3 code and Bitwarden License v1.0 code. Mixed licensing predates this announcement.&lt;/li&gt;
&lt;li&gt;A staff reply reserves some future components for the commercial build. It names no feature or delivery date.&lt;/li&gt;
&lt;li&gt;Check the package you actually install and the notices that apply to your workflow. Source availability alone cannot answer a redistribution question.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What changes in Bitwarden licensing
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://community.bitwarden.com/t/published-version-update-in-app-stores/102750" rel="noopener noreferrer"&gt;October 9 announcement&lt;/a&gt; describes a change beginning with the next release. Apps published to the various stores will be commercially licensed builds. The company says users need take no action and the apps will work exactly as they do today.&lt;/p&gt;

&lt;p&gt;That timing matters. This announcement describes upcoming releases. It does not establish a specific version number or delivery date for every store. A headline about the license change therefore needs the future-facing qualifier, even if the interface remains familiar when the update arrives.&lt;/p&gt;

&lt;p&gt;Bitwarden is a password manager. Its &lt;a href="https://bitwarden.com/help/bitwarden-security-white-paper/" rel="noopener noreferrer"&gt;security whitepaper&lt;/a&gt; describes logins stored in an encrypted vault, and the product provides autofill into websites. A developer may encounter it as an app-store download, a browser extension, or code in the public client repository. Those encounters have different practical purposes, so it helps to identify the particular package under discussion before drawing conclusions from the brand name.&lt;/p&gt;

&lt;p&gt;The initial post says the GPLv3 open-source version will continue to be updated and published on GitHub. &lt;a href="https://community.bitwarden.com/t/published-version-update-in-app-stores/102750/8" rel="noopener noreferrer"&gt;Reply 8&lt;/a&gt; adds that direct downloads will also use the commercial license. Downloading from the website therefore supplies no automatic shortcut around the distribution distinction described by the company.&lt;/p&gt;

&lt;p&gt;There is also an important limit to this analysis. I have reviewed the published statements and license files. I have performed no independent binary-to-source comparison of the store apps. The company's clarification that store clients are built directly from publicly auditable GitHub code remains a company statement here. An audit would require its own scope and evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current feature parity leaves a future question
&lt;/h2&gt;

&lt;p&gt;The announcement contains a reassuring sentence worth reading in full:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;All current features are available in both versions&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That statement describes the present feature set. It gives a user a reason to expect continuity while this distribution change happens. Its word “current” also gives the statement a time boundary. A future product decision would need its own explanation.&lt;/p&gt;

&lt;p&gt;A volunteer moderator asked what differences would exist between the parallel versions. In &lt;a href="https://community.bitwarden.com/t/published-version-update-in-app-stores/102750/4" rel="noopener noreferrer"&gt;reply 4&lt;/a&gt;, Bitwarden employee RyanL answered:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Some future components will be published under the commercial license and will exist only in that build. Newly developed features will be evaluated on a case-by-case basis for which license applies to them.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the specific future boundary supported by the source. The reply allows commercial-only components and describes a case-by-case evaluation process. It supplies no named component, feature list, or implementation date. Predicting which future feature will land on which side would add information the staff reply never provided.&lt;/p&gt;

&lt;p&gt;For a developer, the useful question is whether a capability central to their workflow continues to exist in the build they use. That can be reviewed release by release. A list of today's matching features cannot finish tomorrow's review for you. Equally, the possibility of future divergence supplies no evidence that a particular current feature has already been removed.&lt;/p&gt;

&lt;p&gt;The announcement retains the free-forever plan commitment. It also clarifies that the code remains publicly auditable and that self-hosting is unchanged. Those statements deserve to remain attached to the discussion. An upcoming licensing change by itself establishes neither an announced price increase nor an instruction to abandon the vault immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  The repository already had two license categories
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/bitwarden/clients/blob/main/LICENSE.txt" rel="noopener noreferrer"&gt;clients repository license map&lt;/a&gt; says its source code is covered by one of two licenses: GNU GPL v3.0 and Bitwarden License v1.0. GPL is the default unless a header specifies another license. It identifies the &lt;code&gt;/bitwarden_license&lt;/code&gt; directory as the location for Bitwarden-licensed code.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/bitwarden/clients/blob/main/LICENSE_BITWARDEN.txt" rel="noopener noreferrer"&gt;commercial source-module agreement&lt;/a&gt; carries the header “Version 1, 4 September 2020.” The repository's mixed licensing structure therefore predates this October announcement. Treating the event as the birth of dual licensing loses the actual change developers need to inspect: which license accompanies a distributed build.&lt;/p&gt;

&lt;p&gt;This also explains why a quick glance at a repository's top-level license can leave a question unfinished. A file may sit under a separately specified license. Reviewing the header and directory context matters when evaluating the component you want to modify or distribute.&lt;/p&gt;

&lt;p&gt;The source-module agreement describes a grant for internal development and testing with restrictions on transfer and competing products. Applying its wording directly to an ordinary downloaded-app user's production use would require a separate review of the distributed application's applicable terms. I have not reviewed a complete app EULA here, and I make no claim that normal password-manager use is prohibited.&lt;/p&gt;

&lt;p&gt;That distinction keeps the analysis useful. A user deciding whether to continue using an app and a developer planning to redistribute a component are answering different questions. Each needs the relevant package, activity, and terms. General licensing advice cannot substitute for identifying those inputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical review for your actual build
&lt;/h2&gt;

&lt;p&gt;Start with the installation route. Write down which store or download supplied the app and which version you have. Then review the license notices attached to that package. For the upcoming release, the company explicitly identifies store builds and direct downloads as commercial distribution routes.&lt;/p&gt;

&lt;p&gt;If your workflow depends on the GPL version, follow the releases the company publishes on GitHub and examine the instructions and notices for that path. The announcement promises ongoing updates there. It gives no reason to assume a familiar download button elsewhere selects that version.&lt;/p&gt;

&lt;p&gt;For modification or redistribution work, examine the files and components involved. The repository license map supplies the default rule and the separate category. A publicly viewable file remains useful evidence for inspection, while the applicable license supplies the permission terms for a proposed use.&lt;/p&gt;

&lt;p&gt;Finally, keep the current feature list separate from future requirements. Identify the capabilities you rely on, and revisit the comparison when a release introduces a relevant feature. The staff reply explicitly describes future decisions made case by case. Recording the requirement now makes that later comparison easier than reconstructing it from memory.&lt;/p&gt;

&lt;p&gt;This is a review checklist rather than legal advice. The point is to ask a bounded question that the published evidence can answer. “Which build and terms apply to my use?” gives you a tractable starting point. A password manager's familiar logo gives you product recognition; the notices and release information complete the licensing part of the decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Also today: a literal PATH entry and paid README testing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://disconnect3d.pl/2026/10/02/dont-put-tilde-in-your-path/" rel="noopener noreferrer"&gt;Disconnect3d's October 2 demonstration&lt;/a&gt; resurfaced in the October 11 Hacker News discussion. Its quoted assignment appends &lt;code&gt;~/.local/bin/&lt;/code&gt; to PATH. Inside that quoted form, the tilde stays literal, so the entry is relative to the current directory. The author's demo finds a program beneath a directory actually named tilde and reports &lt;code&gt;hello&lt;/code&gt;. Home is unused by that literal entry; other PATH entries retain their own behavior.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html" rel="noopener noreferrer"&gt;Bash manual&lt;/a&gt; corroborates unquoted tilde expansion. The blog's correction uses &lt;code&gt;$HOME&lt;/code&gt; inside the quotes. Unquoted assignment semantics can also expand a tilde in Bash, so removing quotes indiscriminately misses the context of this example. Inspect the actual entry before changing shared-machine configuration. The account demonstrates lookup behavior and supplies no evidence of victims or a newly discovered shell vulnerability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shkspr.mobi/blog/2026/10/i-paid-people-to-try-and-follow-my-readme/" rel="noopener noreferrer"&gt;Terence Eden's README experiment&lt;/a&gt; cost around €150, with €25 paid for an hour of ActivityBot first-run testing. Testers shared screens and spoke aloud; Eden revised the README between sessions. Findings included a wrong demo link, confusing hidden-file instructions, and a missing explanation of what the software would do. These were informal sessions with no controlled success-rate improvement. The useful takeaway is to watch a fresh reader and fix the point where they hesitate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict: NEEDS REVIEW
&lt;/h2&gt;

&lt;p&gt;I'd keep using the app while checking which build and license my workflow depends on, then watch future feature parity. Bitwarden's present assurances and its future-component statement can coexist. My verdict reflects the additional review required by that boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Will Bitwarden's GPL version continue?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The announcement says the GPLv3 open-source version will continue getting updates on GitHub. This article reports that commitment; it cannot audit future delivery.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Bitwarden name a commercial-only future feature?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reply 4 names none. It says some future components will exist only in the commercial build and newly developed features will be evaluated case by case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the announcement remove the free plan?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It retains the free-forever plan commitment. No removal or price increase is inferred here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are ordinary downloaded-app users forbidden from using it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No such claim is established by this review. The repository source-module agreement and a distributed application's applicable terms need to be examined in their own context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://community.bitwarden.com/t/published-version-update-in-app-stores/102750" rel="noopener noreferrer"&gt;Bitwarden announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.bitwarden.com/t/published-version-update-in-app-stores/102750/4" rel="noopener noreferrer"&gt;RyanL on future components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.bitwarden.com/t/published-version-update-in-app-stores/102750/8" rel="noopener noreferrer"&gt;Direct-download clarification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bitwarden/clients/blob/main/LICENSE.txt" rel="noopener noreferrer"&gt;Client repository license map&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bitwarden/clients/blob/main/LICENSE_BITWARDEN.txt" rel="noopener noreferrer"&gt;Commercial source-module license&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitwarden.com/help/bitwarden-security-white-paper/" rel="noopener noreferrer"&gt;Bitwarden security whitepaper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://disconnect3d.pl/2026/10/02/dont-put-tilde-in-your-path/" rel="noopener noreferrer"&gt;Quoted tilde demonstration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html" rel="noopener noreferrer"&gt;GNU Bash tilde expansion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shkspr.mobi/blog/2026/10/i-paid-people-to-try-and-follow-my-readme/" rel="noopener noreferrer"&gt;Paid README testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article expands on an episode of **The Daily Diff&lt;/em&gt;&lt;em&gt;, a five-minute daily video on what shipped and what broke in tech.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=yRTyoEMMiJ8" rel="noopener noreferrer"&gt;Watch the episode&lt;/a&gt; · &lt;a href="https://www.youtube.com/@dailydiffdev?sub_confirmation=1" rel="noopener noreferrer"&gt;Subscribe on YouTube&lt;/a&gt; · the written diff lands in your inbox every morning at &lt;a href="https://thedailydiff.dev" rel="noopener noreferrer"&gt;thedailydiff.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://thedailydiff.dev/video/bitwarden-store-license/" rel="noopener noreferrer"&gt;Video transcript and primary sources&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bitwarden</category>
      <category>opensource</category>
      <category>gplv3</category>
      <category>softwarelicensing</category>
    </item>
  </channel>
</rss>
