Cover illustration

TheDaily Front

Issue No. #261001 Thursday, October 1 2026 #261001 — THURSDAY, OCTOBER 1, 2026
Agents harden, platforms tighten, and the chips keep getting dearer.
Thursday, October 1, 2026 The Daily Front No. #261001 — Contents
30stories
8,124points
4,420comments
274kllm tokens
Assembled with 31 model calls — 198,480 tokens read, 75,203 written.

Highlights

Pi 1.0

Pi reaches 1.0 with a deliberately minimal agent harness shaped by months of hardening and community use.

Clef: Open-weight decision models, and new RL fine-tuning platform

Cloudflare enters the decision-model race with open weights and an RL fine-tuning platform aimed at cheap, bounded automation.

Git 3.0's upcoming SHA-256 default will be a costly mistake

A deeply argued warning says Git’s coming SHA-256 default may create a painful migration with little practical upside.

Returning from vacation? The government can search your phone without a warrant

A border-search lawsuit renews attention on the extraordinary powers authorities claim over travelers’ phones.

Automatic Transmission – a data-privacy study of connected vehicles

A broad study of connected vehicles finds the modern car is increasingly a data-collection device on wheels.

From the Editor

The machine mind occupied most of the front page, but the old concerns remained plainly visible: who controls the tools, who sees the data, and who pays when the infrastructure bill comes due. There is progress in the air, certainly—though it has brought its lawyers, gatekeepers, and account managers along with it.

  1. Pi 1.03
  2. Clef: Open-weight decision models, and new RL fine-tuning platform4
  3. Pi Durable5
  4. Git 3.0's upcoming SHA-256 default will be a costly mistake6
  5. RIP, vector database7
  6. How to speed up the Rust compiler in September 20268
  7. Several vulnerabilities have been discovered in the Linux kernel9
  8. Cloudflare K2: serverless event streams10
  9. GPT-Synopsys: Frontier Intelligence to Revolutionize Chip Design11
  10. Automatic Transmission – a data-privacy study of connected vehicles12
  11. The death of web development education13
  12. RacketCon Is Saturday14
  13. SlutCon15
  14. Using Opus 5.5 to discover a new eyewitness record of the dodo16
  15. StreetComplete on iOS is now in public beta17
  16. Returning from vacation? The government can search your phone without a warrant18
  17. Google breaks promise to provide 10 years of updates to Chromebooks19
  18. Fuck Android Developer Verification Program20
  19. Figma restricts MCP access to whitelisted clients, excluding Pi21
  20. Micron CEO Says Memory Supply Will Be Much Tighter in 2027 and 2028 Than in 202622
  21. FTC is investigating OpenAI, Anthropic and other AI companies over product risks23
  22. Red Hat being phased out of existence?24
  23. SvelteKit 325
  24. Various Projects Find Hidden SDR Capabilities in ESP32 Microcontrollers26
  25. Context Language Models27
  26. Meta Uses A.I. Data Centers to Avoid Billions in Federal Taxes28
  27. Vote on which of Hacker News' challenges for AI have been met28
  28. 10-year Treasury yield climbs above 5.3% to a level not seen in 24 years28
  29. Ask HN: Who is hiring? (October 2026)29
  30. Cops Can Bypass iPhone's Automatic Reboot to Get into Locked Phones30
The Daily Front Page 2 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — The Durable Agent
article

Pi 1.0

by sergiotapia·▲ 1,084 points·338 comments·earendil.com ↗
Pi is known for being minimal. We care about holding that line.

Today we are proudly shipping Pi 1.0: a hardened, minimal, extensible agent harness that you can make your own. Hundreds of thousands of people around the world use Pi every week. Many of you submit issues and pull requests. Over the course of many months, we have used that feedback to improve, harden and evolve Pi into a stable piece of software that people and businesses can depend on.

Pi is known for being minimal. We care about holding that line. While agentic tooling changes every week, many of the changes do not last. Pi does not work that way. We wait until something has proven itself, and only then do we consider adopting it; weighing its true functionality against its inherent added complexity. We spoke more about that process and how it relates to Codemode and MCP earlier this week here.

The Pi 1.0 we are shipping today is a result of that process. Pi already ran the latest models from every major provider, became a daily driver coding agent for people around the world, and provided a supermalleable substrate on which to build agentic applications. With Pi 1.0 we are adding the following into Pi:

  • Codemode (native support for MCP, and non-LLM models like Jev and image models)
  • Extension support for virtual models
  • Deferred tool loading
  • Cache warming for anthropic models
  • Mid-conversation system messages (transcript-aware prompt and tool changes)
  • A new TUI theme
  • Full-screen mode by default

We have thought about many of these features for months. They were thrown up against the wall and stuck. The list of things that fell off the wall is much longer. When we use Pi with all these new features it feels like a major step forward, but it also still feels simple, like Pi.

Alongside this work of continually refining and evolving Pi, we also began to understand that there were aspects of Pi that did not fit the shape of how many people wanted to use it. At Earendil, we want to bring Pi's minimalism and the way it allows you to wield AI outside of the coding agent and outside of the terminal. It needs to be reachable from different surfaces and support longer-running conversations and tasks. In short, Pi must become more durable. Rather than stray from our minimal roots and try to make Pi something it wasn't, we combined that work into a new experimental package that we are shipping today, Pi Durable. Pi Durable is a new substrate for building long-running agentic applications that lets the builders and the users of those applications wield and steer the underlying intelligence with tremendous dexterity. It shares Pi's key principles, minimalism and supermalleability, but it extends those principles into new dimensions. Mario writes in more detail about how we crafted Pi Durable here.

Earendil was formed to craft software and open protocols that strengthen human agency. Today we are shipping tools to you all to help do just that. We're eager to hear feedback from you and to harness the future out in the open together.

Pi 1.0 is available today:

curl -fsSL https://pi.dev/install.sh | sh

or on Windows

powershell -c "irm https://pi.dev/install.ps1 | iex"

Pi Durable is available today as an experimental package:

npm install @earendil-works/pi-durable @earendil-works/pi-ai @earendil-works/chord

Both are MIT licensed. Documentation is at pi.dev. Code is at github.com/earendil-works/pi.

  1. Codemode: Pi writes a script that boils a week of commits down to a short summary
  2. Pi writes itself an extension: a virtual model that plans with Claude Opus and implements with GPT, with Jev deciding when to switch
  3. Reload, start a new session, and pick the new router/auto model
  4. Planning runs on Claude Opus
  5. Jev spots the switch to implementation and hands over to GPT 6 Luna
  6. ! runs the finished script
  7. /session breaks down cost per model and cache use
The Daily Front Page 3 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Decisions, Open-Weighted
article

Clef: Open-weight decision models, and new RL fine-tuning platform

by jasondavies·▲ 483 points·172 comments·blog.cloudflare.com ↗
A model that produces bounded structured outputs cheaply, quickly and consistently.

decision-index-vs-latency.png

Over the last few weeks, there has been lots of buzz around decision models such as Typesafe AI’s Jev System One model. While classifier models have been around for some time, Jev introduces a new decision model concept into the world of AI — a model that produces bounded structured outputs cheaply, quickly and consistently that can be added into a workflow when a decision is required. These models are capable enough to work over any set of inputs without constantly retraining the model to incorporate new classification categories. This contrasts with the world of Large Language Models (LLMs), which are largely non-deterministic, but are open-ended enough to reason and generate text and tool calls for agentic workloads.

Today, we’re releasing two Cloudflare-trained decision models, Clef and Clef-flash, hosted on Workers AI. Clef is currently the leader when evaluated against the Jev Decision Index, you can view full results on the live benchmark demo site. These models are smarter, faster, and fully Jev-API compatible, so you can experiment with these hosted models easily. We’re fully open-sourcing these models on Hugging Face under an Apache 2.0 license for you to run locally and experiment with yourselves.

Lastly, we’re excited to debut our new reinforcement learning (RL) product, which allows customers to fine-tune Clef to suit their use cases as well.

What is a decision model?

A decision model makes classifications to help agents decide how to act, based on certain probabilities. For example, you can pass in a customer support message (inputs) and ask if it is urgent and which team should handle it. A decision model will return typed answers with probabilities (outputs), which your code can use to route the ticket, trigger an escalation, or defer to a human. This means that a human does not necessarily need to be in the loop for agentic decisions anymore — agents can programmatically gather context, make decisions, and take actions on tasks, or defer to a human when needed.

Specifically at Cloudflare, we’ve been testing our new Clef model on our Threat Intelligence team to help us classify website domains. By giving a domain to Clef (with Browser Run) it can quickly identify categories that the domain falls under — for example, it might classify a domain with a 95% chance it is a fashion website, 85% ecommerce, <1% phishing, etc. This classification took our Clef model 2.2s to fetch, render, and classify the website. In contrast, our fastest general LLM gpt-oss-120b took 4.7s in the same workflow, and only returned two classifications. As a user, you can imagine how a 2x savings in latency and results can help us improve our threat intelligence workflows and be faster in identifying malicious or legitimate domains. Generalize this to any use case where you need to make quick programmatic decisions, and you unlock powerful agentic workflows that are able to autonomously decide, reason, and execute.

In music theory, a clef is a symbol placed at the beginning of a musical staff that assigns specific pitch names to the lines and spaces. A decision model is analogous to a music clef because it helps define the domain of the context and the subsequent notes (actions) that follow it. We chose Clef as the name of our family of decision models, as it serves similar purposes, and the CF hearkens to Cloudflare.

How is Clef different from other decision models?

Although the market is getting increasingly saturated with decision models, Clef has some unique properties that make us excited to release it to the public. First, it has a vision encoder so it’s able to take in images and classify visual content. This is different from Jev, which only does text classification today. Secondly, our model has a 64k context window (compared to Jev’s 32k), which allows users to squeeze more input state for the model to classify against.

Third, our model is accurate and powerful, scoring competitively against other decision models on the market across various quality benchmarks. We shortlisted some evaluations below that are important for decision-making as defined by the Jev Decision Index and scored some of the more popular models on the market for it. Check out the table below for benchmarks, or view the scores on our live decision index demo site:

Benchmark Clef Clef-flash Jev DiffusionGemma Jev Kev 9B Laya
BFCL · case exact 98.47 98.76 95.75 96.52 94.51 38.13
ToolRet · nDCG@10 69.19 66.43 65.28 61.21 64.26 12.69
API-Bank · accuracy 91.93 93.11 88.19 83.66 56.30 11.41
Home appliances · case exact 82.95 97.73 52.27 42.05 25.00 0.00
When2Call · accuracy 72.37 65.58 80.97 75.44 49.62 11.94
BANKING77 · macro-F1 94.20 90.93 79.74 74.28 84.83 14.29
CLINC150+OOS · macro-F1 97.43 66.77 89.27 83.49 79.03 3.19
BRIGHT · nDCG@10 45.91 39.26 47.52 42.94 38.53 19.90
Amazon ESCI · macro-F1 57.48 57.39 55.21 53.37 49.22 24.40
PhishNChips · accuracy 79.60 75.05 62.55 85.35 50.75 50.15

We also ran benchmarks across Typesafe’s own eval suite and our Clef models fared well, beating Jev in 3 out of 4 areas. Notably, our Clef-flash performs exceptionally well, given how much faster it is.

Workflow Clef Clef-flash Jev
Invoice processing 64.7 57.1 61.8
Customer service 76.3 77 76.0
Security incidents 62.9 61.7 61.7
Agent trace observability 68.5 69.8 71.6

Across the 43 eval benchmarks that we ran, our Clef models beat the decision models on latency (except for Laya which is very fast but trades off quality in the benchmarks above):

Benchmark Clef Clef-flash Jev DiffusionGemma Jev Kev-9B Laya
Median latency · ms 209.3 38.8 524.1 84.4 51.4 5.8
p95 latency · ms 238.6 122.4 536.0 211.2 187.9 222.5

On top of the latency benefits from the model itself, our Clef models are hosted on Workers AI. Because they are hosted on Cloudflare’s infrastructure, we’re able to take advantage of our GPUs at the edge, leading to low network latency and faster decisions. This means that you could put Clef into the hot path for agents to make decisions and combine that with one of our LLMs on Workers AI to take action.

curl https://api.cloudflare.com/client/v4/accounts/$CLOUDFLARE_ACCOUNT_ID/ai/run/@cf/cloudflare/clef \
  -X POST \
  -H "Authorization: Bearer $CLOUDFLARE_AUTH_TOKEN" \
  -d '{
    "model": "clef",
    "state": "Checkout has been failing for every customer for the last hour.",
    "questions": {
      "urgent": { "type": "noul", "instructions": "Is this support request urgent?" },
      "team": {
        "type": "choice",
        "instructions": "Which team should handle this request?",
        "criteria": {
          "billing": "Payments, invoices, and refunds",
          "technical": "Outages, errors, and configuration",
          "sales": "Plans and upgrades"
        }
      },
      "severity": {
        "type": "score",
        "instructions": "How severe is the customer impact?",
        "criteria": ["No impact", "Minor", "Major", "Critical"]
      }
    }
  }'

Clef also produces strictly typed outputs similar to Jev and is fully API-compatible, so you can make the swap extremely easily. The larger Clef model is your more powerful precision model, while the Clef-Flash model is great for latency-critical decisions. The models are enterprise-ready with our guarantee that we don’t read, store, or train on your requests or responses (unless you want to use our fine-tuning product, which we go into below). You can get started with the Clef models today, starting with our developer documentation or play around with the open-source model on the Hugging Face repo.

If you’d like help tuning Clef for a specific workload, we are also offering fine-tuning services — first as a hands-on partner with our forward-deployed engineer (FDE) team, and then later as a self-serve fine-tuning platform for customers to train and redeploy the model onto Cloudflare.

How we trained Clef

In the same week that Jev came out, we posted about some experiments we had with our own homegrown decision model. Our demo goes into how we adapted the DiffusionGemma model to output deterministic probabilities by exposing the logprobs that are generated by a large language model. Our initial approach built upon independent research by Matt Mastracci, who has been active in the machine learning (ML) community with sharing new ideas and pull requests to vLLM inference engine to make DiffusionGemma support stronger.

Clef builds upon this concept, but uses a different base model as the backbone. We currently use Qwen as the base model and post-trained it to suit decision model use cases. During inference, Clef uses Qwen for a prefill-only pass, then scores the valid schema choices in parallel. The decision step is non-autoregressive, so there’s no intermediate text to generate token by token, making Clef significantly faster than autoregressive LLMs. Rather than generating intermediate text to produce structured answers, Clef and Clef-flash derive schema choices directly from internal backbone representations. This approach relies on a specialized two-stage attention routing process: every valid choice extracts context relevant to the prompt, allowing individual field parameters to cross-attend with other fields and back to the original payload prior to scoring. By leveraging a lexical prior, the model preserves semantic intent across options. Ultimately, the architecture unites option-specific evidence routing, joint cross-field attention, and schema-bound scoring.

By freezing Qwen3.8-27B for Clef and Qwen3.5-9B for Clef-flash, we jointly optimized the routing head alongside rank-256 low-rank adapters. Our post-training utilizes label-smoothed cross-entropy for valid schema outputs paired with a Brier loss to refine probability calibration. This training leverages our own internal synthetic datasets permutating field orders, prompts, and schema structures. We also developed Reinforcement Learning for Calibrated Decisions (RLCD) to serve as a secondary optimization target, granting partial credit to adjacent ordinal choices, rewarding fully precise record outputs, and applying a reference penalty to prevent distribution shift, giving us better accuracy and generalization.

This means that we were able to achieve a few novel things with Clef: we improved accuracy of the model in classification, constrained it to output only probabilities instead of text generation, and made it faster than Jev and the base Qwen models.

How fine-tuning can extend the capabilities of Clef

We heard a lot of internal use cases that required fine-tuning our Clef model to be built into our agentic workflows at Cloudflare. For example, internal teams want a classifier model to be able to evaluate Trust & Safety submissions, help us triage Cloudflare Support requests, or even to be built-in to our Bot products to decide if a crawler is a good bot or bad bot.

These use cases are incredibly specific and we have had many years of labelled decisions that we could use to train a specific classifier. When you fine-tune a model, you may give up some general purpose performance in exchange for higher accuracy in a specific domain.. Because Cloudflare has more than 15 years of network data across different domains, we can fine-tune a model to fit these specific use cases which is more accurate and faster than our generic Clef model. We’re working with internal teams already to figure out how we can post-train Clef to create powerful ML models that boost our impact and improve workflows across Cloudflare. These internal teams and use cases are the next remit of our new FDE fine-tuning team and basis for our reinforcement learning (RL) product.

Our new RL service

We are offering a service to help customers fine-tune Clef to suit their workloads with our hands-on FDE team. From that, we’ll learn from our hands-on experiences to build a self-serve platform that customers can use to capture data, fine-tune, and redeploy the model, all on Cloudflare.

This has actually been a long time coming — we’ve been building our AI platform to have the right primitives where we could be building a custom RL product. The interest in Jev shows the need for a fast, small, specific, classifier model, and we chose this to be our niche to start experimenting with RL environments.

To do this, we leverage the primitives that we already have built on our Cloudflare platform:

  • Cloudflare AI Gateway – pass all your AI traffic through AI Gateway and automatically create a dataset of requests for your use case
  • Cloudflare Workers AI – generate rollouts against the base Clef model
  • Cloudflare Containers – RL sandbox for scoring and replaying agent actions
  • [NEW] Trainer – update weights of fine-tuned Clef model
  • Cloudflare Workers AI + BYO Model – redeploy the fine-tuned model on Workers AI

This combines a few work-in-progress pieces of the AI Platform that we’ve been working on, including AI Gateway that captures your AI traffic so you can leverage your own request/response data, Containers for RL Sandboxes, and Workers AI’s Bring Your Own Model (Cog) work that has been progressing since our acquisition of Replicate.

Try it out today

We’re excited to launch our first Cloudflare-trained ML model from the Workers AI team today. We’re still early here and have a lot more improvements in store, but it is a wonderful first showcase of the hard work we’ve been doing on the AI Platform team. We believe that Clef has the ability to disrupt the way we use agents, which fits naturally into Cloudflare’s mission of being the agent cloud.

If you have specific use cases and are already customers of these products — we’d love to chat with you and be design partners as we experiment in this space.

Try out the Clef models hosted on Workers AI, download the weights on Hugging Face if you’d like to explore for yourself, and reach out if you have fine-tuning use cases you’d like us to help with.

Our ML team has been growing in impact, from model optimizations to model training research. If you’re interested in joining our mission, check out our open roles.

The Daily Front Page 4 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Pi Beyond the Prompt
article

Pi Durable

by paulsmith·▲ 330 points·38 comments·earendil.com ↗
Pi Durable was built specifically for long-running, durable, and malleable agents that can run anywhere.

Today Earendil and the Pi community shipped Pi 1.0. This reflects our belief that after countless hours of hardening, maintenance, and active development, Pi is now a solid foundation on which to build. Pi also continues to evolve. Together with Pi 1.0, we are shipping an experimental new package called Pi Durable. Pi Durable was built specifically for long-running, durable, and malleable agents that can run anywhere. We would like you to join in the fun and help us make it the best durable harness there is.

Why Pi Durable?

Pi the coding agent is built to run on your (remote) machine, inside a terminal, driven by one person. If the process dies, you look at what happened and tell it to continue. That is what Pi 1.0 focuses on and excels at, and that is not changing.

At Earendil, we want to bring this technology to everyone, in whatever form fits their needs best. For that, we need a harness that runs anywhere, can be reached from different surfaces, supports infinitely long conversations, survives catastrophic internal and external failures, and lets multiple humans steer the same agents.

Pi Durable is that harness. It does not replace the Pi coding agent. It is a framework for building any agentic application, coding agents included. It shares not only code with the Pi coding agent, like pi-ai, but also its principles: minimalism and malleability.

It also lets us explore designs in this space without disrupting Pi the coding agent. Lessons we learn building agentic applications on Pi Durable will flow back into Pi the coding agent as they prove themselves valuable.

What is a harness?

Everybody has their own definition of a harness. We wrote about this previously, but let us reintroduce the concept of the harness for Pi Durable.

A harness is storage plus the machinery needed to run one or more conversations with large language models in parallel. It provides the tools those models call, and the execution environments the tools run in.

A conversation is an interaction between you and an agent, recorded as a transcript. The agent is the large language model together with its settings, like the thinking level, and the tools it can call.

Tools do their work through an execution environment, which can be your laptop, a remote VM, or an in-memory sandbox. Which tools and which execution environment an agent gets is up to each conversation.

Everything the harness runs, from calling the model to executing a tool, is a task.

Like everything in Pi, Pi Durable is built so your agent can understand it. The entire source code, without tests, is about 15,000 lines, which comes out to about 150,000 tokens with GPT and about 250,000 with Claude. That's the worst case. To build on Pi Durable, your agent rarely needs all of it; the storage backends alone are 3,000 lines it can usually skip.

Now let us give you a little tour of Pi Durable, to illustrate what we built and why we built it.

Long runs anywhere

We want agents to run for a long time and to be able to run anywhere, where anywhere currently means anywhere there is a JavaScript runtime.

In Pi Durable, a harness opens over a storage backend. Pi Durable ships memory, SQLite, and JSONL storage, plus a conformance suite and benchmarks for your own backend. The SQLite and JSONL storage code uses no Node APIs, so with a small adapter it runs on Bun or inside a Cloudflare Durable Object. The storage interface is small and easy to implement on top of whatever you have, like a key-value store or Postgres. One process owns a storage at a time, and other clients attach to that process.

On SQLite, the harness only keeps the working set in memory: the active transcripts, live tasks, and pending submissions. Everything else stays on disk until it is needed. Active transcripts are naturally bounded by the model's context window, because compaction summarizes older messages before they overflow it. So even a conversation with tens of thousands of messages fits snugly into memory.

Tools that need files or a shell get them from an execution environment. Pi Durable ships a Node execution environment, which gives tools access to your local files. Like storage, the execution environment interface is small and easy to implement, so you can also expose remote execution environments to your tools. That allows the harness to run on one machine while its tools run on another. Your env function builds the environment for every tool call, from the conversation's working directory, so each conversation can run in a different place.

import { BACKGROUND_CONTEXT } from "@earendil-works/chord/context";
import { createModels } from "@earendil-works/pi-ai/models";
import { openaiProvider } from "@earendil-works/pi-ai/providers/openai";
import { createRegistry, Harness } from "@earendil-works/pi-durable";
import { NodeExecutionEnv } from "@earendil-works/pi-durable/env/node";
import {
    openNodeSqliteStorage,
} from "@earendil-works/pi-durable/storage/sqlite/node";
import { CodingTools } from "@earendil-works/pi-durable/tools";

const context = BACKGROUND_CONTEXT; // every call takes a context for cancellation
const models = createModels();
models.setProvider(openaiProvider());

const registry = createRegistry();
registry.install(CodingTools); // read, write, edit, bash

const env = ({ cwd }: { cwd?: string }) =>
    new NodeExecutionEnv({ cwd: cwd ?? process.cwd() });
const harness = await Harness.open(
    await openNodeSqliteStorage("./agent.sqlite"),
    { models, registry, env },
    context,
);
// The root conversation: created on first use, and the same one after every
// restart.
const root = await harness.root(context, {
    agent: {
        model: { provider: "openai", modelId: "gpt-6.1-sol" },
        cwd: "/work/repo",
    },
});

Survives crashes

We want an agent to survive its process dying, whether the laptop sleeps, the container is redeployed, or the machine runs out of memory, and to pick up where it left off.

In Pi Durable, every step of a run is a task that stores a checkpoint before it moves on. If the process dies, a new process opens the same storage, finds the unfinished tasks, and continues each one from its last checkpoint. A model request that was cut off is sent again; the partial answer stays in the transcript, marked as aborted. A tool call that was cut off reruns if it is safe to; otherwise the model is told it was interrupted. Pi Durable has no built-in subagents, but they take a few lines of code to build, as the triage tool below shows. A subagent runs in a conversation of its own, so it continues from where it left off too, and a subagent tool that is safe to rerun finds its subagent again and waits for its answer. Queued messages are still queued. A requestId makes a submission exactly-once, so a client that retries after a crash gets the original submission back instead of asking twice.

const job = {
    type: "input",
    content: "Fix the flaky login test",
    requestId: "job-42",
} as const;
await root.submit(job, context);
// The process dies here, in the middle of a tool call.

// A new process opens the same storage.
const harness = await Harness.open(
    await openNodeSqliteStorage("./agent.sqlite"),
    { models, registry, env },
    context,
);
harness.resume(); // continue the interrupted run
const root = await harness.root(context);
// the same submission, answered
const settled = await (await root.submit(job, context)).wait(context);

Many conversations at once

We want one harness to run many conversations at the same time, without one blocking another.

In Pi Durable, one harness runs as many conversations as you need, concurrently, all with the same guarantees. A conversation starts fresh or forks another one at any point in its transcript, and sees the parent's history up to that point without copying it.

Think of a Slack channel where your agent answers mentions from anyone. Then somebody opens a thread. The channel can be one conversation, and the thread a fork of it at the message the thread replies to. Both run at the same time and neither blocks the other.

const channel = await harness.root(context);
const question = await channel.submit(
    { type: "input", content: "@agent why did the deploy fail?" },
    context,
);
const answered = await question.wait(context);

// Someone replies to the agent's answer in a thread. Every conversation names
// its owner, which decides what an abort reaches (more on that under Tasks).
// The thread has none.
const thread = await channel.fork(
    answered.answer!,
    { ownership: { kind: "ownerless" } },
    context,
);

// Both conversations work at the same time.
const inThread = await thread.submit(
    { type: "input", content: "@agent can we roll it back?" },
    context,
);
const inChannel = await channel.submit(
    { type: "input", content: "@agent who is on call today?" },
    context,
);
await Promise.all([inThread.wait(context), inChannel.wait(context)]);

Each conversation also stores its own agent: the model, the thinking level, the selected extensions and which of their tools are active, extra instructions, and the working directory in its execution environment. A reviewer next to the main agent can use a cheaper model, read-only tools, and its own checkout.

Extensions

We want everything an agent can do to be pluggable, and every plugged-in piece to take part in durability.

In Pi Durable, an extension is a named bundle of system prompt sections, tools, hooks, and tasks. The application installs extensions in a registry. Each conversation selects which extensions and tools it uses, and stores only their names.

System prompt sections

The system prompt is rebuilt from the sections of the conversation's extensions before every request, so a changed section is picked up by the next request. Pi Durable records what changed in the transcript, at the position where it changed, so a restart or a fork sees exactly what the model saw. On models that support system prompt and tool changes in the middle of a conversation, only the change is sent, so the prompt cache stays valid.

import { defineExtension, section } from "@earendil-works/pi-durable";

const ProjectContext = defineExtension({
    name: "project-context",
    sections: [
        // Read from the conversation's execution environment. The files can be
        // loaded and watched in the background; every request renders the
        // latest state.
        section("agents_md", (input) => agentsMd.latest(input.env)),
        section("skills", (input) => skills.latest(input.env)),
    ],
});

Tools

Every tool call runs as its own durable task, and its intent is stored before it runs. After a crash, a tool reruns only if it says that is safe. Otherwise the model is told the call was interrupted, with the output stored so far, and decides what to do. Each conversation can also get its own set of tools, like the Slack thread from earlier, which may search but not deploy.

import { Type } from "@earendil-works/pi-ai";
import { defineTool } from "@earendil-works/pi-durable";

const searchIssues = defineTool({
    name: "search_issues",
    description: "Search the issue tracker",
    parameters: Type.Object({ query: Type.String() }),
    replay: "safe", // only reads, so a rerun after a crash is fine
    execute: async (args, api) => {
        // streamed to every client watching
        api.output(`searching for ${args.query}\n`);
        return {
            content: [{ type: "text", text: await tracker.search(args.query) }],
        };
    },
});

const deploy = defineTool({
    name: "deploy",
    description: "Deploy a version to production",
    parameters: Type.Object({ version: Type.String() }),
    // No replay: a deploy interrupted by a crash is reported to the model,
    // never repeated.
    execute: async (args) => ({
        content: [{ type: "text", text: await ci.deploy(args.version) }],
    }),
});

registry.install(defineExtension({ name: "ops", tools: [searchIssues, deploy] }));

// The thread may search, but not deploy.
await thread.configure({ tools: { remove: [deploy] } }, context);

A tool gets the harness API for its call: it can commit entries and documents, start tasks and conversations, and talk to other conversations. That makes a subagent a few lines of code. A tool creates a conversation it owns, gives it a smaller model and its own instructions, and waits for its answer. The subagent is a conversation like any other, so it survives a crash, counts its own cost, and a UI can show it under the call.

import type { AssistantMessage } from "@earendil-works/pi-ai";
import { AssistantEntry, configure } from "@earendil-works/pi-durable";

const triage = defineTool({
    name: "triage",
    description: "Label an incoming issue as bug, feature, or question",
    parameters: Type.Object({ issue: Type.String() }),
    // a rerun after a crash finds the same subagent and the same submission
    replay: "safe",
    execute: async (args, api, context) => {
        const child = await api.commit(async (tx) => {
            const existing = (
                await tx.scanConversations({ ownerTaskId: api.taskId }, 1)
            ).items[0];
            if (existing !== undefined) return existing.id;
            // Owned by this call, so aborting the call aborts the subagent.
            const created = await tx.createConversation({
                ownership: { kind: "task", taskId: api.taskId },
            });
            // It starts as a copy of this conversation's agent. Make it a small
            // model without tools.
            await configure(tx, created.id, {
                model: { provider: "openai", modelId: "gpt-6-luna" },
                tools: [],
                instructions: "Answer with one word: bug, feature, or question.",
            });
            return created.id;
        }, context);
        // lets a UI show the subagent under the call
        await api.details({ conversationId: child }, context);
        const subagent = await api.conversation(child, context);
        const request = {
            type: "input",
            content: args.issue,
            requestId: `triage:${api.taskId}`,
        } as const;
        const settled = await (
            await subagent!.submit(request, context)
        ).wait(context);
        // The answer is an entry in the subagent's transcript. Read it and take
        // its text.
        const entry = await api.commit(
            (tx) => tx.entry(AssistantEntry, settled.answer!),
            context,
        );
        const message = entry?.model?.[0] as AssistantMessage;
        const text = message.content
            .flatMap((content) => (content.type === "text" ? [content.text] : []))
            .join("");
        return { content: [{ type: "text", text }] };
    },
});

Extensions can also change other extensions' tools. A tool with the same name in a later extension replaces the earlier one, for example a bash that runs inside a Python virtualenv. A wrap decorates whichever tool won, wherever the wrapping extension is selected.

import { wrapTool } from "@earendil-works/pi-durable";
import { createBashTool } from "@earendil-works/pi-durable/tools";

// Times every bash call, whichever bash the conversation ends up with.
const Timing = defineExtension({
    name: "timing",
    wraps: [
        wrapTool(createBashTool(), (bash) => ({
            ...bash,
            execute: async (args, api, context) => {
                const start = Date.now();
                try {
                    return await bash.execute(args, api, context);
                } finally {
                    metrics.record("bash", Date.now() - start);
                }
            },
        })),
    ],
});

Hooks

Hooks let extensions step into tasks, including the built-in tasks for generating a model response, invoking a tool, or performing compaction. They can rewrite a request before it goes to the model, block or rewrite a tool call, replace a result, keep a run going, or write a summary themselves. A hook can run again after a crash, so a hook that makes a decision stores it in a memo: a small value stored with the task, where the first write wins.

import { hook, ToolTask } from "@earendil-works/pi-durable";

const Approval = defineExtension({
    name: "approval",
    hooks: [
        hook(ToolTask, {
            beforeTool: async (call, api, context) => {
                if (call.name !== "deploy") return undefined;
                // After a restart, the hook finds the stored answer instead of
                // asking again.
                let approved = await api.memo<boolean>(
                    "approval:deploy",
                    context,
                );
                approved ??= await api.memo(
                    "approval:deploy",
                    await askInSlack(call),
                    context,
                );
                return approved
                    ? undefined
                    : { block: "Nobody approved the deploy." };
            },
        }),
    ],
});

Several extensions can hook the same thing. Their hooks run as a chain, in the order the conversation selects the extensions, and each hook defines how its chain runs. beforeTool passes rewritten arguments down the chain, and the first block stops it. afterTool passes the result down the chain. onYield stops at the first hook that keeps the run going. Observers like afterResponse always run them all. A hook that throws is reported, and the chain continues, except in beforeTool, where a throw blocks the call.

Tasks

The harness runs conversations with built-in tasks: one for each model request, one for each tool call, and one for compaction. Extensions bring their own tasks and get the same machinery: a checkpoint after every step, timers that survive restarts, and waiting on other tasks.

A checkout that splits the bill across several cards charges every card at once. If one card is declined, the other payments are aborted and refund themselves:

import { defineTask, type TaskId } from "@earendil-works/pi-durable";

const Payment = defineTask<{ card: string }, { phase: "charge" }, string>({
    name: "shop.payment",
    version: 1,
    initial: () => ({ phase: "charge" }),
    phases: {
        charge: async (task, runtime, context) => {
            // The key makes the charge idempotent: if a crash reruns this
            // phase, the card is only charged once.
            const charge = await bank.charge(
                task.input.card,
                `payment-${task.id}`,
            );
            await runtime.commit(
                () => ({
                    status: "terminal",
                    outcome: charge.ok
                        ? { status: "completed", result: charge.receipt }
                        : { status: "failed", error: { message: charge.error } },
                }),
                context,
            );
        },
    },
    // Another payment failed, or the checkout was cancelled: undo this one.
    abort: async (task, runtime, context) => {
        await bank.refund(`payment-${task.id}`);
        await runtime.commit(
            () => ({ status: "terminal", outcome: { status: "aborted" } }),
            context,
        );
    },
});

type CheckoutState =
    | { phase: "pay" }
    | { phase: "decide"; payments: TaskId<string>[] };
const Checkout = defineTask<{ cards: string[] }, CheckoutState, string>({
    name: "shop.checkout",
    version: 1,
    initial: () => ({ phase: "pay" }),
    phases: {
        pay: async (task, runtime, context) => {
            await runtime.commit(async (tx) => {
                const payments: TaskId<string>[] = [];
                for (const card of task.input.cards) {
                    payments.push(
                        await tx.createTask(Payment, { card }, {
                            ownership: { kind: "task", taskId: task.id },
                        }),
                    );
                }
                // Run no code until every payment is done. The first failed
                // payment aborts the others.
                return {
                    status: "waiting",
                    checkpoint: { phase: "decide", payments },
                    on: payments,
                    policy: "failFast",
                };
            }, context);
        },
        decide: async (task, runtime, context) => {
            const outcomes = await runtime.outcomes(
                task.state.checkpoint.payments,
                context,
            );
            const paid = outcomes.every(
                (outcome) => outcome.status === "completed",
            );
            await runtime.commit(
                () => ({
                    status: "terminal",
                    outcome: paid
                        ? { status: "completed", result: "Order placed." }
                        : {
                            status: "failed",
                            error: { message: "A payment failed." },
                        },
                }),
                context,
            );
        },
    },
    abort: (_task, runtime, context) =>
        runtime.commit(
            () => ({ status: "terminal", outcome: { status: "aborted" } }),
            context,
        ),
});

// The agent starts a checkout with a tool.
const checkout = defineTool({
    name: "checkout",
    description: "Pay for the cart, split across several cards",
    parameters: Type.Object({ cards: Type.Array(Type.String()) }),
    execute: async (args, api, context) => {
        // Owned by this call: aborting the call aborts the checkout and refunds
        // its payments.
        const owner = {
            ownership: { kind: "task", taskId: api.taskId },
        } as const;
        const id = await api.createTask(
            Checkout,
            { cards: args.cards },
            owner,
            context,
        );
        const { outcome } = (await api.waitForTask(id, context)).state;
        const text =
            outcome.status === "completed" ? outcome.result : outcome.status;
        return { content: [{ type: "text", text }] };
    },
});

registry.install(defineExtension({
    name: "shop",
    tools: [checkout],
    tasks: [Payment, Checkout],
}));

Tasks and conversations form one ownership tree. Aborting a task aborts what it owns, bottom-up, so every task cleans up its own effects first, and a task only finishes once the work it owns has finished. A subagent is the same pattern: a conversation owned by the tool call that started it.

Tasks are foreground by default: they are part of the conversation's current work. The conversation is idle only once they are done, and aborting the conversation, for example when the user presses Esc, aborts them and everything they own. A background task belongs to the conversation, but not to its current work. The conversation goes idle while it runs, and an ordinary abort leaves it and everything it owns alone. That fits a subagent that should outlive the turn that started it, or a reminder that fires tomorrow. Aborting the task itself, or the conversation with { background: true }, still stops it.

// Part of the current work: Esc aborts it, and the conversation waits for it.
await api.createTask(
    Checkout,
    input,
    { ownership: { kind: "task", taskId: api.taskId } },
    context,
);

// Side work: the conversation goes idle while it runs, and Esc leaves it alone.
await api.createTask(
    Reminder,
    input,
    { ownership: { kind: "conversation" }, background: true },
    context,
);

Compaction

We want long conversations to keep going without the agent stopping to summarize.

In Pi Durable, compaction is a task like any other, and it runs while the conversation keeps going. When the context gets close to the model's limit, a background compaction summarizes the older messages, and the summary is placed at the next turn boundary. The conversation only waits for a summary when the next request would not fit otherwise. If the provider still rejects a request as too long, the harness compacts and retries once. You can also compact manually at any time, with your own instructions. The older messages always stay in storage.

const harness = await Harness.open(storage, {
    models,
    registry,
    settings: {
        compaction: {
            // past contextWindow - reserveTokens, the next request waits for a
            // summary
            reserveTokens: 16384,
            // this far before that, a summary starts in the background
            backgroundTokens: 32768,
        },
    },
}, context);

// Manual, also while the agent is working.
await root.compact("Keep the names of the failing tests", context);

reset() goes further: it starts a new context, optionally from a handoff note, and a tool can ask for the same by returning control: { handoff }. Because nothing is deleted, a second tool can still search everything before the handoff. That is all it takes to build an agent that hands off to itself and looks things up later.

const handoff = defineTool({
    name: "handoff",
    description:
        "Start over from a handoff note. " +
        "Older messages stay searchable with search_history.",
    parameters: Type.Object({ note: Type.String() }),
    execute: async (args, api, context) => {
        // Queued behind the handoff, so it starts the next run in the new
        // context.
        const self = await api.conversation(api.conversationId, context);
        await self!.submit(
            {
                type: "input",
                content: "Continue.",
                requestId: `handoff:${api.taskId}`,
            },
            context,
        );
        // Ends this run and starts a new context from the note, like
        // reset(note).
        return {
            content: [{ type: "text", text: "Handing off." }],
            control: { handoff: args.note },
        };
    },
});

const searchHistory = defineTool({
    name: "search_history",
    description: "Search older messages, including those before a handoff",
    parameters: Type.Object({ text: Type.String() }),
    replay: "safe",
    execute: async (args, api, context) => {
        // Tools read records through a transaction too. One that writes
        // nothing stores nothing.
        const page = await api.commit(
            (tx) => tx.scanEntries({ conversationId: api.conversationId }, 200),
            context,
        );
        const hits = page.items.filter((entry) =>
            JSON.stringify(entry.model ?? []).includes(args.text),
        );
        const text = hits.map((entry) => JSON.stringify(entry.model)).join("\n");
        return { content: [{ type: "text", text }] };
    },
});

Durable application state

We want the state of the application built on the agent to be as durable as the conversation itself.

In Pi Durable, application state, like a todo list, a plan, a ticket, or the sandbox a conversation runs in, lives in documents. Documents are typed JSON stored next to the transcript and changed in the same atomic commits, so the state never disagrees with the transcript that produced it. Each document says what a fork starts with: the parent's value at the fork point, its current value, or a fresh one.

import { defineDoc } from "@earendil-works/pi-durable";

const Todos = defineDoc<{ items: string[] }>({
    kind: "app.todos",
    version: 1,
    scope: "conversation",
    history: "rewindable",
    fork: "asOf", // a fork starts with the todos its parent had at the fork entry
    initial: () => ({ items: [] }),
});

const Todo = defineExtension({
    name: "todo",
    tools: [
        defineTool({
            name: "todo",
            description: "Add an item to your todo list",
            parameters: Type.Object({ item: Type.String() }),
            execute: async (args, api, context) => {
                await api.commit(async (tx) => {
                    const todos = await tx.doc(Todos, api.conversationId);
                    todos.items.push(args.item);
                }, context);
                const text = `Added ${args.item}`;
                return { content: [{ type: "text", text }] };
            },
        }),
    ],
    // The model sees the list before every request.
    sections: [
        section("todos", async (input, context) => {
            const todos = await input.read.snapshot(
                Todos,
                input.conversationId,
                context,
            );
            return todos?.items.join("\n") || undefined;
        }),
    ],
});

// A UI subscribes to the committed value.
const todos = await harness.documentState(Todos, channel.id, context);
todos?.subscribe((value) => renderTodos(value?.items ?? []));

Malleable

We want to change the code of a running agent without stopping it.

In Pi Durable, the registry can change while conversations run. Installing an extension under a name that is already installed replaces it in one step. A tool call that is already running finishes on the code it started with; the next call uses the new code. Conversations store extension and tool names, never code, so after a restart they pick up whatever the new process installs.

// The extension's file changed on disk.
// same name "ops": replaces the installed one
registry.install(await loadExtension("./ops.ts"));

Multiplayer

We want many people and clients to work with the same conversations at once: watch them, join late, and steer them.

In Pi Durable, everything a UI needs is committed state, so any number of clients can attach to any conversation in the harness. A client gets the current view first: the transcript, the answer being streamed, running tools and their output, queued messages, the agent, and usage. After that it only gets what changes. A client that joins late or reconnects starts from the current view. Any client can steer a running conversation or queue a follow-up.

// A second client joins the thread while the agent is working.
const view = await thread.viewState(context);
render(view.value);
view.subscribe((value) => render(value));

// And steers it. The message joins the running work after the current tool
// calls.
await thread.submit(
    { type: "input", content: "Check the staging logs first", whenBusy: "steer" },
    context,
);

For a remote client, thread.watch() delivers the exact operations of every commit, small enough to send over a socket. If you prefer the coding agent's familiar events, watchEvents() turns the commits into those, at the cost of more bytes on the wire.

Try it

You can try Pi Durable today. Pi Durable is experimental, and the API might still change. Point your agent at packages/durable in a Pi checkout, have it read the README, the over thirty examples, the small coding agent on Pi Durable, or this beautiful vacation planning agent, and get building.

The vacation planner is about 1,300 lines of TypeScript, most of them the TUI. If it looks like a coding agent, that's only because it borrows its TUI components from the Pi coding agent.

To run both demos from a Pi checkout:

npm install && npm run build
node packages/coding-agent/src/experimental/durable/main.ts
node packages/coding-agent/src/experimental/vacation/main.ts

To build on Pi Durable in your own project:

npm install @earendil-works/pi-durable @earendil-works/pi-ai @earendil-works/chord

In the coming weeks, we will talk more about Pi Durable and show you the small agentic tools we build with it to help us work, like a Slack bot or a GitHub triage bot. We don't want to spill the beans yet. There is more coming as we use Pi Durable ourselves, just like we use Pi.

FAQ

Why TypeScript again?

Because it is the easiest way to bootstrap this. But as everybody knows by now, it's very easy to port everything to Rust or assembler. We're not ruling this out in the future, but at the moment we are focusing on TypeScript.

The Daily Front Page 5 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — The Hashing Reckoning
article

Git 3.0's upcoming SHA-256 default will be a costly mistake

by chmaynard·▲ 315 points·305 comments·blog.gitbutler.com ↗
Git 3.0 will make SHA-256 the new default content hashing algorithm.

Git 3.0 will make SHA-256 the new default content hashing algorithm and it will be an incomprehensibly expensive and ultimately valueless and avoidable global nightmare.

Git 3.0's upcoming SHA-256 default will be a costly mistake

Where to begin?

I've been sitting on this for a few years, mostly because there are smarter people who have been concentrating on this and I don't love being a back seat driver. However, I think that the Git 3.0 release is about to cost everyone a lot of time and angst for little benefit, and virtually nobody knows what's coming.

So grab some popcorn and let me tell you a tale of how one of the new upcoming Git 3.0 breaking changes is about to be a huge, costly, global train wreck of a change for almost no practical value.

SHA-1 in Git Primer

I'll keep this short as many of you probably know this at a basic level.

Git is what's known as a content addressable database. This means that if you want to store and transmit data in it, Git will calculate a hash of the contents and use that in a key/value database as the key (the value being the content). The same content always gets the same hash, globally.

Git's use of SHA-1 hashes as keys in it's key-value object database

Git's use of SHA-1 hashes as keys in it's key-value object database

This is nice, because it means that the same file content is never stored twice. There is also a cool property where commits encode the hash of the commit that came before it, which means that this integrity essentially propagates - you can't change the hash of anything without changing the hash of everything that comes after it. This gives it "cryptographic integrity", meaning that hashing the latest commit essentially also hashes potentially millions of file contents, trees and commits that came before it.

In Git, this hash function has always been SHA-1. This was what Linus picked in 2005 when Git was started and it's worked pretty well for 20 years - it's relatively fast and impossible in a practical sense for two different files to accidentally hash to the same value.

In fact, as far as I'm aware, this has never happened in the history of every file, tree and commit ever made in Git in every repository ever created - billions and billions of them.

Mathematically, for SHA-1’s 160-bit output, the birthday bound means that you would need about 1.4 septillion random files (1.4 quadrillion billion files - 1,400,000,000,000,000 billion - it's impossible to effectively describe) in a single project to have file hashes accidentally collide.

SHA-1 is Broken

There is a problem though, which is that mathematically, SHA-1 is now considered semi-"broken" because there have been published collision attacks (SHAttered in 2017, SHA-1 is a Shambles in 2020) - not really practical to exploit in any demonstrated way, but now theoretically possible.

So in response to this, after a huge amount of work by very smart people, the upcoming Git 3.0 release is planning to change it's default hashing algorithm from the semi-"broken" SHA-1 to the stronger SHA-256 algorithm.

But first, let's pause. Before we dig into this, what does "broken" mean?

This is important to understand, because it's probably not what normal people would think "broken" means. From a cryptographic hashing standpoint, broken in this sense essentially means that finding collisions isn't impossible.

In other words, if you throw enough money and GPUs at the problem, you can, for some content shapes, come up with two different things that hash to the exact same value, on purpose.

What can you do with a broken SHA-lor? Earl-y in the morrrrn...

What can you do with a broken SHA-lor? Earl-y in the morrrrn...

This means that while it's still nearly impossible to accidentally have two reasonable files with different contents, it's not technically impossible to manufacture two different files that hash to the same thing.

This means that there theoretically exist attack vectors where someone could replace one file's contents with a malicious version and Git can't tell the difference because the hash is mathematically identical.

These papers showed that SHA-1 has a property that in theory can be exploited by modern GPU farms to produce purposeful collisions on the order of a few tens of thousands of dollars today that SHA-256 does not have (google "linear message schedule sha-1 vs sha-256" if you super-duper care...).

Sounds really scary and concerning, right? Won't somebody please think of the children!?!

Collision attacks

Well, not really.

But let's take one minute to step back and talk about these collisions.

There are two main problems with hash functions when you're considering attacks on them (assuming I had to massively, stupidly, simplify things). One is a "collision attack" and the other is a "second-preimage attack".

A "collision attack" is when you know you're going to be an attacker but pretend to be a good guy until you gain trust. You generate two files on purpose with the same hash - one is benign and the other is malicious. You give people the benign one until you're trusted and then switch it with the malicious one because the hash matches and you know Git can't tell the difference. You can even get signed tags or commits on trees that have the benign file and make it look like the bad file was signed.

A "second-preimage attack" is when you see a file you want to replace and then create a second file that does something malicious that also happens to match that hash so you can get people to unknowingly pull it down instead. Importantly, this does not mean that the author of the original file needs to also be the attacker.

Collision versus second-preimage

Collision versus second-preimage

So, the most important thing that I would like to emphasize before this rant begins is that while second-preimage attacks have a more concerning aspect to them, nearly no widely used hash function ever used is susceptible to it.

Git could be using MD5 (considered an incredibly broken hash function) and still be effectively immune from a second-preimage attack. Again, MD5 is what is considered a completely "broken" hash function, which SHA-1 is not - it's much stronger.

What do I mean by "effectively immune"? If every one of the roughly 3 billion GPUs on Earth were magically replaced with an RTX 5090, and every one spent 100% of its time doing nothing but MD5, the expected time to brute-force a particular preimage would still be about 16 billion years (~11 billion median), or roughly the age of the universe.

3.4×1038checks3×109GPUs×2.2×1011hashes/sec≈ 5.2×1017 seconds ≈ 16 billion years

Theoretical Attack Vectors

So, any realistic interesting attack vector therefore relies on a collision attack, meaning the person who introduces the original file has also pre-computed the malicious version and intends to inject it after it's accepted.

However, let's be massively, unrealistically conservative and even assume for argument's sake that a preimage is easy. Let's say that you found a way to create a second preimage matching the hash of any known file on your laptop in an hour.

Now you can target any file you want to replace and come up with a different malicious file that matches the hash effortlessly. Congratulations! You can now pwn any codebase on earth!

Egh. Hm, one tiny problem. How do you:

  1. get that file to be fetched by people who don't know you and have never pulled a previous version of this content
  2. get them to run it in a way that is useful to you

Every argument and problem set after this depends on the answers to these questions, yet the answers to these questions are generally not part of the conversation around this problem.

Even if we assume that SHA-1 was trivial to break, even if we assume that second-preimage production was possible (or even cheap), it does not make the attack vectors that are available actually very easy to exploit.

The reason why is that hashing is not really the mechanism of trust in the SCM world. It certainly provides an element of cryptographic integrity, but it is not what trust is fundamentally based on.

Linus literally argues this at the birth of Git.

I really think people should not consider the sha1 the "security". The real security is in distribution.

Linus Torvalds, 2005

Trust is based on "where do you pull from?" and it always has been.

Actual Attacks

For one minute, let's consider what an actual attack looks like in the world of getting untrusted content into codebases. This is, of course, the worst case scenario of what we're looking at here. Some source code file (or more likely in a hash attack case, binary file) is inserted maliciously without you knowing.

It turns out, this actually happens a fair amount.

Not because people are spending hundreds of thousands of dollars on GPUs to generate random entropy to throw in after a null byte, so that some binary file can happen to match a SHA-1 checksum.

No, it currently happens in the real world because someone socially engineers an exploit to get write access to some npm package used by millions of projects. Now it's not one binary that's difficult to detect, it's every single file in a dependency that is blindly pulled in with no previous checksumming match by every project that has this project in its package.json file.

This is maybe a billion times simpler, cheaper and more likely to succeed than trying to brute force a hash collision and manipulate an untrusted fetch.

If I wanted to get untrusted code into Android, it's so much simpler to bribe or convince the maintainer of a popular downstream project, take it over and inject difficult to detect code into an already trusted source URL than try to engineer some easy to detect hash collision and put it into a URL that nobody would ever pull from.

Do you think there is no tired open source maintainer who wouldn't give over maintenance of a highly used, unloved project for a $40k lump sum payment? Voila, now you don't need to rent GPUs, it takes one day and you can replace any file you want with any content you wish.

In other words, hash collision attacks are maybe the dumbest possible way to get untrusted code on a system when unpaid open source maintainers and low-trust package management forges exist.

Trust in the Git World

To go back to Linus's argument, I don't pull code from https://github.com/rust-lang/rust because I trust the GPG signature that signed the latest commit SHA and just assume that any random source is fine.

I pull it from there because I trust that GitHub has its authentication game together enough that it's unlikely that anyone malicious pushed something there without the maintainer's knowledge. Which is also why I don't pull from https://randomhash.onion/hAAAxx0r/rust because some email told me to.

I don't really care what the hashing algorithm is and how many fewer billions of years of compute it might have taken to generate a hash collision on a large binary file that Rust clearly would not have committed to the repository in the first place.

It's just honestly a ridiculous premise.

Every attack scenario I'm aware of in defense of the incredible and expensive SHA-256 migration effort that the entire industry is about to be forced to undertake is unrealistic to me. They are all easily and cheaply mitigated by many other stronger, simpler protections of sources and content rather than slightly stronger hash algorithms.

If we consider SHA-1 to simply be a good enough, fast enough method to generate unique keys for content in a trusted repository, and accept that the hashes are not intrinsically to be used for trust itself, then there is no real reason to replace it. We could be using MD5 and it would honestly probably be just fine.

Accidental content collisions are mathematically nearly impossible in any reasonable codebase and the rest can be handled by signed content verification, external authentication and social trust mechanisms.

If we don't accept this, then we will be stuck in a loop of someone finding a theoretical collision exploit and again needing to migrate the entire Git ecosystem every time a new paper is published. We can go through years of this SHA-1 to SHA-256 migration and then quantum computers break 256 and we're back in the same stupid boat again.

Simply because we're conflating cryptographic integrity with trust.

Train Wreck?

Now hold on a minute Scott, you said that this is going to be a horrible train wreck. Surely that's hyperbole.

Probably.

But no matter how you calculate the cost, it won't be cheap or easy. Emily Shaffer just gave a talk about how Google is preparing to deal with this problem and it's not a pretty picture.

How Will This Go?

Let's break down what is going to happen when Git 3.0 ships with this new default.

The first thing is that all new repositories created with git init will be created with the SHA-256 content hashing algorithm. You can try this yourself today by running git init --object-format=sha256.

❯ git init --object-format=sha256 /tmp/twofiddy
Initialized empty Git repository in /private/tmp/twofiddy/.git/

❯ cd /tmp/twofiddy

❯ echo 'sha 256' > README.md

❯ git add README.md; git commit -am 'first'
[main (root-commit) 11043f6] first
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

❯ git log
commit 11043f6a3be7d21e999dc84550886306bee65f4faf4fc9226979108fd1a0b1af (HEAD -> main)
Author: Scott Chacon <schacon@gmail.com>
Date:   Wed Sep 30 10:36:13 2026 +0200

    first

The first thing that you'll notice (other than the much longer hash value) is that you can't push this code to GitHub, though that will almost certainly be fixed by the time Git 3.0 is released. In fact, that's probably the main thing currently delaying 3.0 entirely.

But when you do want to push it to GitHub (or any host), you will need to tell them when creating the repository on the server that this is a sha256 project. Every project will now be in one bucket or the other and they cannot be mixed.

This is immediately going to frustrate people because now they need to know what version of git they ran git init with and make sure when they go to GitHub to create the server repository, they choose the right one.

New repo creation on forges will need to look something like this, but how do you know which you need? Also, what normal person would know what this means or that it's insanely important which you choose?

New repo creation on forges will need to look something like this, but how do you know which you need? Also, what normal person would know what this means or that it's insanely important which you choose?

We are about to see a lot of this:

❯ git push origin main
fatal: the receiving end does not support this repository's hash algorithm

For a couple of different reasons. Because depending on how hosts label this, it's very difficult to know which format you need the upstream repo initialized as. So you could do 256 upstream and try to push one initialized locally with a pre-3.0 binary. Or clearly vice versa.

Libraries, Links, and Tools, Oh My!

Furthermore, for libraries, this is really problematic, because submodules can only be used with projects of the same type, so they will need to have two versions in order to be used both by existing projects and new ones.

It's possible that forges will be able to handle both formats by keeping mirrors of the other format, but this will increase load on sites like GitHub for nearly every operation and also further confuse the trust problem.

For existing projects that do decide to convert from SHA-1 to SHA-256, they will need to convert every object in the project to the new format, which will break all existing signatures. Also everyone working on or using that project will need to switch over at the same time to avoid split head issues. Or, again, have the mirror setup and cut over write access from one to the other. Which still does not solve the object replacement problem for other mirrors that do not have the 256 version.

If they do convert, then all existing URLs or links in Slack or emails or anything that ever had a SHA-1 hash in it will no longer work and will need to be redirected (assuming that's possible - you haven't switched hosts or something to a place that doesn't have a mapping).

All internal or other tooling globally that expects 40 characters for the hash will break or need to be updated to guess or detect the hash format.

Also, while core Git has this functionality to work with repositories of either format, not all libraries do and nearly none of them have full support.

Since Git was developed as a project with a non-reentrant, GPL licensed, unlinkable library, most projects in the wider Git ecosystem use from-scratch reimplementations. Since those libraries all have zero or partial support, all scripts and tooling that are not fork-exec'ing out to the Git binary will have some amount of breakage on these new repositories.

If you have any tool that depends on any of these libraries, you may be out of luck for some operations

If you have any tool that depends on any of these libraries, you may be out of luck for some operations

I can go on, but this is a huge, wide-ranging and still largely unsolved problem and there is no consensus or great solution that anyone has come up with to make this easy. Emily even noted that Google may just set internal system-wide overrides to make sure all new projects in Google are still SHA-1, attempting to make sure everything reverts the new 3.0 default for as long as possible.

But what can we do?

Personally, I think this is an unnecessary solution looking for a theoretical problem and even that theoretical, impractical problem can be solved in a much simpler and straightforward way for the small number of projects that might actually care.

Don't use the hash to trust content.

You know, like Linus said 20 years ago.

If you assume that your repository sources are trusted, then none of this matters. At all. And 99% of us only work with repository sources that are trusted. For nearly everyone using Git, fancy backdoor hash collision attacks are irrelevant because if you're only working on one repository and if write access to that is compromised, anyone can put anything on the main branch and probably nobody will notice. You don't need fancy object replacement tricks to hoodwink people.

If you don't fully trust your sources (the other 1%) then perhaps there are other, simpler, better approaches we should try before our global Hashmageddon.

Independent Tree Hash Headers

What if we approach this very differently? Perhaps we do something simple like independently rehash the tree contents with a different algorithm, then inject that header into the objects we sign so that we sign both hashes? One (SHA-1) to be used for content retrieval and the other (SHA-256 let's say) to be used for independent content verification.

I want to dig into this a bit, because I feel that an approach like this can solve nearly all of the even theoretical problems without having to bifurcate the entire Git ecosystem and frustrate everyone.

Let's say that you want to rely on an external library or vendor and want to mitigate possible object collision attacks. You can't trust the SSH/GPG signature on a commit or tag because what it's signing is the SHA-1 hash we use to store the content and that is shown to be replaceable without detection or changing the thing you're signing.

So separate them.

Independently calculate the SHA-256 (or BLAKE3 or whatever) hash of all of the content in the tree when you sign the commit or tag and inject that as a new header in that object that is then signed. Now the signature hashes both the SHA-1-based content and history and additionally the hash of the tree contents independently calculated at signing time.

independent tree content hash in the signed fields of Git objects

independent tree content hash in the signed fields of Git objects

Now when you pull that into another project, you have the option of verifying the signature via a public key and making sure that the content you check out matches both signatures.

This isn't a new idea. Colin Walters' git-evtag has done almost exactly this since 2015: it's a drop-in replacement for git tag -s that adds a Git-EVTag-v0-SHA512 checksum over the commit, tree and every blob (recursing into submodules) to the tag before it's signed that can be verified independently from the SHA-1 of the same tree.

If SHA-256 is ever compromised, we can add support for a new hash function and projects that care can start requiring that (a tree-blake3 header or whatever). We can even do this with multiple hashes and verify none, any or all of them for content trust. Every time trust in an algorithm is compromised, all we have to do is add a new hashing and verification method, not migrate every project in existence.

The downsides would be that we may not be able to trust every commit, only the objects that have the header in them and are signed, but for nearly every project that cares, this is probably fine. Trust in a signature in this case does not propogate down the entire history now, but how big of a problem is that, really? Projects of this nature are almost certainly pegging to tagged releases anyhow.

It would be slightly more expensive to create this independent content signature, but only when you want to sign something. I implemented a proof of concept for this and ran it against the absolute worst case I can imagine - Chromium with all submodules recursively checksummed.

In this case, we're dealing with a 35GB working tree of 2.1M files. My tool generated a checksum (all main tree files, all submodule files) in 5 seconds (M5 Mac multithreaded). This is pretty much the absolute worst case scenario.

The Linux tree takes 257ms for its 1.5GB tree. The Git project takes 17ms. You could even put this in every commit for most projects. It's also backfillable. You could go back in time and throw signed, checksummed tags on commits in the past for any project, pretty easily.

It's not very expensive to verify tree content independently

It's not very expensive to verify tree content independently

Every tree that anyone cares about could be independently checksummed and signed with no change in the core hashing model. If anything, it would technically be more secure than SHA-256 alone, since now you would need to get content that collides in both hash algorithms to be a problem.

We can stop using SHA-1 to trust content without throwing away SHA-1 and breaking the entire ecosystem. We can add another content trust vector without causing an immense amount of chaos and confusion for a tiny minority of projects with this trust issue.

Thank you for coming to my TED Talk.

None of this is new. Nearly all of this argumentation has happened on the Git mailing list for many, many years now by people much smarter than me. This article is simply meant to pull back for a moment before pulling the 3.0 trigger and see if we want to reconsider this before it impacts so much of the Git ecosystem.

This second-signature approach also arguably addresses the NIST compliance issue. NIST's 2030 SHA-1 deadline is about using SHA-1 "for applying cryptographic protection", not about SHA-1 existing anywhere in your stack. If every signature also covers a SHA-256 content hash, then SHA-1 isn't protecting anything anymore. It's just a content-addressed key. FIPS-mode systems already handle this: OpenSSL 3 lets an application ask for a non-FIPS implementation of a hash it isn't using for security (that's what Python's usedforsecurity=False does), and Git doesn't even go through OpenSSL for object IDs. It uses its own built-in SHA-1 code, which sits outside any FIPS crypto module entirely.

I could also take this arguemnt even further and entirely remove the sha1dc ("collision detection") computational tax that we all pay to try to avoid collisions of these specific types. We could speed up clones and pushes in many cases if we assume that this is not where this kind of check needs to go.

The Daily Front Page 6 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Search After Vectors
article

RIP, vector database

by razin·▲ 307 points·82 comments·turbopuffer.com ↗
We are changing turbopuffer's storage architecture to take search to the next level.

We are changing turbopuffer's storage architecture to take search to the next level. turbopuffer v3 changes how documents and indexes are laid out, written, compacted, and queried in turbopuffer. It will allow us to make search faster in every respect — including text, regex, and vector search — but it also lays the foundation to move many more SQL queries to turbopuffer and make them fast.

turbopuffer launched as a serverless vector database (v1), highly specialized to the task of serving extremely cheap and reasonably fast vector searches. Object storage as the source of truth gave the economics, and tiered NVMe SSD/memory caches gave the performance. The value of these particular tradeoffs was validated by our earliest customers, including Cursor and Notion.

turbopuffer evolved to have very strong text and regex search (v2), and is being used for many non-search use cases, like Linear's syncing engine. The query engine has evolved along the way to support all of these query plans, but the storage architecture has remained largely unchanged: the ANN vector index was and still is the primary index around which all other indexes and query plans revolve. This design has constrained several query plans, like GROUP BY and aggregations.

We've pushed the vector-primary architecture as far as we can, and it's time to move on. We're in the process of moving to a new primary index, and making ANN "just another" secondary index. We thought it might be fun to open up the doors and let you follow along.

For this first update, we'll set the stage with why we're doing this in the first place. Walk with me on a short journey from tpuf v1 to today.

v1: an ID and a vector

In the first version of turbopuffer, documents consisted of nothing but an ID and a vector. The prevailing wisdom at the time was graph-based vector indexes, but a hierarchical clustering index plays better with object storage. We started with SPANN, and eventually migrated to SPFresh to support incremental indexing. Vectors are clustered into groups, whose centroids are clustered in turn, repeated to form a tree with a single root.

We implemented this on top of a storage layer presenting as a key-value map, with sorted and unique keys. Each cluster is given a ClusterId, and vectors within each cluster are given a dense LocalId.

// leaf vectors
K::Vector(C0L0) = vec![0.45, 0.32, ...]
K::Id(C0L0) = 7
K::Vector(C0L1) = vec![-0.28, 0.96, ...]
K::Id(C0L1) = 13

// cluster centroid for C0 is itself clustered at the next level of the tree
K::Vector(C1L4) = vec![0.64, -0.48, ...]
K::Id(C1L4) = C0

As you can see above, everything is keyed by ClusterId and LocalId (e.g. C0L1), which together we call the ANN address. This is what we mean when we say the ANN index is the primary index.

v2: attribute filtering and full-text search

Two new query plans marked the informal transition from turbopuffer v1 → v2: attribute filtering and full-text search.

Attribute filtering

Naturally, customers wanted to be able to add attribute values and filter vector searches on them. To make filtering fast and high-recall, we modeled these as an inverted index that maps an attribute value to the ANN address of the documents that contain it.

K::AttrIndex("family", "Alcidae") -> vec![C0L3, C1L2, C1L3, ...]
K::AttrIndex("genus", "Fratercula") -> vec![C0L3, C1L2, C1L9, ...]

For projections (include_attributes), we also stored the document attributes alongside the ID and the vector.

K::Vector(C0L0) = vec![0.45, 0.32, ...]
K::Id(C0L0) = 7
K::Attr(C0L0, "family") = "Alcidae"
K::Attr(C0L0, "genus") = "Fratercula"

Full-text search

BM25 full-text search was another obvious and much-demanded query plan. Similar to attribute search, full-text search works by first finding the documents that have the query term present (commonly called "postings"). For an FTS index, we also include the (term count, document length) metadata necessary for BM25 scoring:

K::FTS("description", "Atlantic") -> vec![(C0L0, 2, 37), (C9L4, 1, 42), ...]
K::Attr(C0L0, "description") -> "A sharply dressed black-and-white seabird with a \
huge, multicolored bill, the Atlantic Puffin is often \
called the clown of the sea. It breeds in burrows on \
islands in the North Atlantic, and winters at sea."

Over time, we've shipped several other index structures and query engines: aggregations, regex search, fuzzy matching, sparse vector search, and attribute ordering — all built around the same vector-primary storage layout.

The problem with a vector primary index

The ANN primary index has largely remained intact until today for one simple reason: it works really, really well for ANN search on object storage. On top of this architecture, we've pushed vector search to single indexes of 100B+ vectors serving 200 ms p99 reads at 1k+ QPS. Any significant change here risks introducing regressions in ANN performance.

However, this layout holds us back from being state-of-the-art for the non-vector query shapes we support, in three main ways: storage amplification, write amplification, and limited vectorization.

Storage amplification

As described above, turbopuffer currently puts the full contents of each document under its ANN address. When there is only one vector, the non-vector data is stored alongside the vector only once.

However, for multi-vector representations of a document, such as document nesting or late interaction, this means we have to duplicate the contents for each vector. This is the reason for some of our more unfortunate limits.

Write amplification

Any time a document is inserted, updated, or deleted, SPFresh may rebalance the vectors to ensure they remain well clustered (otherwise recall may suffer). Because everything in a document is stored keyed by the ANN address of the document's vector, this rebalancing cascades to moving the full document contents, as well as any inverted (attribute and FTS) indexes that reference it. Updating just one vector can move hundreds of attributes and their indexes.

This write amplification is large enough that our efforts to tune indexing throughput have started to hit diminishing returns.

Limited vectorization

Modern query engines are vectorized: they run tight loops over blocks of values, which amortizes fixed per-block costs, compresses better, keeps the CPU pipeline full, and unlocks SIMD. DuckDB, for example, works in batches of 2,048 rows, ClickHouse up to ~65k, Lucene's posting blocks are 256 docs, and our ANN index works best with clusters of around 100–200 documents. Every query plan has an optimal block size, but today they are all constrained by the ANN primary index. A plan that wants blocks of thousands of documents to keep the CPU saturated is still stuck at 100–200.

We've already documented how much this matters in turbopuffer. Our first version of full-text search partitioned posting lists along ANN cluster boundaries, and the median block held just ~1.5 postings. FTS v2 reworked postings into fixed blocks of ~256, and the index got 10x smaller and queries got up to 20x faster. Posting lists could do that because they're stored separately and point at documents, so their layout doesn't have to follow the clusters. Aggregations and other scans read the documents themselves, and those are stored one block per cluster. As long as the ANN address is the primary key, their block size is constrained to the cluster size, even if they'd prefer something larger.

RIP, primary vector index

The solution to these problems is simple: don't key on the ANN address. That is precisely the change turbopuffer v3 makes. As you can imagine, it is not a trivial change.

v3 is a new foundation that will unlock significant performance improvement on all query plans, and we hit a major milestone earlier this month: 100% of CI passes on turbopuffer v3. We started by focusing on correctness. Now we will make it correct and fast. Watching benchmark numbers go down is great fun, so we wanted to get you in at day zero of perf grinding. We will share the benchmarks in public over the coming weeks, as we work toward (and beyond) performance parity before rolling out v3 to production.

The Daily Front Page 7 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Rust, Faster
article

How to speed up the Rust compiler in September 2026

by trickypr·▲ 243 points·137 comments·nnethercote.github.io ↗
The mean wall-time reduction was 4.57%, which is a remarkable improvement.

My last post on the Rust compiler’s performance was two months ago and a lot has happened since then.

Overall progress

The measurements for the period 2026-07-29 to 2026-09-28 can be seen here.

The mean wall-time reduction was 4.57%, which is a remarkable improvement in just two months. Of the 629 benchmark measurements, 555 of them improved and only 74 regressed. A number of benchmarks saw double-digit percentage reductions. The technical term for this result is “a sea of green”.

rustdoc

In my last post I mentioned how Noah Lev got some enormous speed wins on rustdoc. He recently wrote a post explaining in some detail exactly how he did this. It’s an interesting and satisfying read.

Clippy

#159642: In this PR Jakub Beránek enabled PGO for Clippy, giving wall-time improvements across most Clippy benchmarks, in the best case by 18%!

LLVM update

#158734: In this PR Nikita Popov upgraded the LLVM version used by the compiler to LLVM 23. As often happens when we upgrade LLVM, we saw some nice speedups. The mean wall-time reduction across all benchmarks was 1.2%, which might not sound like much but is really impressive for a single PR. Great work from the LLVM folks!

The new borrow checker

The new borrow checker, Polonius Alpha (no relation to Napoleon Dynamite), was enabled on Nightly. It is more precise than the existing borrow checker and accepts some valid programs that the old borrow checker would reject. It does do more work than the old borrow checker, enough to make a measurable difference to compile time in a minority of cases, including the popular serde crate. Fortunately, Jack Huey has been on the case.

#161938: In this PR Jack made some liveness computations lazy, which reduced instruction counts for serde by 3-5%, and for some other benchmarks by less than 1%.

#163027: In this PR Jack adjusted a data structure and tweaked some inlining, for mostly sub-1% instruction count reductions across numerous benchmarks.

There is more work to be done to reduce the remaining Polonius Alpha regressions, but it’s worth noting that the “sea of green” shows these regressions were swamped by the many other recent improvements.

The new trait solver

The new trait solver, Penelope Hammertime, [Ed. note: is that right?] was also enabled on Nightly.

As I said, a lot has been happening.

Like the new borrow checker, the new trait solver is slower in a minority of cases. Jana Dönszelmann wrote a detailed post about the efforts to improve the performance of this new solver.

Jana’s post is detailed enough that I won’t say much more about the large amount of ongoing work on the new solver, but I will mention in passing the PRs I made: #160479, #160605, #160801, #160892, #161077, and #161211. Some of these reduced compile times greatly for certain outlier crates: 50% here, 25% there, 15% there, and even more on one stress test. And I am not the only one who has made progress here… go read Jana’s post.

xmakro

New contributor xmakro continued their run of good improvements.

#157281: In this PR xmakro optimized impl handling when building the specialization graph. This gave a mean cycle count reduction of 1.58% across all benchmarks, which is huge for a single PR.

#158059: In this PR xmakro optimized one aspect of the loading of incremental compilation data, reducing instruction counts across multiple benchmarks, in the best case by 6%.

#160473: In this PR xmakro avoided some allocations in a hot obligations processing path, reducing instruction counts across numerous benchmarks, in the best case by 2%.

#160268: In this PR xmakro avoided a lot of allocations by changing the old/new trait solver selection code to use static dispatch instead of dynamic dispatch. This gave mostly sub-1% instruction count reductions across a number of benchmarks. This hot allocation path had been showing up in profiles for a while and I had earlier tried exactly the same idea in #155714. But I got regressions on a couple of benchmarks, possibly due to slightly different choices of where to place some #[inline] attributes. It was good to see this obvious inefficiency fixed.

Dataflow analysis

#160193: In this PR I changed the CFG traversal algorithm used by the dataflow analyses in the compiler. These analyses iterate to a fixpoint and the traversal algorithm can affect how quickly the fixpoint is reached. For most code the new algorithm makes no difference, but the cranelift-codegen crate has one enormous function with over 18,000 basic blocks. The old algorithm required 1.5 million calls to apply_effects_in_block to reach a fixpoint for the EverInitializedPlaces analysis used by the borrow checker; the new algorithm requires 90,000. This gave an enormous ~30% wall-time reduction for a check build of this crate.

#160033: In this PR I made EverInitializedPlaces more efficient again, this time by not tracking unnecessary data for projections. This reduced instruction counts on the match-stress benchmark by 17%, and on a few other benchmarks by less than 1%.

LLMs

They’ve gotten very good at certain kinds of analysis. I’m still writing all my own code and text, because (a) that’s paramount, and (b) the project policy requires it, but I had useful LLM analysis assistance on several of the PRs mentioned in this post.

Anyway, enough about that.

Miscellaneous

#160535: In this PR Chris Denton increased the default stack size used by the compiler, which allowed the removal of ensure_sufficient_stack, a manual stack extension mechanism sprinkled about in places prone to high levels of recursion. There was a lot of discussion about this one because it can be difficult to decide how to best deal with stack exhaustion. But the performance effects are clear, with reduced instruction counts across many benchmarks, in the best case by almost 3%.

#160506: The project uses a lot of “rollup” PRs, where multiple PRs are merged together. This is because we don’t have sufficient CI capacity to merge every PR individually. Normally PRs that affect performance are merged by themselves so we can measure their effects clearly. For the first time ever, at one point we had so many performance improvement PRs waiting in the merge queue that Jonathan Brouwer created a rollup containing 10 performance-improving PRs to keep things moving! This is a good problem to have. And later on we had #162859 which contained four performance-improving PRs. (You needn’t worry about unexpected effects slipping in because we have the ability to run the perf benchmark suite on the individual PRs after merging, to make sure each PR had the expected performance effect.)

#162747: In this PR I made some minor improvements to the code that lowers AST to HIR. It was a cleanup that wasn’t expected to affect performance but it reduced instruction counts across numerous benchmarks, in the best case by 1.5%. Sometimes you get lucky.

Job status

Tomorrow I will start working at Hexcat on the compiler performance optimizations project goal. It’s exciting! Many thanks to Mara Bos, Predrag Gruevski, and all the other people who helped make this happen.

Editor’s postscript

The new solver’s name is not Penelope Hammertime; that was a joke.

Author’s postscript

Its real name is Pineapple Häagen-Dazs.

The Daily Front Page 8 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Kernel Bulletin
article

Several vulnerabilities have been discovered in the Linux kernel

by luispa·▲ 232 points·157 comments·lwn.net ↗
Several vulnerabilities have been discovered in the Linux kernel.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

- -------------------------------------------------------------------------
Debian Security Advisory DSA-6528-1                   security@debian.org
https://www.debian.org/security/                     Salvatore Bonaccorso
September 29, 2026                    https://www.debian.org/security/faq
- -------------------------------------------------------------------------

Package        : linux
CVE ID         : CVE-2024-52560 CVE-2024-58094 CVE-2024-58095 CVE-2025-21817
                 CVE-2025-22104 CVE-2025-22108 CVE-2025-22127 CVE-2025-38203
                 CVE-2025-38205 CVE-2025-38206 CVE-2025-38237 CVE-2025-38621
                 CVE-2025-39833 CVE-2025-39925 CVE-2025-40064 CVE-2025-40102
                 CVE-2025-40139 CVE-2025-40168 CVE-2026-23137 CVE-2026-43198
                 CVE-2026-43344 CVE-2026-45963 CVE-2026-52944 CVE-2026-53010
                 CVE-2026-53089 CVE-2026-53102 CVE-2026-53113 CVE-2026-53250
                 CVE-2026-53313 CVE-2026-64058 CVE-2026-64070 CVE-2026-64082
                 CVE-2026-64210 CVE-2026-68286 CVE-2026-68287 CVE-2026-68288
                 CVE-2026-68289 CVE-2026-68303 CVE-2026-68337 CVE-2026-72334
                 CVE-2026-72402 CVE-2026-72413 CVE-2026-72438 CVE-2026-72485
                 CVE-2026-72496 CVE-2026-74258 CVE-2026-74268 CVE-2026-74289
                 CVE-2026-74291 CVE-2026-74294 CVE-2026-74334 CVE-2026-74496
                 CVE-2026-74521 CVE-2026-74735 CVE-2026-74753 CVE-2026-80521
                 CVE-2026-80671 CVE-2026-80755 CVE-2026-80762 CVE-2026-80766
                 CVE-2026-80768 CVE-2026-80774 CVE-2026-80780 CVE-2026-80783
                 CVE-2026-80796 CVE-2026-80806 CVE-2026-80807 CVE-2026-80824
                 CVE-2026-80825 CVE-2026-80826 CVE-2026-80827 CVE-2026-80828
                 CVE-2026-80829 CVE-2026-80830 CVE-2026-80831 CVE-2026-80832
                 CVE-2026-80833 CVE-2026-80834 CVE-2026-80835 CVE-2026-80836
                 CVE-2026-80837 CVE-2026-80838 CVE-2026-80839 CVE-2026-80840
                 CVE-2026-80841 CVE-2026-80842 CVE-2026-80843 CVE-2026-80844
                 CVE-2026-80845 CVE-2026-80846 CVE-2026-80847 CVE-2026-80848
                 CVE-2026-80849 CVE-2026-80850 CVE-2026-80851 CVE-2026-80852
                 CVE-2026-80854 CVE-2026-80855 CVE-2026-80856 CVE-2026-80860
                 CVE-2026-80861 CVE-2026-80862 CVE-2026-80863 CVE-2026-80864
                 CVE-2026-80878 CVE-2026-80914 CVE-2026-80921 CVE-2026-80922
                 CVE-2026-80923 CVE-2026-80925 CVE-2026-80926 CVE-2026-80928
                 CVE-2026-80930 CVE-2026-80931 CVE-2026-80932 CVE-2026-80933
                 CVE-2026-80938 CVE-2026-80940 CVE-2026-80941 CVE-2026-80942
                 CVE-2026-80943 CVE-2026-80944 CVE-2026-80945 CVE-2026-80947
                 CVE-2026-80949 CVE-2026-80951 CVE-2026-80952 CVE-2026-80963
                 CVE-2026-80964 CVE-2026-80965 CVE-2026-80966 CVE-2026-80967
                 CVE-2026-80968 CVE-2026-80969 CVE-2026-80971 CVE-2026-80972
                 CVE-2026-80973 CVE-2026-80974 CVE-2026-80976 CVE-2026-80977
                 CVE-2026-80978 CVE-2026-80979 CVE-2026-80982 CVE-2026-80983
                 CVE-2026-80984 CVE-2026-80987 CVE-2026-80988 CVE-2026-80989
                 CVE-2026-80990 CVE-2026-80991 CVE-2026-80992 CVE-2026-80994
                 CVE-2026-80996 CVE-2026-80997 CVE-2026-80999 CVE-2026-81000
                 CVE-2026-81001 CVE-2026-81002 CVE-2026-81003 CVE-2026-81005
                 CVE-2026-81007 CVE-2026-81008 CVE-2026-81011 CVE-2026-81012
                 CVE-2026-81013 CVE-2026-81014 CVE-2026-81017 CVE-2026-89438
                 CVE-2026-89439 CVE-2026-89440 CVE-2026-89442 CVE-2026-89443
                 CVE-2026-89444 CVE-2026-89448 CVE-2026-89451 CVE-2026-89453
                 CVE-2026-89454 CVE-2026-89455 CVE-2026-89456 CVE-2026-89457
                 CVE-2026-89458 CVE-2026-89460 CVE-2026-89461 CVE-2026-89462
                 CVE-2026-89463 CVE-2026-89464 CVE-2026-89465 CVE-2026-89466
                 CVE-2026-89468 CVE-2026-89469 CVE-2026-89470 CVE-2026-89471
                 CVE-2026-89472 CVE-2026-89473 CVE-2026-89474 CVE-2026-89475
                 CVE-2026-89476 CVE-2026-89477 CVE-2026-89478 CVE-2026-89479
                 CVE-2026-89480 CVE-2026-89481 CVE-2026-89482 CVE-2026-89483
                 CVE-2026-89484 CVE-2026-89485 CVE-2026-89487 CVE-2026-89488
                 CVE-2026-89489 CVE-2026-89490 CVE-2026-89491 CVE-2026-89492
                 CVE-2026-89493 CVE-2026-89494 CVE-2026-89495 CVE-2026-89496
                 CVE-2026-89497 CVE-2026-89498 CVE-2026-89501 CVE-2026-89502
                 CVE-2026-89504 CVE-2026-89508 CVE-2026-89510 CVE-2026-89511
                 CVE-2026-89512 CVE-2026-89515 CVE-2026-89524 CVE-2026-89525
                 CVE-2026-89526 CVE-2026-89530 CVE-2026-89531 CVE-2026-89532
                 CVE-2026-89533 CVE-2026-89535 CVE-2026-89536 CVE-2026-89538
                 CVE-2026-89539 CVE-2026-89540 CVE-2026-89541 CVE-2026-89542
                 CVE-2026-89543 CVE-2026-89544 CVE-2026-89545 CVE-2026-89547
                 CVE-2026-89548 CVE-2026-89549 CVE-2026-89550 CVE-2026-89551
                 CVE-2026-89552 CVE-2026-89553 CVE-2026-89554 CVE-2026-89555
                 CVE-2026-89557 CVE-2026-89558 CVE-2026-89559 CVE-2026-89560
                 CVE-2026-89561 CVE-2026-89562 CVE-2026-89563 CVE-2026-89564
                 CVE-2026-89565 CVE-2026-89566 CVE-2026-89567 CVE-2026-89569
                 CVE-2026-89572 CVE-2026-89573 CVE-2026-89574 CVE-2026-89575
                 CVE-2026-89576 CVE-2026-89579 CVE-2026-89580 CVE-2026-89581
                 CVE-2026-89582 CVE-2026-89583 CVE-2026-89585 CVE-2026-89586
                 CVE-2026-89587 CVE-2026-89588 CVE-2026-89589 CVE-2026-89593
                 CVE-2026-89594 CVE-2026-89595 CVE-2026-89596 CVE-2026-89597
                 CVE-2026-89598 CVE-2026-89599 CVE-2026-89602 CVE-2026-89603
                 CVE-2026-89604 CVE-2026-89605 CVE-2026-89606 CVE-2026-89607
                 CVE-2026-89608 CVE-2026-89609 CVE-2026-89615 CVE-2026-89616
                 CVE-2026-89617 CVE-2026-89618 CVE-2026-89621 CVE-2026-89622
                 CVE-2026-89624 CVE-2026-89625 CVE-2026-89626 CVE-2026-89627
                 CVE-2026-89628 CVE-2026-89634 CVE-2026-89636 CVE-2026-89640
                 CVE-2026-89643 CVE-2026-89644 CVE-2026-89645 CVE-2026-89647
                 CVE-2026-89649 CVE-2026-89650 CVE-2026-89651 CVE-2026-89652
                 CVE-2026-89653 CVE-2026-89655 CVE-2026-89656 CVE-2026-89657
                 CVE-2026-89658 CVE-2026-89659 CVE-2026-89660 CVE-2026-89662
                 CVE-2026-89663 CVE-2026-89665 CVE-2026-89666 CVE-2026-89667
                 CVE-2026-89669 CVE-2026-89671 CVE-2026-89672 CVE-2026-89674
                 CVE-2026-89676 CVE-2026-89680 CVE-2026-89683 CVE-2026-89684
                 CVE-2026-89685 CVE-2026-89686 CVE-2026-89688 CVE-2026-89690
                 CVE-2026-89691 CVE-2026-89693 CVE-2026-89694 CVE-2026-89696
                 CVE-2026-89697 CVE-2026-89698 CVE-2026-89699 CVE-2026-89700
                 CVE-2026-89702 CVE-2026-89703 CVE-2026-89704 CVE-2026-89706
                 CVE-2026-89707 CVE-2026-89708 CVE-2026-89710 CVE-2026-89711
                 CVE-2026-89712 CVE-2026-89713 CVE-2026-89717 CVE-2026-89718
                 CVE-2026-89719 CVE-2026-89720 CVE-2026-89723 CVE-2026-89724
                 CVE-2026-89725 CVE-2026-89726 CVE-2026-89729 CVE-2026-89730
                 CVE-2026-89731 CVE-2026-89732 CVE-2026-89733 CVE-2026-89735
                 CVE-2026-89736 CVE-2026-89738 CVE-2026-89740 CVE-2026-89741
                 CVE-2026-89742 CVE-2026-89743 CVE-2026-89744 CVE-2026-89746
                 CVE-2026-89747 CVE-2026-89749 CVE-2026-89750 CVE-2026-89751
                 CVE-2026-89752 CVE-2026-89753 CVE-2026-89755 CVE-2026-89756
                 CVE-2026-89759 CVE-2026-89761 CVE-2026-89762 CVE-2026-89763
                 CVE-2026-89765 CVE-2026-89768 CVE-2026-89771 CVE-2026-89776
                 CVE-2026-89777 CVE-2026-89778 CVE-2026-89779 CVE-2026-89780
                 CVE-2026-89781 CVE-2026-89782 CVE-2026-89783 CVE-2026-89784
                 CVE-2026-89785 CVE-2026-89786 CVE-2026-89787 CVE-2026-89789
                 CVE-2026-89792 CVE-2026-89793 CVE-2026-89794 CVE-2026-89796
                 CVE-2026-89798 CVE-2026-89799 CVE-2026-89800 CVE-2026-89801
                 CVE-2026-89802 CVE-2026-89803 CVE-2026-89807 CVE-2026-89816
                 CVE-2026-89817 CVE-2026-89818 CVE-2026-89819 CVE-2026-89821
                 CVE-2026-89822 CVE-2026-89823 CVE-2026-89824 CVE-2026-89825
                 CVE-2026-89830 CVE-2026-89834 CVE-2026-89835 CVE-2026-89839
                 CVE-2026-89842 CVE-2026-89843 CVE-2026-89844 CVE-2026-89845
                 CVE-2026-89846 CVE-2026-89847 CVE-2026-89848 CVE-2026-89849
                 CVE-2026-89850 CVE-2026-89851 CVE-2026-89852 CVE-2026-89853
                 CVE-2026-89854 CVE-2026-89855 CVE-2026-89856 CVE-2026-89857
                 CVE-2026-89858 CVE-2026-89860 CVE-2026-89861 CVE-2026-89863
                 CVE-2026-89864 CVE-2026-89865 CVE-2026-89870 CVE-2026-89871
                 CVE-2026-89872 CVE-2026-89874 CVE-2026-89876 CVE-2026-89877
                 CVE-2026-89878 CVE-2026-89879 CVE-2026-89880 CVE-2026-89881
                 CVE-2026-89883 CVE-2026-89884 CVE-2026-89885 CVE-2026-89886
                 CVE-2026-89887 CVE-2026-89888 CVE-2026-89890 CVE-2026-89891
                 CVE-2026-89892 CVE-2026-89893 CVE-2026-89894 CVE-2026-89895
                 CVE-2026-89896 CVE-2026-89897 CVE-2026-89898 CVE-2026-89899
                 CVE-2026-89900 CVE-2026-89901 CVE-2026-89902 CVE-2026-89903
                 CVE-2026-89904 CVE-2026-89908 CVE-2026-89909 CVE-2026-89922
                 CVE-2026-89923 CVE-2026-89924 CVE-2026-89925 CVE-2026-89926
                 CVE-2026-89927 CVE-2026-89929 CVE-2026-89930 CVE-2026-89931
                 CVE-2026-89932 CVE-2026-89933 CVE-2026-89934 CVE-2026-89936
                 CVE-2026-89937 CVE-2026-89938 CVE-2026-89939 CVE-2026-89940
                 CVE-2026-89941 CVE-2026-89942 CVE-2026-89943 CVE-2026-89944
                 CVE-2026-89945 CVE-2026-89946 CVE-2026-89947 CVE-2026-89948
                 CVE-2026-89949 CVE-2026-89950 CVE-2026-89951 CVE-2026-89952
                 CVE-2026-89953 CVE-2026-89954 CVE-2026-89955 CVE-2026-89957
                 CVE-2026-89958 CVE-2026-89959 CVE-2026-89960 CVE-2026-89961
                 CVE-2026-89962 CVE-2026-89963 CVE-2026-89964 CVE-2026-89965
                 CVE-2026-89968 CVE-2026-89969 CVE-2026-89970 CVE-2026-89973
                 CVE-2026-89974 CVE-2026-89975 CVE-2026-89979 CVE-2026-89980
                 CVE-2026-89982 CVE-2026-89983 CVE-2026-89984 CVE-2026-89986
                 CVE-2026-89988 CVE-2026-89989 CVE-2026-89990 CVE-2026-89992
                 CVE-2026-89993 CVE-2026-89994 CVE-2026-89995 CVE-2026-89997
                 CVE-2026-89998 CVE-2026-89999 CVE-2026-90000 CVE-2026-90001
                 CVE-2026-90003 CVE-2026-90007 CVE-2026-90011 CVE-2026-90012
                 CVE-2026-90015 CVE-2026-90017 CVE-2026-90018 CVE-2026-90019
                 CVE-2026-90020 CVE-2026-90021 CVE-2026-90022 CVE-2026-90024
                 CVE-2026-90025 CVE-2026-90026 CVE-2026-90027 CVE-2026-90031
                 CVE-2026-90032 CVE-2026-90033 CVE-2026-90034 CVE-2026-90035
                 CVE-2026-90036 CVE-2026-90037 CVE-2026-90039 CVE-2026-90041
                 CVE-2026-90042 CVE-2026-90044 CVE-2026-90045 CVE-2026-90048
                 CVE-2026-90049 CVE-2026-90053 CVE-2026-90054 CVE-2026-90055
                 CVE-2026-90056 CVE-2026-90057 CVE-2026-90058 CVE-2026-90060
                 CVE-2026-90062 CVE-2026-90063 CVE-2026-90065 CVE-2026-90066
                 CVE-2026-90067 CVE-2026-90068 CVE-2026-90070 CVE-2026-90071
                 CVE-2026-90072 CVE-2026-90073 CVE-2026-90074 CVE-2026-90075
                 CVE-2026-90076 CVE-2026-90078 CVE-2026-90081 CVE-2026-90085
                 CVE-2026-90088 CVE-2026-90090 CVE-2026-90091 CVE-2026-90092
                 CVE-2026-90101 CVE-2026-90102 CVE-2026-90103 CVE-2026-90107
                 CVE-2026-90108 CVE-2026-90109 CVE-2026-90110 CVE-2026-90112
                 CVE-2026-90114 CVE-2026-90115 CVE-2026-90119 CVE-2026-90122
                 CVE-2026-90124 CVE-2026-90125 CVE-2026-90126 CVE-2026-90128
                 CVE-2026-90130 CVE-2026-90135 CVE-2026-90137 CVE-2026-90138
                 CVE-2026-90139 CVE-2026-90140 CVE-2026-90141 CVE-2026-90143
                 CVE-2026-90147 CVE-2026-90148 CVE-2026-90150 CVE-2026-90151
                 CVE-2026-90152 CVE-2026-90153 CVE-2026-90157 CVE-2026-90158
                 CVE-2026-90159 CVE-2026-90160 CVE-2026-90165 CVE-2026-90166
                 CVE-2026-90169 CVE-2026-90170 CVE-2026-90175 CVE-2026-90176
                 CVE-2026-90178 CVE-2026-90180 CVE-2026-90184 CVE-2026-90185
                 CVE-2026-90186 CVE-2026-90187 CVE-2026-90188 CVE-2026-90189
                 CVE-2026-90190 CVE-2026-90192 CVE-2026-90193 CVE-2026-90194
                 CVE-2026-90195 CVE-2026-90196 CVE-2026-90198 CVE-2026-90199
                 CVE-2026-90200 CVE-2026-90201 CVE-2026-90202 CVE-2026-90203
                 CVE-2026-90207 CVE-2026-90209 CVE-2026-90213 CVE-2026-90214
                 CVE-2026-90215 CVE-2026-90216 CVE-2026-90218 CVE-2026-90219
                 CVE-2026-90220 CVE-2026-90221 CVE-2026-90222 CVE-2026-90223
                 CVE-2026-90224 CVE-2026-90225 CVE-2026-90226 CVE-2026-90227
                 CVE-2026-90228 CVE-2026-90229 CVE-2026-90230 CVE-2026-90235
                 CVE-2026-90241 CVE-2026-90243 CVE-2026-90245 CVE-2026-90248
                 CVE-2026-90249 CVE-2026-90250 CVE-2026-90251 CVE-2026-90253
                 CVE-2026-90254 CVE-2026-90255 CVE-2026-90257 CVE-2026-90262
                 CVE-2026-90274 CVE-2026-90275 CVE-2026-90279 CVE-2026-90280
                 CVE-2026-90281 CVE-2026-90282 CVE-2026-90283 CVE-2026-90284
                 CVE-2026-90285 CVE-2026-90286 CVE-2026-90287 CVE-2026-90290
                 CVE-2026-90291 CVE-2026-90292 CVE-2026-90293 CVE-2026-90294
                 CVE-2026-90295 CVE-2026-90296 CVE-2026-90297 CVE-2026-90298
                 CVE-2026-90302 CVE-2026-90303 CVE-2026-90307 CVE-2026-90308
                 CVE-2026-90309 CVE-2026-90313 CVE-2026-90314 CVE-2026-90316
                 CVE-2026-90318 CVE-2026-90319 CVE-2026-90322 CVE-2026-90325
                 CVE-2026-90327 CVE-2026-90329 CVE-2026-90334 CVE-2026-90341
                 CVE-2026-90344 CVE-2026-90348 CVE-2026-90352 CVE-2026-90353
                 CVE-2026-90354 CVE-2026-90357 CVE-2026-90358 CVE-2026-90360
                 CVE-2026-90361 CVE-2026-90362 CVE-2026-90364 CVE-2026-90366
                 CVE-2026-90368 CVE-2026-90370 CVE-2026-90372 CVE-2026-90373
                 CVE-2026-90374 CVE-2026-90375 CVE-2026-90378 CVE-2026-90380
                 CVE-2026-90382 CVE-2026-90383 CVE-2026-90385 CVE-2026-90386
                 CVE-2026-90387 CVE-2026-90388 CVE-2026-90389 CVE-2026-90390
                 CVE-2026-90391 CVE-2026-90392 CVE-2026-90393 CVE-2026-90394
                 CVE-2026-90395 CVE-2026-90397 CVE-2026-90398 CVE-2026-90399
                 CVE-2026-90400 CVE-2026-90402 CVE-2026-90403 CVE-2026-90404
                 CVE-2026-90407 CVE-2026-90410 CVE-2026-90411 CVE-2026-90413
                 CVE-2026-90414 CVE-2026-90415 CVE-2026-90416 CVE-2026-90418
                 CVE-2026-90419 CVE-2026-90420 CVE-2026-90426 CVE-2026-90428
                 CVE-2026-90430 CVE-2026-90431 CVE-2026-90433 CVE-2026-90434
                 CVE-2026-90435 CVE-2026-92476 CVE-2026-92477 CVE-2026-92481
                 CVE-2026-92484 CVE-2026-92488 CVE-2026-92489 CVE-2026-92490
                 CVE-2026-92491 CVE-2026-92494 CVE-2026-92495 CVE-2026-92496
                 CVE-2026-92497 CVE-2026-92498 CVE-2026-92501 CVE-2026-92502
                 CVE-2026-92504 CVE-2026-92506 CVE-2026-92507 CVE-2026-92508
                 CVE-2026-92509 CVE-2026-92510 CVE-2026-92511 CVE-2026-92512
                 CVE-2026-92514 CVE-2026-92515 CVE-2026-92519 CVE-2026-92521
                 CVE-2026-92522 CVE-2026-92523 CVE-2026-92524 CVE-2026-92525
                 CVE-2026-93037 CVE-2026-93039 CVE-2026-93040 CVE-2026-93041
                 CVE-2026-93042 CVE-2026-93045 CVE-2026-93046 CVE-2026-93048
                 CVE-2026-93049 CVE-2026-93050 CVE-2026-93051 CVE-2026-93052
                 CVE-2026-93053 CVE-2026-93054 CVE-2026-93055 CVE-2026-93056
                 CVE-2026-93061 CVE-2026-93062 CVE-2026-93063 CVE-2026-93064
                 CVE-2026-93065 CVE-2026-93067 CVE-2026-93070 CVE-2026-93071
                 CVE-2026-93072 CVE-2026-93073 CVE-2026-93082 CVE-2026-93083
                 CVE-2026-93084 CVE-2026-93085 CVE-2026-93086 CVE-2026-93089
                 CVE-2026-93090 CVE-2026-93091 CVE-2026-93092 CVE-2026-93093
                 CVE-2026-93095 CVE-2026-93097 CVE-2026-93098 CVE-2026-93101
                 CVE-2026-93102 CVE-2026-93103 CVE-2026-93107 CVE-2026-93108
                 CVE-2026-93109 CVE-2026-93110 CVE-2026-93113 CVE-2026-93114
                 CVE-2026-93115 CVE-2026-93117 CVE-2026-93118 CVE-2026-93119
                 CVE-2026-93120 CVE-2026-93121 CVE-2026-93123 CVE-2026-93126
                 CVE-2026-93128 CVE-2026-93130 CVE-2026-93131 CVE-2026-93132
                 CVE-2026-93133 CVE-2026-93134 CVE-2026-93136 CVE-2026-93137
                 CVE-2026-93138 CVE-2026-93140 CVE-2026-93141 CVE-2026-93142
                 CVE-2026-93145 CVE-2026-93149 CVE-2026-93150 CVE-2026-93151
                 CVE-2026-93152 CVE-2026-93155 CVE-2026-93156 CVE-2026-93158
                 CVE-2026-93159 CVE-2026-93160 CVE-2026-93161 CVE-2026-93162
                 CVE-2026-93163 CVE-2026-93165 CVE-2026-93167 CVE-2026-93170
                 CVE-2026-93172 CVE-2026-93173 CVE-2026-93174 CVE-2026-93177
                 CVE-2026-93178 CVE-2026-93182 CVE-2026-93183 CVE-2026-93184
                 CVE-2026-93185 CVE-2026-93186 CVE-2026-93188 CVE-2026-93189
                 CVE-2026-93190 CVE-2026-93191 CVE-2026-93192 CVE-2026-93203
                 CVE-2026-93204 CVE-2026-93205 CVE-2026-93206 CVE-2026-93207
                 CVE-2026-93208 CVE-2026-93209 CVE-2026-93210 CVE-2026-93211
                 CVE-2026-93212 CVE-2026-93213 CVE-2026-93214 CVE-2026-93215
                 CVE-2026-93219 CVE-2026-93222 CVE-2026-93223 CVE-2026-93224
                 CVE-2026-93226 CVE-2026-93228 CVE-2026-93229 CVE-2026-93234
                 CVE-2026-93235 CVE-2026-93236 CVE-2026-93238 CVE-2026-93239
                 CVE-2026-93240 CVE-2026-93242 CVE-2026-93245 CVE-2026-93247
                 CVE-2026-93250 CVE-2026-93252 CVE-2026-93256 CVE-2026-93259
                 CVE-2026-93261 CVE-2026-93262 CVE-2026-93264 CVE-2026-93268
                 CVE-2026-93269 CVE-2026-93271 CVE-2026-93273 CVE-2026-93274
                 CVE-2026-93275 CVE-2026-93278 CVE-2026-93279 CVE-2026-93280
                 CVE-2026-93281 CVE-2026-93283 CVE-2026-93286 CVE-2026-93287
                 CVE-2026-93288 CVE-2026-93781 CVE-2026-93782 CVE-2026-93783
                 CVE-2026-93784 CVE-2026-93785 CVE-2026-93786 CVE-2026-93787
                 CVE-2026-93788 CVE-2026-93789 CVE-2026-93790 CVE-2026-93791
                 CVE-2026-93792 CVE-2026-93793 CVE-2026-93794 CVE-2026-93795
                 CVE-2026-93796 CVE-2026-93797 CVE-2026-93798 CVE-2026-93799
                 CVE-2026-93800 CVE-2026-93801 CVE-2026-93802 CVE-2026-93803
                 CVE-2026-93804 CVE-2026-93805 CVE-2026-93806 CVE-2026-93807
                 CVE-2026-93808 CVE-2026-93810 CVE-2026-93811 CVE-2026-93812
                 CVE-2026-93813 CVE-2026-93814 CVE-2026-93815 CVE-2026-93816
                 CVE-2026-93817 CVE-2026-93818 CVE-2026-93819 CVE-2026-93820
                 CVE-2026-93821 CVE-2026-93822 CVE-2026-93823 CVE-2026-93824
                 CVE-2026-93825 CVE-2026-93826 CVE-2026-93827 CVE-2026-93828
                 CVE-2026-93829 CVE-2026-93830 CVE-2026-97407 CVE-2026-97408
                 CVE-2026-97409 CVE-2026-97410 CVE-2026-97411 CVE-2026-97412
                 CVE-2026-97413 CVE-2026-97414 CVE-2026-97415 CVE-2026-97416
                 CVE-2026-97417 CVE-2026-97418 CVE-2026-97419 CVE-2026-97420
                 CVE-2026-97421 CVE-2026-97425 CVE-2026-97427 CVE-2026-97428
                 CVE-2026-97429 CVE-2026-97430 CVE-2026-97434 CVE-2026-97435
                 CVE-2026-97436 CVE-2026-97437 CVE-2026-97438 CVE-2026-97439
                 CVE-2026-97440 CVE-2026-97441 CVE-2026-97442 CVE-2026-97443
                 CVE-2026-97444 CVE-2026-97445 CVE-2026-97446 CVE-2026-97448
                 CVE-2026-97449 CVE-2026-97450 CVE-2026-97451 CVE-2026-97452
                 CVE-2026-97453 CVE-2026-97454 CVE-2026-97455 CVE-2026-97456
                 CVE-2026-97472 CVE-2026-97473 CVE-2026-97475 CVE-2026-97476
                 CVE-2026-97481 CVE-2026-97482 CVE-2026-97483 CVE-2026-97484
                 CVE-2026-97485 CVE-2026-97486 CVE-2026-97487 CVE-2026-97488
                 CVE-2026-97489 CVE-2026-97490 CVE-2026-97491 CVE-2026-97492
                 CVE-2026-97494 CVE-2026-97495 CVE-2026-97496 CVE-2026-97497
                 CVE-2026-97500 CVE-2026-97502 CVE-2026-97504 CVE-2026-97505
                 CVE-2026-97506 CVE-2026-97507 CVE-2026-97508 CVE-2026-97509
                 CVE-2026-97510 CVE-2026-97512 CVE-2026-97514 CVE-2026-97516
                 CVE-2026-97517 CVE-2026-97518 CVE-2026-97520 CVE-2026-97521
                 CVE-2026-97522 CVE-2026-97523 CVE-2026-97524 CVE-2026-97539
                 CVE-2026-97540 CVE-2026-97541 CVE-2026-97542 CVE-2026-97543
                 CVE-2026-97544 CVE-2026-97545 CVE-2026-97546 CVE-2026-97547
                 CVE-2026-97551 CVE-2026-97552 CVE-2026-97555 CVE-2026-97556
                 CVE-2026-97557 CVE-2026-97560 CVE-2026-97562 CVE-2026-97564
                 CVE-2026-97568 CVE-2026-97572 CVE-2026-97573 CVE-2026-97575
                 CVE-2026-97576 CVE-2026-97577 CVE-2026-97578 CVE-2026-97579
                 CVE-2026-97581 CVE-2026-97582 CVE-2026-97583 CVE-2026-97584
                 CVE-2026-97587 CVE-2026-97592 CVE-2026-97595 CVE-2026-97596
                 CVE-2026-97598 CVE-2026-97599 CVE-2026-97600 CVE-2026-97601
                 CVE-2026-97602 CVE-2026-97604 CVE-2026-97605 CVE-2026-97606
                 CVE-2026-97607 CVE-2026-97608 CVE-2026-97611 CVE-2026-97612
                 CVE-2026-97613 CVE-2026-97616 CVE-2026-97617 CVE-2026-97899
                 CVE-2026-97900 CVE-2026-97902 CVE-2026-97904 CVE-2026-97905
                 CVE-2026-97907 CVE-2026-97908 CVE-2026-97909 CVE-2026-97910
                 CVE-2026-97915 CVE-2026-97916 CVE-2026-97917 CVE-2026-97920
                 CVE-2026-97921 CVE-2026-97922 CVE-2026-97923 CVE-2026-97924
                 CVE-2026-97925 CVE-2026-97926 CVE-2026-97927 CVE-2026-97929
                 CVE-2026-97930 CVE-2026-97931 CVE-2026-97936 CVE-2026-97940
                 CVE-2026-97945 CVE-2026-97948 CVE-2026-97951 CVE-2026-97952
                 CVE-2026-97953 CVE-2026-97954 CVE-2026-97957 CVE-2026-97958
                 CVE-2026-97959 CVE-2026-97961 CVE-2026-97963 CVE-2026-97964
                 CVE-2026-97965 CVE-2026-97966 CVE-2026-97967 CVE-2026-97968
                 CVE-2026-97969 CVE-2026-97970 CVE-2026-97973 CVE-2026-97976
                 CVE-2026-97977 CVE-2026-97978 CVE-2026-97979 CVE-2026-97981
                 CVE-2026-97982 CVE-2026-97984 CVE-2026-97985 CVE-2026-97986
                 CVE-2026-97987 CVE-2026-97990 CVE-2026-97991 CVE-2026-97992
                 CVE-2026-97993 CVE-2026-97994 CVE-2026-97995 CVE-2026-97996
                 CVE-2026-97998 CVE-2026-98001 CVE-2026-98006 CVE-2026-98007
                 CVE-2026-98008 CVE-2026-98009 CVE-2026-98010 CVE-2026-98011
                 CVE-2026-98012 CVE-2026-98013 CVE-2026-98014 CVE-2026-98015
                 CVE-2026-98016 CVE-2026-98017 CVE-2026-98018 CVE-2026-98020
                 CVE-2026-98021 CVE-2026-98022 CVE-2026-98023 CVE-2026-98024
                 CVE-2026-98025 CVE-2026-98026 CVE-2026-98027 CVE-2026-98028
                 CVE-2026-98029 CVE-2026-98030 CVE-2026-98031 CVE-2026-98037
                 CVE-2026-98039 CVE-2026-98041 CVE-2026-98045 CVE-2026-98046
                 CVE-2026-98051 CVE-2026-98052 CVE-2026-98054 CVE-2026-98055
                 CVE-2026-98056 CVE-2026-98057 CVE-2026-98059 CVE-2026-98063
                 CVE-2026-98064 CVE-2026-98066 CVE-2026-98068 CVE-2026-98069
                 CVE-2026-98070 CVE-2026-98071 CVE-2026-98072 CVE-2026-98074
                 CVE-2026-98075 CVE-2026-98076 CVE-2026-98077 CVE-2026-98078
                 CVE-2026-98080 CVE-2026-98081 CVE-2026-98082 CVE-2026-98083
                 CVE-2026-98086 CVE-2026-98088 CVE-2026-98089 CVE-2026-98090
                 CVE-2026-98091 CVE-2026-98092 CVE-2026-98094 CVE-2026-98095
                 CVE-2026-98096 CVE-2026-98097 CVE-2026-98098 CVE-2026-98102
                 CVE-2026-98103 CVE-2026-98104 CVE-2026-98105 CVE-2026-98107
                 CVE-2026-98108 CVE-2026-98109 CVE-2026-98110 CVE-2026-98111
                 CVE-2026-98113 CVE-2026-98114 CVE-2026-98116 CVE-2026-98121
                 CVE-2026-98122 CVE-2026-98123 CVE-2026-98126 CVE-2026-98127
                 CVE-2026-98128 CVE-2026-98129 CVE-2026-98130 CVE-2026-98142
                 CVE-2026-98151 CVE-2026-98152 CVE-2026-98154 CVE-2026-98155
                 CVE-2026-98157 CVE-2026-98158 CVE-2026-98159 CVE-2026-98160
                 CVE-2026-100070 CVE-2026-100071 CVE-2026-100075 CVE-2026-100078
                 CVE-2026-100079
Debian Bug     : 1108860

Several vulnerabilities have been discovered in the Linux kernel that
may lead to a privilege escalation, denial of service or information
leaks.

For the stable distribution (trixie), these problems have been fixed in
version 6.12.111-1.

We recommend that you upgrade your linux packages.

For the detailed security status of linux please refer to its security
tracker page at:
https://security-tracker.debian.org/tracker/linux

Further information about Debian Security Advisories, how to apply
these updates to your system and frequently asked questions can be
found at: https://www.debian.org/security/

Mailing list: debian-security-announce@lists.debian.org
-----END PGP SIGNED MESSAGE-----
The Daily Front Page 9 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Streams at the Edge
article

Cloudflare K2: serverless event streams

by elffjs·▲ 226 points·90 comments·blog.cloudflare.com ↗
Producers and consumers must align in scale and in time.

With traditional Remote Procedure Call (RPC) architectures, there exists a core challenge: producers and consumers must align in scale and in time. If your producers send too much data for your consumers to handle or if your consumers or downstream services become unavailable, events are dropped. This problem is compounded with multiple consumers that need to independently process the data. For example, an ecommerce backend may emit events when transactions are completed, which need to be read by an analytics system and a fraud detection service.

We can solve this by decoupling our producers and consumers — inserting a service in the middle that absorbs writes while allowing independent readers to consume at their own pace.

Today we are launching Cloudflare K2 in public beta to solve this problem. K2 is a durable event streaming primitive on the Developer Platform. You send events to a K2 stream, which stores them as an ordered log. Consumers can read them in a variety of ways, for example by splitting up reads across a set of consumers, or delivering all messages to all consumers. It's fully serverless, scales to vast quantities of data, and supports long-term retention, so even long periods of consumer downtime do not lose data.

Under the hood, K2 implements a partitioned, durable log on top of R2 object storage, which allows it to scale to huge volumes of storage.

If you’re ready to get started, you can create your first stream in seconds by following the guide here.

Streams on the edge

We first built K2 because we needed a durable buffer on the edge, initially to serve as the ingestion layer for Basin Pipelines. Pipelines is powered by a stream processing engine that operates on a pull-based model, which means some other system has to store events before they are read, transformed, and written to R2. And because we commit to never dropping events once they’re accepted into the Pipelines Stream, that storage has to be durable — meaning it can’t lose data — over potentially long periods of time.

This is where most companies would deploy Apache Kafka. However, Pipelines runs on the Cloudflare edge, which spans a huge number of servers across over 335 cities. Our unique architecture means we often cannot run traditional distributed systems software like Kafka, and need to rethink how these systems are built and operated.

For stateful services, in particular, Cloudflare’s global infrastructure presents some challenges: we get relatively small slices of machines, those machines are relatively ephemeral, and networking is often over the public Internet. But our infrastructure also has a few superpowers: it’s close to users wherever they are in the world and has an incredible capacity to scale horizontally.

In designing the durable buffering system that became K2, we decided to rely on the powerful state primitive we already have: R2. Object storage systems like R2 combine extremely durable storage (11 9s!) with strongly consistent APIs. Offloading replication and consensus to the storage layer allows us to make the application layer (K2 in this case) radically simpler, cheaper, and higher performance. A secondary benefit is that it separates compute and storage, meaning each can be scaled independently. This allows us to store vast quantities of historical data at low cost.

How do we build a log on top of object storage? An immediate issue is that R2 — like other object stores — does not support appends, the standard operation on a log. Instead, we must write complete files, or segments, that are large enough to overcome the cost of writing and reading each one. We do this by first accumulating writes in-memory on an edge service. After waiting a short period for data to arrive, we write all events as a segment file. We achieve ordering and strictly incrementing offsets using R2’s atomic operations without needing a separate coordination service.

While building on R2 has many advantages, there is one downside: higher produce latencies. Writing to object storage is slower than a local disk, and we have to wait for the local batch to accumulate before starting the write. In our initial release of K2, this adds up to about 1 second of produce latency at the 99th percentile of response times.

We will be sharing more details on the design of K2 in an upcoming technical deep dive.

Streams, Queues, or Pipelines?

Cloudflare has several existing asynchronous delivery primitives, including Queues and Basin Pipelines. When should you reach for K2 instead of these existing products?

There are some superficial similarities between Queues and K2 Streams: both receive events, durably store them, and deliver them to consumers. Queues are designed around tracking individual items of expensive or time consuming work that need to be asynchronously completed. For example, an image processing application may enqueue a user request to be handled by the actual image processing service. They support complex logic on the grain of a particular work item, like retries, delays, and dead-letter queues for failed attempts.

K2, by contrast, is designed for high-scale data movement, long-term retention, and fan-out consumption. Messages are produced and consumed as batches — enabling efficient processing at the expense of message-level retries. This batching also drives higher producer latency than for queues.

Basin Pipelines is a serverless ingestion service. You can send your Pipeline JSON events, which can be transformed and written to R2 or a Basin Catalog. We recommend Pipelines when the end result is writing your events to object storage or Iceberg tables, and K2 when doing custom processing or writing to other destinations.

Getting started

Using K2 involves first creating a stream. You can have many streams across your account for different use cases or types of events. Streams can be created via cf, Wrangler, the dashboard, or API.

Let's take the example of collecting and processing product analytics. First, we'll create a stream with cf:

$ cf k2 streams create --name app_events --http-enabled

{
  "id": "d78b09ee1f50430e9ec92a8af92b0231",
  "name": "app_events",
  "retention_seconds": 604800,
  "endpoint": "https://d78b09ee1f50430e9ec92a8af92b0231.k2.cloudflarestorage.com",
  "http": {
    "enabled": true,
    "authentication": false
  },
  "worker_binding": {
    "enabled": true
  },
  "created_at": "2026-09-28T15:14:39.053Z",
  "modified_at": "2026-09-28T15:14:39.053Z"
}

Once we have a stream, we can start producing to it, via an HTTP API or Worker binding. For example, from a Worker:

const result = await env.EVENTS.send([
  {
    content: new TextEncoder().encode(
      JSON.stringify({
        event: "page_view",
        path: new URL(request.url).pathname,
        timestamp: Date.now(),
      }),
    ),
    headers: { "content-type": "application/json" },
  },
]);

if (!result.success) {
  console.error(`Produce failed: ${result.error.message}`);
  return new Response("Failed to record event", {
    status: result.error.retryable ? 503 : 500,
  });
}

K2 represents data as bytes, so you can use whatever format or encoding makes sense for your application.

Now that we have events in a stream, we can create a subscription. Subscriptions divide up work between consumers, enabling read parallelism — scaling out to multiple readers to handle more load than a single server can manage.

We can create a subscription via the HTTP API.

$ curl -X POST "https://d78b09ee1f50430e9ec92a8af92b0231.k2.cloudflarestorage.com/subscriptions" \
    -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
    -H "Content-Type: application/json" \
    --data '{
      "name": "analytics_processor",
      "start_at": { "type": "earliest" }
    }'
{
  "result": { "id": "ee13f761783d3823a447a47b572ebf76" },
  "success": true,
  "errors": [],
  "messages": []
}

With the subscription created, we can then poll it from each of our consumers:

$ curl -X POST \"https://4d8f5394e3e733debdeca9c65c5b7439.k2.cloudflarestorage.com/subscriptions/ee13f761783d3823a447a47b572ebf76/consume" \
    -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
    -H "Content-Type: application/json" \
    --data '{
      "worker_id": "analytics-1",
      "max_records": 100
    }' 
{
  "result": {
    "batch_id": "b7e4c9210a3f468d95c2e1068fdb734a",
    "leased_until_ms": 1790633929437,
    "records": [
      {
        "timestamp_ms": 1790633629168,
        "content": "eyJldmVudCI6InBhZ2VfdmlldyJ9",
        "headers": {
          "content-type": "application/json"
        }
      },
      ...
    ]
  },
  "success": true,
  "errors": [],
  "messages": []
}

When a client calls consume, they receive a lease for that particular batch of events for 5 minutes. The client can do one of three things:

  • ack the batch, which marks it as processed and ensures it will not be redelivered
  • nack (negative ack) it, meaning we’ve failed to process it and would like it to be redelivered
  • extend its lease, in case it needs more time to complete processing
$ curl -X POST "https://d78b09ee1f50430e9ec92a8af92b0231.k2.cloudflarestorage.com/subscriptions/ee13f761783d3823a447a47b572ebf76/batches/b7e4c9210a3f468d95c2e1068fdb734a/ack" \
  -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{ "worker_id": "analytics-1" }'

This is one way to consume from K2: splitting work amongst multiple consumers such that each consumer gets a portion of the data. Another way to read is with a separate subscription for each consumer — the pub/sub pattern — in which case each consumer sees all of the messages. Or you can mix-and-match between these two approaches, having multiple independent consumer pools.

See the K2 docs for full details on the APIs.

Pricing and Availability

K2 is available today in public beta for accounts with Workers Paid subscriptions, within these limits:

  • Maximum of 10GB of storage used
  • 30 MB/s produce per stream

If you need higher limits, please reach out to the team on Discord or fill out the limit increase form.

Usage of K2 will not be billed during the beta period. Once we begin billing, we anticipate this pricing:

Pricing Cost
Data Produced $0.04 / GB
Data Consumed $0.04 / GB
Data Retained $0.02 / GB / month

What’s next

We have an exciting roadmap for K2 over the coming months, including:

  • Higher write parallelism, up to multi-GB/s streams
  • Message keys and key-based ordering guarantees
  • Push-based worker consumers
  • Express tier with lower produce and end-to-end latencies
  • Drop-in support for Apache Kafka clients

We’re excited to see what you build on K2! Share your feedback on the Cloudflare Discord.

The Daily Front Page 10 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Chip Design, by Model
article

GPT-Synopsys: Frontier Intelligence to Revolutionize Chip Design

by giuliomagnifico·▲ 176 points·106 comments·news.synopsys.com ↗
Frontier Intelligence to Revolutionize Chip Design.

Companies form strategic partnership to dramatically advance and accelerate semiconductor innovation

News Highlights:

  • Companies sign multi-year agreement to collaborate as preferred partners to develop and deliver GPT-Synopsys, a specialized model for chip design that brings together OpenAI's frontier AI with Synopsys' trusted EDA tools and chip design expertise
  • OpenAI to license Synopsys' trusted electronic design automation (EDA) tools for development of the specialized model
  • Synopsys & OpenAI to closely collaborate on R&D and joint go-to-market initiatives with a shared revenue framework

SAN FRANCISCO and SUNNYVALE, Calif., Sept. 30, 2026 /PRNewswire/ -- Synopsys (Nasdaq: SNPS) and OpenAI today announced a strategic partnership that brings together OpenAI's advanced AI capabilities with Synopsys' industry-leading EDA tools and agentic AI capabilities to revolutionize the design of semiconductors. The companies signed an expansive, multi-year agreement to jointly develop GPT-Synopsys, a specialized model, optimized to use Synopsys EDA tools to perform semiconductor design workflows. The agreement includes a revenue sharing arrangement and go-to-market collaboration to jointly make GPT-Synopsys available to customers worldwide.

OpenAI and Synopsys Announce GPT-Synopsys: Frontier Intelligence to Revolutionize Chip Design

Today, agentic AI technologies connect general-purpose models to EDA tools to run chip-design workflows. The next leap, with this partnership, is to make frontier models experts in using EDA tools: learning to run the tools as expert engineers, interpreting their outputs, and iteratively optimizing designs using the tools. This integration will make the model a native expert user and enable engineers to explore more design alternatives and optimize power, performance and area (PPA) to rapidly deliver more sophisticated designs.

"The future of semiconductor engineering requires dramatic acceleration of the chip design process without compromising PPA or first-time-right silicon. This agreement will expand access to Synopsys' advanced design capabilities and the underlying, ground-truth engineering tools required to bring increasingly complex chips to market," said Sassine Ghazi, president and CEO of Synopsys. "Together with OpenAI, we're bringing frontier intelligence to chip design to help more companies develop and accelerate advanced silicon, while maintaining the rigor and trust required for manufacturing success."

"We're using our most advanced technology to improve the systems that power AI," said Greg Brockman, president and co-founder of OpenAI. "With Synopsys, we're bringing that work to chip design, helping engineers explore more designs and get to a working chip faster. By helping them build better chips, we can build better AI and bring it to more people."

GPT-Synopsys to Revolutionize AI-native Chip Design

GPT-Synopsys brings together OpenAI frontier models with Synopsys' EDA technology and domain expertise, enabling the specialized model to reason about chip design and verification, and to directly operate Synopsys' tools. Engineers will delegate design objectives—from PPA optimization to timing and verification closure—with agents running tools, interpreting results, implementing changes, and iterating toward verified outcomes for engineer review. GPT-Synopsys will run on OpenAI-hosted infrastructure, will be designed to interoperate with customer agent harness systems, and will be deeply integrated with Synopsys.ai and the Synopsys Autopilot, agentic AI platform. Early technology engagements are underway with leading semiconductor customers.

The joint service offering will provide the bundled compute, model, and licenses, while ensuring customer-specific design data is protected. GPT-Synopsys will feature enterprise-grade security, governance, and access controls. Customer data is not used to train the model, is encrypted at rest and in transit, and can be managed through configurable retention, audit and permission controls.

About Synopsys

Synopsys, Inc. (Nasdaq: SNPS) is the leader in engineering solutions from silicon to systems, enabling customers to rapidly innovate AI-powered products. We deliver industry-leading silicon design, IP, simulation and analysis solutions, and design services. We partner closely with customers across a broad range of industries to maximize their R&D capability and productivity, powering innovation today that ignites the ingenuity of tomorrow. Learn more at www.synopsys.com.

Forward-Looking Statements

This press release contains forward-looking statements, including, but not limited to, statements regarding the development, capabilities, timing, availability, and anticipated benefits of GPT-Synopsys as well as Synopsys and OpenAI's strategic partnership. These statements involve risks, uncertainties and other factors that could cause our actual results, time frames, or achievements to differ materially from those expressed or implied in such forward-looking statements. Information on potential risks, uncertainties and other factors that could affect Synopsys' results is included in filings we make with the SEC from time to time, including in the sections entitled "Risk Factors" in our latest Annual Report on Form 10-K and in our latest Quarterly Report on Form 10-Q. Synopsys undertakes no duty, and does not intend, to update any forward-looking statement provided in this press release, whether as a result of new information, future events or otherwise, unless required by law.

Contacts:

Synopsys Investor Relations
Tushar Jain
synopsys-ir@synopsys.com

Synopsys Media Relations
Cara Walker
cara@synopsys.com
corp-pr@synopsys.com

SOURCE Synopsys, Inc.

The Daily Front Page 11 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Your Car Is Listening
article

Automatic Transmission – a data-privacy study of connected vehicles

Your car is a smartphone on wheels. Here's who's listening.

The first large-scale measurement study of the connected-vehicle ecosystem.

A connected car is a vehicle with built-in internet access — Wi-Fi, cellular, GPS — that lets it communicate constantly with its manufacturer and outside companies. Over 75% of vehicles sold globally have this connectity built-in.

A connected vehicle

It knows where you drive.

It knows who you are.

It can share this data and more with insurance companies, advertisers, etc...

Report Summary

Partnering with Consumer Reports, we tested 21 late model vehicles and 30 companion mobile apps to understand the privacy implications of the connected vehicle ecosystem.

  • We find that both vehicles and companion apps contact numerous third-party domains, including advertisers and trackers.
  • 19/21 vehicles tested send traffic to at least one third party.
  • Seven of 30 apps transmit sensitive identifiers to third-party companies.

We go through a lengthy discolure process and provide insight into how manufacturer's perceive this data sharing issue.
Our findings underscore the need for continued measurement and scrutiny of the connected vehicle ecosystem.

Partnership with Consumer Reports

Consumer Reports gave the team access to its purchased fleet of test vehicles — a sample that would have cost over $1.2M to assemble independently.

The Paper

This work is peer reviewed and will be published at IMC '26. Read the paper →

The Research Team

We are a team of privacy, security, and networking-systems researchers at Northeastern University. See the full team →

Research Questions

Diagram of how the connected vehcile ecosystem works

Connected Vehicle Ecosystem

This diagram shows the data flows to and from a vehicle and its companion mobile app. Both devices send data, including private consumer data, to different 1st and 3rd party servers using Wi-Fi and cellular service. Solid arrows represent flows that were intercepted through our experiments.

The Problem

Once the data gets sent to these servers, it is up to the companies that receive the consumer information to make decisions on what they do with it. Unfortunately, in many cases, this includes sharing or selling consumer data to other undisclosed 3rd parties.
Consumers have no control over their data once it has left their device

In this paper, we take the first steps to address the limited visibility into the privacy implications of the connected vehicle ecosystem. We identify two vantage points in the ecosystem where we can gain insight into the data that connected vehicles are sharing with both manufacturers and third parties: the vehicles themselves and the mobile apps provided by manufacturers.
We ask the following guiding questions:

  • What personal consumer data do connected vehicles and their companion mobile apps transmit?
  • Who receives that personal consumer data?
  • What is the manufacturer response to these findings?

Methods

We investigated 21 vehicles from the U.S. market in a controlled environment along with 30 companion mobile apps instrumented with on-site vehicles between October 2024 and August 2025. Below is a description of the experiments we ran and our setup.

Vehicle Testing

Testing Setup

Wi-Fi Testing Setup

To collect Wi-Fi traffic from vehicles, we configured a custom access point (AP) on a Raspberry Pi and used tcpdump to log all packets that were sent or received via this AP.
This allowed us to see all the destinations the vehicles were sending data to but not the information within the packets as it was encrypted.

Vehicles at the testing facility

Stationary Tests

Idle Baseline
vehicle on — no activity

Active Test
perform all possible actions

Driving Test

drive 5–45 mph with acceleration & hard braking

Isolating Cellular Traffic

Faraday tent used to block cellular signals

One hypothesis we tested was whether blocking a vehicle’s ability to communicate over its cellular network would force more Wi-Fi communication. To block external cellular signals, we drove 11 EVs in the sample into a car-sized Faraday tent providing ≈93 dB of attenuation, blocking their cellular connection entirely. Stationary Idle and Active tests were repeated inside the tent to see whether traffic that normally goes out over cellular rerouted to Wi-Fi instead.

App Testing

In total, we experimented with 30 connected vehicle companion apps that were paired with the vehicles at Consumer Reports’s testing facility.

Device Setup

  • We used a combination of test phones and iOS versions for our experiments: an iPhone 8/iOS 16.6, an iPhone X/iOS 16.7.11, and an iPhone 13/iOS 18.5.
  • To minimize background traffic, we deleted all non-essential apps on the test phones and tested apps one-by-one, including deleting each vehicle app and restarting the phone before downloading the next app.
  • We used the iOS native screen recording feature to record our interactions with each app for later review.
  • To capture and decrypt network traffic from the companion mobile apps, we used iPhones with custom root certificates connected to mitmproxy.

Process for Testing Each App

  • During app installation and login we accepted all permission requests (e.g., tracking, location, calendar access, Bluetooth, notifications) that the application requested.
  • We had a Consumer Reports employee log into the app using their existing credentials associated with a vehicle on the lot.
  • Once we were logged-in, we manually exercised all available functionality, such as looking for nearby charging staions, geolocating the vehicle, viewing vehicle data and service history (e.g., tire pressure), viewing notifications (e.g., “doors are unlocked”), and viewing in-app privacy policies.
  • Some apps allowed us to perform physical interactions on the vehicle, such as remotely opening the trunk. We performed all such actions and verified that the vehicle completed each request.

Vehicle Dataset

$1.2M+

estimated cost to independently procure this fleet, only possible due to Consumer Reports partnership

Manufacturer Brand Year Model Vehicle Tests Driving Idle In-Tent Cellular
General Motors (GM) Buick 2024 Envista ✓ ✓ – –
General Motors (GM) Cadillac 2024 Lyriq ✓ ✓ ✓ –
General Motors (GM) Chevrolet 2024 Blazer ✓ ✓ ✓ –
Stellantis Dodge 2023 Hornet – ✓ – –
Stellantis Fiat 2024 500e ✓ ✓ ✓ –
Stellantis RAM 2025 1500 Bighorn ✓ ✓ – –
Fisker Fisker 2023 Ocean ✓ ✓ – –
Ford Motor Co. Ford 2022 F150 Lightning ✓ ✓ – –
Ford Motor Co. Ford 2024 Mustang GT Fastback ✓ ✓ – –
Honda Motor Co. Honda 2024 Prologue Touring AWD ✓ ✓ ✓ –
Tata Motors Land Rover 2023 Range Rover Sport ✓ ✓ – –
Toyota Motor Corp. Lexus 2024 NX450H+ PHEV ✓ ✓ – –
Toyota Motor Corp. Toyota 2023 Corolla Cross ✓ ✓ – –
Toyota Motor Corp. Subaru 2023 Solterra ✓ ✓ ✓ –
Lucid Lucid 2023 Air Touring ✓ ✓ ✓ –
Mercedes-Benz Group AG Mercedes 2023 EQS450 4Matic ✓ ✓ – –
Renault-Nissan-Mitsubishi Alliance Nissan 2023 Ariya Platinum ✓ ✓ ✓ –
Rivian Rivian 2022 R1S ✓ ✓ ✓ –
Tesla Tesla 2024 Cybertruck ✓ ✓ ✓ –
Tesla Tesla 2024 Model 3 ✓ ✓ ✓ ✓
Zhejiang Geely Holding Group Volvo 2024 C40 ✓ ✓ ✓ –

*****While we tested a wide range of vehicles, we did not cover every manufacturer in the U.S. market. As with all empirical studies, our results should be interpreted as a snapshot in time, and may not generalize to vehicles outside our sample or outside the U.S.

Findings

  • 19 of 21 vehicles contacted at least one third party over Wi-Fi, including known advertising and tracking domains.
  • 7 of 30 companion apps transmitted sensitive identifiers (VINs, emails, phone numbers, precise location) to third parties associated with advertising and tracking.
    Transmiting multiple forms of PII to the same third party allows advertisers to build in-depth profiles on consumers.
  • Pairing a companion app roughly doubled a vehicle's exposure to advertising/tracking companies on average, and in some cases added 20+ new ones.

Manufacturer Disclosures

  • The team disclosed these findings to the different manufacturers featured in the study, below is an interactve summary of the different explanations received.
  • The ongoing theme of all these responses was shifting the blame to the consumer.
  • The current system does not give owners the ability to choose.
    Assuming owners can find the particular agreements, if an owner decides they are uncomfortable with the data sharing described within them, they are faced with (arguably) unfair choices:
    1. accept the agreements regardless of their concerns
    2. stop using their car's connected-vehicle features - which includes remote start, the app, and other very useful features
    3. stop using the vehicle entirely
  • As one notable exception, Honda improved its data collection practices to prevent sending precise geolocation to a third party associated with user tracking.

Conclusion

  • We found that vehicles, under a variety of real-world settings, contact not only a wide range of first parties (i.e., manufacturer domains) and car-specific support parties, but also third parties that are known to provide advertising and tracking services.
  • Vehicles from the same manufacturer exhibit different network behaviors - this makes it very difficult and expensive to study these vehicles.
  • When adding vehicle companion apps to the analysis, we found that vehicle owners are exposed to even more privacy-sensitive ATA communication—in some cases more than two dozen additional trackers.
  • Our study revealed a large gap between what vehicle manufacturers publicly disclosed and how the connected vehicle ecosystem actually shares data over the Internet
  • Based on the opaque nature of vehicular systems, we argue that there is a need for better transparency to ensure increased visibility into the entire ecosystem to identify and address corresponding harms.
The Daily Front Page 12 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Learning in the Age of Chatbots
article

The death of web development education

by ibobev·▲ 189 points·147 comments·molily.de ↗
Rescuing a field from disappearing.

Rescuing a field from disappearing

In a personal blog post, Baldur Bjarnason describes how he worked in various fields and positions: as an author, publisher, consultant, developer, educator, as well as radio and TV producer. None of these jobs were economically viable in the long term.

Adding insult to injury, the respective communities alienate interdisciplinary people who do not fit into their narrow conception of the field. For example, either you are considered as too “technical” for a “creative” job or too “creative” for “technical” job.

Bjarnason describes the impact of generative AI on web development education:

[All] my training and education projects had dropped off one by one. Most of my peers who had been selling courses and training were shutting down their businesses. The demand for web dev ebooks had cratered. […]

Software developers haven’t all switched to using agents for their coding, but they do seem to have all switched to error-prone, backwards-facing, nondeterministic chatbots for what now passes as web dev “education”.

Many independent educators who used to earn a living from web development training and developer relations have reported that GenAI has ruined their business.

Axel Rauschmayer is one of the world’s most prolific writers on JavaScript and TypeScript. He used to publish his e-books as free online books. Since 2005, he has explained the details of ECMAScript and other web technologies in his influential blog 2ality. Now he writes:

The income from my book sales went from being enough for me to live off (2024) to zero (2026).

The traffic to my blog and my books (which were free to read online) increased beyond what I can currently afford. Virtually all of it comes from AI crawlers, so there is no ad income.

Therefore, I’m taking my blog and my books offline so that I can decide what to do next – especially w.r.t. AI companies stealing my work.

(Rauschmayer still sells his books on JavaScript and TypeScript for a reasonable price!)

Salma Alam-Naylor used to work in Developer Relations, a role under constant pressure to justify its existence. Companies expect DevRel to generate short-term financial gain – which it cannot by nature. This lead Alam-Naylor to burnout and anxiety. In this situation, she writes that AI is killing developer education:

[Developers] aren’t gathering together in online spaces to learn and teach and share exciting projects anymore, rather they are mindlessly scrolling for a much-needed hit of short-form content dopamine (because the horrors of the world are more persistent than ever). […] [Many] developers have replaced authentic human collaboration with conversations with the dreaded Chat Bots. […]

The future feels bleak for educators. Rich curriculums we craft intentionally and carefully for real human audiences are now routinely stolen and regurgitated by predictive algorithms. The Chat Bots, with their sycophantic tone of voice, are deliberately engineered to erase our own personalities, hard work and craft entirely from the equation.

The only conclusion I can draw from this is that my experience, skills, empathy and teaching expertise no longer hold the value they once did in this volatile industry (if they ever really did?).

Alam-Naylor decided to accept a lower-paid developer job without public exposure. She decided to go offline.

She cites Josh W. Comeau, who creates online courses, well-researched articles and interactive tutorials on web technologies. GenAI has destroyed his business model as well:

I’ve spoken to a few course creators now, and we’re all seeing the same trend. Revenue down 50%+. Fewer people engaging with our content. People switching to LLMs, which slurp up all of our work and regurgitate it, without consent or compensation.

Comeau notes that with LLMs, there’s no incentive for people to make high-quality free content.

YouTube content creator Kyle Cook from Web Dev Simplified reported that the views on his programming tutorials and thereby his income essentially dropped by half.

I’m making half the money I was making exactly one year ago. [This] is definitely not sustainable for a full-time job. […] [There’s] almost no incentive as a creator of content to create programming content when it makes practically no money and is incredibly difficult to make when I could just make a video about the latest AI model, which is easy to make, makes more money, and gets more views. […] There’s almost no reason to make programming content anymore. The only reason I do it is because I find value in it. I find enjoyment in it. And I’m able to make money through other means rather than just YouTube ad revenue.

Rachel Andrew is a renowned technical writer and editor of many books and articles on web topics. In a series of blog posts, she reflects on the impact of GenAI on technical publishing. She reports that GenAI has broken the relationship between subject matter experts – the authors of the original draft – and editors who proof-read, fact-check and polish the article.

Editors have to apply extra scrutiny because AI tools might have introduced subtle inaccuracies without the original authors being aware of it. AI can be very confidently wrong, and if the text seems clear, it’s possible to miss that it’s clearly nonsense. Authors want to save some time, but create additional work for the editing team.

Andrew sees LLMs as a useful tool but emphasizes that its field of application is very limited and its output needs to be reviewed by people who deeply care about the end result.

She further questions whether AI actually increases productivity. Potential productivity gains stem from GenAI automating certain tasks. These tasks can as well be automated without AI, Andrew says, AI just makes it more accessible to non-coders. Now that more information, like API references, is made available in a machine-readable format for LLMs, it’s easier to perform non-AI automations.

Again Andrew argues that perceived individual productivity benefits might come from shifting the work onto someone else. For example, writers shift the work onto technical editors or even the readers. [You] might feel more productive, but all you’ve done is move the work around, make someone else’s job or experience measurably worse, and reduce quality. In summary, she asks (emphasis mine):

How can we justify the cost (financial, environmental, and human) of AI, if the reality is a relatively small bump in productivity that could have happened by teaching more people to automate tasks using existing tools or simple coding? Why aren’t businesses encouraging people to use non-AI methods where possible, saving the AI only for where it adds value? Given the societal costs, and the benefit to a business of bringing onboard and training people, perhaps on a balance of things even those tasks where AI is needed are better performed by people.

First and foremost, I would like to acknowledge these experiences and amplify these voices. GenAI has catastrophic effects on web development education and learning. It threatens the livelihoods of writers, teachers and communicators who make web technologies approachable and accessible, who nurture the next generation of web authors and developers.

There is no obvious short-term solution. This does not stop some people from posting knee-jerk reactions. I won’t link to these blog posts, but they go like this:

  • They advice to ”adapt” to GenAI and “agentic” development and to “come to terms” with the new situation.
  • They want to cheer people up by saying “you’ll get used to it”, “you’ll find a new role” – even if the role is cleaning up slop.
  • They argue: “You cannot expect the field not to change”. “AI is here to stay.”

These reactions are in essence the same as “you gotta jump on the AI train or you’ll perish”. Such comments are merely turning the knife in the wound.

I cannot give those educators any advice. But I do imagine a more compassionate reaction:

I highly appreciate your work as an educator, writer, researcher, or free and open-source software developer. A heartfelt thank you. I am sorry that AI sucks all joy out of you and your profession.

I acknowledge that AI companies appropriate your labor, destroy your economic livelihood and threaten the foundations of your field.

This very situation won’t get better with more AI, better AI, or developing with or for AI.

In a situation where Big Tech teamed up with fascist movements, it sounds far-fetched, but the bare minimum would be to force the AI oligarchs to pay for the crisis they are imposing on the web community, among others. We need to expropriate the expropriators.

Against the destruction of web development education, I’d like to hold up certain values. In a previous blog post, I described how I once entered web development through a volunteer-driven, non-commercial documentation project.

Such initiatives democratized the web as they helped a wide range of people to establish their own web sites and communities – local businesses, self-employed professionals, art and craft groups, neighborhood initiatives, schools and kindergartens, sports clubs, LGBTQ+ folks, fandoms etc.

Today, we often hear the word “democratize” from GenAI promoters, but it means the exact opposite. AI centralizes power and commodifies knowledge, instead of teaching skills and deep understanding.

The web is a radical democratic medium. Right now, tech oligarchs and fascist movements are trying to dismantle its radical potential. We must ensure that everyone can shape the web.

Participating in independent learning communities, using open technologies based on ethical principles, and building a shared and inclusive digital infrastructure is an act of self-empowerment and emancipation.

Humans need to have the resources to learn, research and teach web publishing skills. It is humans who do all the essential knowledge and education work, and they need to be paid for it.

This sounds trite, but GenAI advocates do not acknowledge it. They let Big Tech get away with appropriating the work of web educators. We cannot make concessions here.

On web development as a whole, Bjarnason draws a bleak conclusion (emphasis mine):

I don’t enjoy my field any more because the field is gone. Assuming that there’s still something there is a mistake. That feeling you have isn’t a frustration with changes to your chosen field. It’s nostalgia for a field that disappeared overnight. What passes as web dev today at large bears no resemblance to the field we built over the years. Everything we learned has been abandoned because companies assume it’s all been encoded into their chosen Large Language Model.

Assuming that’s true, I am guilty of nostalgia. I just believe in a resilient web that is not that easy to lock in a cage. To rebuild the field of web development, it requires a network of people who support each other, get a grip on web technologies, dig out best practices and establish new ones, and share their insights.

The Daily Front Page 13 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Racket’s Weekend
article

RacketCon Is Saturday

by spdegabrielle·▲ 136 points·37 comments·con.racket-lang.org ↗
A public gathering dedicated to fostering a vibrant, innovative, and inclusive community around the Racket programming language.

The Racket logo

(sixteenth
 RacketCon)   

October 3-4, 2026

Oakland, California, USA

Oakstop, Broadway Gallery Suite

RacketCon is a public gathering dedicated to fostering a vibrant, innovative, and inclusive community around the Racket programming language. We aim to create an exciting and enjoyable conference open to anyone interested in Racket, filled with inspiring content, reaching and engaging both the Racket community and the wider programming world.

Registration is open!

Please register for RacketCon 2026 by following this

registration link

with discounted early registration before September 13.

As in previous years, RacketCon will be streamed for those unable to attend in person. Recordings will also be made available on YouTube some time after the conference. Streaming users will have the option to purchase a remote participation ticket to support the livestream. Previous RacketCon presentations can be found here.

Live Stream

Link

Live chat will be available during the conference.

Saturday, October 3rd

Saturday, 8:30AM PDT

Doors Open

Saturday, 9:00AM PDT

Pat Hanrahan

On Notation

Bio: Pat Hanrahan is the Canon Professor of Computer Science and Electrical Engineering Emeritus at Stanford University. He led design of RenderMan at Pixar, co-founded Tableau, and recieved the 2019 ACM Turing Award.

Saturday, 10:00AM PDT

Break

Saturday, 10:30AM PDT

Fred Fu

Type Inference With Logical Types For Untyped Languages

Racket and Rhombus support flexible idioms that pose challenges for type systems. Typed Racket, the gradually typed counterpart of Racket, uses occurrence typing to type-check programs whose control flow depends on run-time type tests. To alleviate the burden of annotation, Typed Racket also supports local type inference. Problems arise, however, when a Typed Racket program imports a macro from a Racket module that expands to complex code containing lambda expressions. Programmers cannot add annotations to generated parameters. Moreover, local type inference is not designed to infer types for lambda parameters. Therefore, the type system usually conservatively rejects the code. As a result, programmers often have to rewrite macros in Typed Racket. My ongoing prototype type inference system addresses the problem by combining occurrence typing and algebraic subtyping. In this talk, I will demonstrate how the new type inference handles patterns commonly seen in Racket programs.

Bio: Fred Fu is a PhD candidate at Indiana University. While introducing new features to Typed Racket, he has also been fixing bugs in the language as well as flaws in the metatheory of occurrence typing, one of the distinguishing features underlying its type system.

Saturday, 11:10AM PDT

Lucas Myers

Language-Oriented Low-Level Programming with Pille

Racket and Rhombus offer incredible expressive power, but the Racket VM can become a limiting factor for low-level performance and efficiency—and it necessitates a runtime system that precludes highly-constrained platforms like microcontrollers. Pille (pronounced like “peel”) is a new Rhombus-based language that aims to bring language-oriented programming to low-level and high-performance domains. In particular, Pille grafts Rhombus’s enforestation process onto a new core language with an LLVM-based compiler, bypassing the limitations of the Racket VM while retaining full Rhombus-based macros. This talk will provide an introduction to Pille, with a particular emphasis on how its high-level metaprogramming—not all of which derives from Rhombus—can address decidedely low-level problems.

Bio: Lucas Myers is a PhD student at Northwestern University (advised by Robby Findler), where his research focuses on adapting the ideas and technologies of extensible programming languages—especially Racket and Rhombus—to the domain of systems programming. Prior to starting his PhD, Lucas worked in the software industry on an eclectic mix of projects that spanned the hardware/software stack. He is broadly interested in finding PL solutions to systems problems, and see extensible languages as holding immense (and largely unrealized) potential in that pursuit.

Saturday, 11:50AM PDT

Lunch

Lunch is provided.

Saturday, 1:30PM PDT

Mike Delmonaco

Treason: Making Macros and IDE Services Work Together

Racket’s macros let us extend the language and create DSLs, but they also get in the way of providing good IDE services when the program is broken or incomplete. Treason is a prototype of a macro-extensible language that provides good IDE services even when such errors prevent complete macro expansion. Treason’s macro expander recovers from errors to continue expanding and collecting information used to drive IDE services. Our key contribution is spec-driven subexpression expansion: syntax-class annotations allow us to expand subexpressions even within a broken macro use.

Bio: Mike Delmonaco is a Software Engineer at Amazon Web Services with a hobby interest in Programming Languages and Racket. Outside of work, he enjoys rock climbing, video games, creating interactive math visualizations, writing music, programming language research, and teaching.

Saturday, 2:10PM PDT

Pavel Panchekha

Herbie: Improving Floating-point Accuracy

Floating-point math requires rounding, so it’s not perfectly accurate. But how inaccurate it is depends on how you do your computation: two ways of writing the same mathematical formula can have radically different accuracy. Herbie is a compiler that exploits this property to compile mathematical formulas to accurate floating-point expressions. The talk will introduce floating-point error, demonstrate Herbie, talk a bit about how it works, and reflect on ten years of writing Herbie in Racket.

Bio: Pavel is an Associate Professor at the University of Utah and a Herbie developer.

Saturday, 2:50PM PDT

Break

Saturday, 3:30PM PDT

JJ

Effect Handlers in cio

Effect handlers — What are they? How do they work? We will discuss the design of cio, an (untyped) effect-handler library for Racket and Guile Scheme, and delve into the user interface considerations and implementation strategies of effect handlers broadly. Effect handlers, similar to delimited continuations, offer the expression of general non-local control flow through a minimal set of primitives, yet more closely resemble standard imperative constructions — but preserve pure reasoning principles by separating the invocation of a particular effect from its implementation. We discuss this, and further discuss some of the challenges and limitations of a library-level implementation of effect handlers.

Bio: JJ is a linguist by trade, living and working in Vancouver, British Columbia, by the Salish Sea. They are also a hobbyist programmer and a programming languages nerd: interested in language in its capability as an interface for expressing intent — between humans and other humans, and between humans and computers. They are a big fan of Rust, Lean 4, and (of course) Racket.

Saturday, 4:10PM PDT

Ryan Culpepper

BrandX: Commoditizing OOP with Interfaces, Generics, and Contracts

BrandX is a new Racket library primarily for OOP via interfaces and generic functions with proper contract support. This talk explains my motivations for a new library, mainly stemming from limitations in racket/class and racket/generic. It discusses the library design in terms of syntax, semantics, and ergonomics—how to improve on existing features and how to mitigate the loss of omitted features. It sketches some aspects of the implementation, including some under-appreciated macro tricks for modern Racket. Finally, it reports on experiences using the library so far.

Bio: Ryan is a developer of Racket who focuses on macros and Rackety library design.

Saturday, 6:00PM PDT

Evening Social

Drake’s Dealership

2325 Broadway

Gathering with drinks and snacks.

Sunday, October 4th

Sunday, 8:30AM PDT

Doors Open

Sunday, 9:00AM PDT

Sam Phillips

Uke: Immutable Dataframes for Racket

Dataframes emerged from statistical programming languages in the 90s, and now many languages have them. Even Racket has several to choose from. Uke is an opinionated dataframe library that focuses on immutability and tries to be efficient about copying.

Bio: Sam is an engineer that works with machine data.

Sunday, 9:40AM PDT

Matthew Flatt

A New Foreign-Function Interface: ffi2

Eli Barzilay’s FFI (ca. 2004) made C-based dynamic libraries accessible within Racket programs without new C code. This approach had precedents in Lisp and Scheme systems, including Chez Scheme, but Barzilay’s dynamic esthetic and pioneering use of Racket macros resulted in an especially convenient and composable interface that was a good fit to the underlying runtime system. Meanwhile, Andy Keep’s ftypes layer (ca. 2011) for Chez Scheme’s FFI similarly takes advantage of macros for expressiveness, and it also cleverly exploits Chez Scheme’s data-representation regime. Keep’s more static system offers good performance, compact representations of foreign pointers, and low-cost checking of pointer operations. The new ffi2 layer in Racket brings these two lines of development together. It relies on small adjustments to Chez Scheme that reflect lessons learned from unsafe/ffi, and it introduces a static approach at the Racket level to better target Chez Scheme. As a result, the ffi2 library offers the convenience and composability combined with good performance and low-cost foreign pointers.

Bio: Matthew is a Professor at the University of Utah and a developer of Racket who focuses mostly on macros, compilation, and the runtime system.

Sunday, 10:20AM PDT

Break

Sunday, 11:00AM PDT

Sam Tobin-Hochstadt

The State of Racket

Sunday, 11:30AM PDT

Racket Management

Racket Town Hall

Please come with your big questions and discussion topics.

The Daily Front Page 14 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Notes From SlutCon
article

SlutCon

by ekluger·▲ 117 points·31 comments·thenewcritic.com ↗
You are trying to get a million dollars. The million dollars is stored in his balls.

“‘You are trying to get a million dollars. The million dollars is stored in his balls.’”

Fish Being Born, Sabine Spier

The two men in our circle were about what I expected. Both were readers of the blog LessWrong and worked for some kind of amorphous tech venture. The other girl and I were “flirt girls,” a compensated worker or volunteer whose job for the weekend was to let men practice flirting on them. The four of us sat cross-legged on a mattress somebody had pulled to the floor. The mattress was so soft that every time the girl next to me shifted her weight, I slid toward her. The people at Lighthaven call this practice “circling”; it asks you to narrate your inner state to others while it happens. If your throat dries when someone looks at you, you announce the dryness to the group.

I was dressed in my nondescript college girl outfit: a white top and jeans. The other girl wore black arm sleeves and eyelash extensions. When it was her turn to report, she said she felt bored. I’m good at flirting, and it isn’t hard to get a man to sleep with you, she said. Once I start, I can see exactly where the evening will end. Here, she told me that she felt like an “apex predator.” I laughed. Then I sat there sinking into the mattress, trying to work out what the laugh was for.

It was my first time at SlutCon, a three-day retreat in Berkeley for men who wanted to get better at seduction. It was my first time at Lighthaven, the venue that hosted it. I had never been to Lighthaven, but it reminded me of my co-op at Stanford. There was an open kitchen stocked with more food than anyone could eat. People were wealthy — I mean, “high-trust” — enough to leave their laptops lying around. The sunlight was Californian cashmere on the skin. We often sat on the ground like college kids. People were visibly nude or Dionysian in places, but the atmosphere as a whole still struck me as neutered and millennial, like a hackathon that had changed its prize.

Lighthaven used to be a hotel, and it still has a hotel’s bones — it has courtyards and garden paths. Now it is operated by Lightcone Infrastructure, an organization closely associated with a subculture known as “rationalism,” which formed online in the 2000s around writers including Eliezer Yudkowsky, Robin Hanson, and now Scott Alexander. The subculture is interested in avoiding cognitive biases and applying Bayesian inferences toward real-world objectives, including artificial intelligence alignment.

Rationalism is physically instantiated as reading groups or “meet-ups” across the world, but its adherents are particularly active in Silicon Valley. They have visible discourse norms and vocabulary — “attack surface” (a total set of vulnerabilities), “priors” (a baseline), “scope insensitivity” (a cognitive bias with regard to scale). They like to measure things. Aella, a sex worker associated with the subculture and one of three founders of SlutCon, is known for running controversial online surveys querying niche sexual ethics. She is best understood as a hobbyist researcher and internet provocateur.


When I interviewed to be a flirt girl, the organizers gave me the thesis of the event: We love men (do we? I wondered) and we want men to be better at seducing us (of course). In our training, we were instructed to approach the event with high degrees of openness, along with curiosity and candor. Each flirtee would wear a wristband; when it was on, we could be approached by the attendees. People would be finding the edges of their “seduction style” over the weekend, the organizers said, so some of them would try things we might find awkward. When that happens, we should offer a gentle correction, or end the interaction by naming our intention to exit out loud. If possible, we were to avoid “crushing their spirit.”

There were roughly as many flirt girls as ticket holders. Tickets to SlutCon cost between $3,300 and $18,000, with the more expensive tickets providing limited-space workshops, personalized feedback, and what the materials called “spicier educational sessions.” While nothing in the paperwork required ticket holders to be men, or flirtees to be women, I did not meet any exceptions.

All my friends wanted to know what the SlutCon attendees were like. I told them I had never met anyone at the conference before. To my eye, the event skewed white and nebbish but not drastically so. The men I met were often rationalist or rationalist-adjacent and knew each other from previous Lighthaven events. They ranged from being in their 20s to middle-aged. They were typical heterosexual men, which is to say they conveyed a lack of style rather than having overtly bad style, though a few wore actual fedoras, like Magic the Gathering players. They were sincere and awkward, possibly Redditors, the next Pokemon evolution of the startup guys I knew in college. Some were involved in the poly and/or kink scene, and some of them were not.

The women varied more but were also largely in their mid-20s or 30s. The rationalist or rationalist-adjacent women were dressed comfortably in flannel or skater skirts like SuperWhoLock posters, and they greeted their friends wherever they went. Others were outsiders to the Lighthaven culture entirely. There was a beautiful former camgirl, who told me that Aella’s writing about escorting had described her own life. There was a sex-positive painter who had flown in for inspiration. There were two stunning housemates from another country, intrigued by the gender relations angle of the event — one wished to repair a relationship with her misogynistic brother. Somewhere in the mix was a journalist from Playboy, wearing sigil-shaped jewelry.


The crowd at SlutCon wasn’t limited to rationalists and sex workers, but both demographics were overrepresented. What everyone at the event seemed to have in common was a directness in cognitive and interpersonal style. To my surprise, I found this appealing. I’m a lawyer and am accustomed to a certain guardedness and artificiality in my professional life. For years, I’ve behaved through signs or euphemisms, like a character in an Edith Wharton novel. At SlutCon, it was fun to talk with people who would name the subtext out loud. I had a social license I usually don’t.

Many of the panels were organized with legibility and empiricism in mind. It seemed to me they attempted to render attraction more calculable, and thereby tractable. Some of the events targeted flirt girls rather than the male attendees. One such presentation, titled “Get Sexier,” drew on survey data from the looksmaxxing corner of the internet to explain what men find attractive: canthal tilt, BMI, contrast, neoteny. It went looking for evidence in sex doll sales and galleries of AI-generated women. I found its handling of race lightly distasteful; the presenter suggested that Wasians might be the most attractive, since they turn up so often in AI-generated pornography. Later, a white audience member contended that Asian women are popular because of our culture of deference, because we don’t go on about equality the way Western women do. Nobody corrected her, including me.

Other panels taught what I recognized as cognitive reframing. In one called “Rizz Under Uncertainty,” the presenter sought to make men more comfortable with rejection. Unlike a therapist, she deployed the language of data, encouraging them to see “no” as new information, rather than a referendum upon a person’s value. Then, we practiced rejection with each other: we asked the person next to us for something they would certainly refuse before asking them for something they might reasonably refuse. I suggested to the boy next to me that we re-enact 9/11, since it was September — wouldn’t it be festive? Then I asked him for $20. He declined both times.

I skipped the evening events. Instead, I had dinner with two of my friends from high school and college, one starting her PhD at Berkeley, and another continuing theirs at Davis. Both spent a good part of the meal worrying about whether I was safe at SlutCon. My friend from Davis pictured SlutCon as something adjacent to pick-up artistry, a “training camp for rapists” that took sexually median men and emboldened them. They had this impression because social media appeared to conflate SlutCon with parties like the “consensual non-consent” orgies some Lighthaven affiliates participated in. My friend from Berkeley made a material argument: the event catered to the desires of straight men, and by charging men and paying stipends to women, it commodified women into products.

I understood their concerns. The event had an unclear identity; on social media, the organizers occasionally pitched it as “wholesome” — a place where socially awkward young men could learn to hold a conversation. It was true that there were banal activities on the schedule, such as eye contact practice or guidance on fashion, and that I was giving men feedback on conversational norms like not hovering or speaking more slowly. (Some of them reminded me of the kind of dog that does not know how to behave at the dog park, like a poorly socialized COVID-19 puppy.) But the event simultaneously had an explicit edge. The program included sessions like naked circling and rope bondage. People talked about sex frankly and constantly, and there was visible heavy petting between flirt girls and attendees.

I’m also skeptical of building one more institution for straight men in a world that’s already organized around them. The name (“SlutCon”) and financial structure of the conference may have subconsciously fostered feelings of entitlement. And there were men who behaved poorly at the event. One flirt girl confided in me that a male attendee had commented to her, “If I were a shooter, I’d have a girlfriend.” Two male attendees responded aggressively in response to my feedback; one even sought to argue with me about whether I was “right,” as if a disagreement about charm could be won on the merits. When I suggested that this attendee could be more curious — rather than dismissive — in conversation, he angrily asked, “Do you think I’m listening to you right now?”

I felt annoyed, but I never felt unsafe. I am sexually reserved and even distrustful of men. But within the confines of my experience, I did not feel like I was in danger. There was visible security all weekend, and the organizers continually stressed that our participation was voluntary.

Both my friends desperately wanted to know what Aella was like in person. And what surprised me most was how much I liked her. Online, she has repelled me; she behaves like a shock jock and postures as an intellectual, then acts baffled by the critique she invites. As a result, I have been bemused for years by how much influence she has on Silicon Valley discourse. But in person, she is maternal and funny, like a kindly high school teacher who lets you eat snacks during class. At SlutCon, she taught “Girl Game,” a seminar on how to flirt from her experiences in the escort context. In terms of body language, she told the flirt girls, we should channel our arousal. In terms of conversation, we ought to be less intellectual. Then she lowered her voice, smiled, and let down her hair. She said, “You are trying to get a million dollars. The million dollars is stored in his balls.”


A lot of the people I talked to at SlutCon told me, at some point, that they were autistic. Many had found rationalism through their friends in college, or online. I started to wonder whether the subculture had formed around a neurodivergent cognitive style, one that prized what its members saw as valuable nonconformity. One of the rationalist women commented to me, “Notice that we all wear wide shoes. Aella wears wide shoes, too!”

Abstractly speaking, I dislike a good deal about rationalists. I am not a utilitarian, I don’t care for IQ, and I hate their tendencies toward hereditarianism. But seeing them in an interpersonal setting like SlutCon made me feel for them. Many of them were just girls. We were talking about eyeliner, or Homestuck, or looking for makeup wipes together. Some rationalists spoke to me about their experiences of interpersonal rejection and the contentment of finding community outside the mainstream. Two of the flirt girls were friends because they followed each other on Tumblr as teenagers. One male attendee didn’t fit in with student organizations in college, so he attended Aella’s birthday gangbang and made friends there. So much of the programming, too, was really a data-inflected attempt to troubleshoot the experience of social alienation.

When I gave men feedback, I often watched something defensive and hurt come into their eyes, the pupil a bruise. On Saturday, one man painstakingly braided my hair. He had been considerate and had asked me how tight I wanted the braid to be. But when he asked me for feedback on his overtures, I had to tell him I just didn’t find him attractive. He then questioned if there were people in the same courtyard that I did find attractive, and I said yes — a woman seated a knight’s move from us, with artificially waved hair. I felt infinitely bad, knowing that he had paid $3,300 for the weekend.

There’s a way in which reason and measurement attempt to ward off pain. To me, the presentations felt sterile, while the people felt alive. A woman might measure her waist-to-hip ratio because she doesn’t understand why a man didn’t care about her. A man might argue with a flirt girl about how the conversation went because it hurts less to debate than to cry. People might join a community that rewards their kind of thinking because they failed to find “their people” growing up. There’s a through line in fringe communities, and sex, and social awkwardness. One man at SlutCon agreed with me that there was a sad-eyed futility undergirding the conference. Many of the workshops focused on outward signs of confidence like posture and clothes but left alone a history of deeper maladjustment. You can remove a guy’s fedora in an afternoon, but the rest takes years.

What surprised and irked me was how well I fit in at SlutCon. I was diagnosed with autism late, at 17, likely because I’m a conventional-looking young woman who can manually produce an imitation of social graces. But I have always found interacting with people difficult, and my charisma is a manufactured one. I’ve been popular for most of my adult life, and lonely for all of it. The rationalists have elected to graph their people, whereas I have chosen to describe them; what people call “perceptiveness” in my prose is really just an overworked muscle. So while men practiced their approaches on me at SlutCon, I realized I had been hit on more often than I’d understood. For years, men in public have started conversations with me about my tattoos; I had always assumed they were interested in my tattoos.

There is a quote from a visual novel (a type of video game) I rather like that goes, “People are riddles. They want someone else to solve their riddle. They live life wanting someone to solve the riddle that they are, the most difficult riddle in the world.” I have a harder time solving riddles than most people — some of the attendees at SlutCon might, too. But if the quote is right, then relating to someone takes two kinds of nerve. You have to want to solve the other person, and then hold still while they work on you. I have always struggled with the latter.

A male attendee in my circling group informed me as much. He had been nursing his irritation with me since “Perception Gap,” a workshop where men would approach flirt girls as their aspirational selves, and we would give feedback on how the conversation went. While circling, he confessed that he had felt my manner was “LinkedIn,” and that he judged me for not being more vulnerable. In response, I explained my habitual guardedness as a consequence of my job as a lawyer. But he was right. I had been protecting myself somewhat during SlutCon by resorting to a professional demeanor. He was the most beautiful man I had spoken to that weekend, but I was preventing myself from being solved.

SlutCon aims to facilitate various forms of relatedness, and it often does so through a rationalist or empiricist framework. I understand the urge to render things predictable and measurable. I affirm the facilitators’ objectives, that we can make ourselves more attractive according to conventional measures. But past a certain degree, I do not think it is possible to render things more controllable, more sanitized, or more legible. That brutal and beautiful star, which is chemistry or rejection, is not truly manageable. And I resented SlutCon’s every attempt at cognizing attraction, when it’s something that takes place not with our eyes open, but between the eyelashes.

Perhaps it’s because I’m a poet, but I suspect love is inefficient. It happens in spite of reason. The only men I felt connected to all weekend had tears in their eyes, or told me they had been beaten by their parents. But I wasn’t overly interested in those men, either. My favorite room in Lighthaven was the “flirt girl floproom,” where the flirt girls rested between shifts. There was more tenderness there than anywhere else. One girl asked me to check if her hair was curled evenly at the back, so I did. Another girl told me, giggling, that she had met her husband years ago while counseling him for drug possession. A third asked if any of us had face wash. In that room, I saw the apex predator asleep in a beanbag, her arm sleeves covering her face.

I’ll credit SlutCon with putting all of us in the same venue. But for me at least, real connection has always depended on someone forgetting to be careful. It’s dangerous, because vulnerability is always an invitation for harm. And tragically, I was careful the whole weekend. I kept telling everyone I was a writer, and I skipped every evening event to have dinner with my friends. Everyone — my friends, the staff at SlutCon, my fellow flirt girls — checked in with me to ask if I was safe. I would tell them I was, which was unfortunately true. I spent three days refusing to hold still, and when someone actually noticed it, I avoided him for the rest of the event. It was safer to remain unsolved than have the answer deemed too obvious.

The Daily Front Page 15 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — The Dodo File
article

Using Opus 5.5 to discover a new eyewitness record of the dodo

by benbreen·▲ 116 points·29 comments·resobscura.substack.com ↗
Frontier models can now produce novel historical knowledge, but in a really weird way.

Frontier models can now produce novel historical knowledge, but in a really weird way

Another day, another historical cipher broken by a frontier model. Yesterday, the security researcher Carter Church announced that he had used GPT-6 Astra (working on the problem for six hours) to break a Napoleonic-era cipher that had previously resisted all decryption attempts.

Church’s post on the subject is an interesting example not just of a reproducible methodology, but also of how to vibe code an information-dense writeup that is notably different from any traditional academic aesthetic, but which actually does surface primary sources and meaningful information in a fairly deep way:

The aesthetic weirdness is just the tip of the iceberg here. What I notice most about these forays into historical sleuthing using AI (and my own attempts at same) is the epistemological weirdness of how current frontier models now operate when given historical research tasks.

The best way to demonstrate what I mean here is by sharing the step-by-step process by which I was able to find what appears to be a previously-unnoticed Dutch report of hunting dodos dating to 1615. The core steps were:

  1. Start from an actual base of specialist knowledge to define a specific research question (for example, I had previously researched the history of the exotic animal trade in the seventeenth century, and am planning to write a book on animal extinctions in the early modern period which will have a dodo chapter)
  2. Identify a large, freely-available, well-edited corpus of historical sources (in this case, the GLOBALISE archive of Dutch East India Company archives, which is an amazing resource)
  3. Download the sources and run them through an embedding model to allow semantic search to find passages that might help answer the research question
  4. Use semantic search to surface candidate passages and then ask frontier models to read them and produce a ranked list of the best matches for human review
  5. Do any of the source passages help answer the question? If so, iterate on them. If not, keep looking in new archives or with new search terms.

This is not, on its face, all that different from how I do research on my own. I tend to search around in historical databases using various search terms that pop into my head, and then scan through the results until a passage catches my interest, then I read more carefully and iterate.

The difference is that an AI agent like Opus 5.5 can spawn dozens of copies of itself to read through sources in multiple languages. If you give these agents an API key, they can also run their own embedding searches on new sources that emerge during their research, as Opus did here during the run that led it to the newly-discovered passage:

A dodo in a haystack

Few historical creatures have been more widely studied than the dodo, the large Mauritius bird that famously went extinct due to overhunting around 1681. But this is actually a large part of why finding more information about the animal turned out to be “tractable” for an AI agent: it already had a very large identified source base to draw on, and it was able to scan the scholarly literature to find out where previous archival finds relating to dodos had been made (here is Opus 5.5 writing up its own process in a research dossier).

Most of what Opus 5.5 found as it searched through the millions of records in the Dutch East India Company records was already known to the many historians and scientists who have studied the history of the dodo. But one manuscript source from 1615, a ship’s log available here, seems not to have been noticed before.

The journal was probably written by Isbrant Cornelisz van Petten, who captained a Dutch East India Company merchant vessel called Wapen van Amsterdam. The Wapen made landfall on the island of Mauritius in April, 1615, where the crew collected water and food to prepare for the rest of their voyage to the East Indies.

Among other things, they “caught many tortoises, dodos [dodeersen], and some geese and parrots.”

User attachment

A detail from Nationaal Archief, The Hague, VOC 1.04.02, inv. 1059, fol. 141. “dodersen” (dodos) is visible at lower left here.

Here is the Dutch transcription and English translation of the relevant passages (note that the transcription and translation are not perfect — if you work on early modern Dutch please let me know of any corrections!):

I read through the available secondary literature on the topic, like Parrish’s 2013 book The Dodo and the Solitaire, and other specialist articles. It genuinely looks like this is a new addition to the timeline of dodo, which previously had a gap in the 1611-16 period.

Now, as for whether this actually matters all that much: it not exactly earth-shattering. But I do think that this is a publishable result, especially when combined with another new finding from the same search, which found a probable new reference to another extinct bird from Mauritius, the red rail. An account from 1638, the year the Dutch first colonized the island, turns out to describe “field-hens” using the Dutch word (velthoenderen). Experts on the topic have previously identified this word as one that the Dutch used to describe red rails. But this particular reference was apparently missed because a French scholar in 1890 mistranslated the word as perdrix (partridges).

From the writeup here.

Opus 5.5 was able to go back to the original manuscript source and correct this.

For me, though, the most interesting possible finding is still very much in doubt. But if it can be nailed down, it really would be quite fascinating. This is because it might help explain one of the most mysterious paintings from the 17th century: the Mughal Emperor Jahangir apparently owned a living dodo. However, no one knows who gave it to him, when, or why, and Jahangir never writes anything about it in his memoirs.

Ustad Mansur, Institute for Eastern Studies, Novo-Mikhailovsky Palace, Saint Petersburg (Wikipedia link)

I actually wrote about this painting back in 2012:

Two years earlier Mansur had painted a Mauritian dodo that is still cited by biologists as the most accurate surviving representation of the bird. In other words, Jahangir was exactly who a canny merchant or courtier would go to if they came across a highly unusual-looking bird.

It turns out that no one really knows the exact date of this painting. Some scholars go with “circa 1625,” others with “circa 1615.” (We do know that an English merchant reported the existence of Mauritian dodos in India in 1628, but whether this included the dodo shown in the painting is unknowable).

To my great surprise, Opus 5.5 dug around in a very wide range of manuscripts to surface the following theory: Jahangir’s dodo was quite possibly the same animal that a Portuguese Jesuit described on Mauritius in 1616. The Jesuit referred to this Mauritian bird as an “ostrich.” The thing is, Mauritius has no ostriches!

Unfortunately, the original Portuguese text of this account is now thought to be lost, but a French translation survives, and that’s what Opus is citing here:

The theory that this “ostrich” was actually a dodo is already known to experts on the topic, and the French translator glosses it as such. But it appears that the connection between this Portuguese dodo caught en route to Goa in 1616 and the dodo that ended up reaching Jahangir at some point between 1615 and 1625 has not yet been made.

Granted, the chain of transmission has not been established. But my hunch is that this may in fact be the origin of Jahangir’s dodo. This is because we happen to already have a very clear chain of transmission of another exotic bird from the Portuguese based in Goa to Jahangir’s court, dating to 1612: an American turkey!

This is something I plan to dig into more. If it can be traced more reliably, I think the identification of Jahangir’s dodo would be a pretty big deal. The Mughal court dodo is possibly the most famous and scientifically important individual dodo that ever lived, because Jahangir’s brilliant court painter, Ustad Mansur, left behind the most accurate surviving depiction of it.

At minimum, I can say that this deep dive into the Dutch records has made it clear to me that frontier AI models are capable of surfacing new historical finds based on independent archival sleuthing. That’s not something I could have said months ago.

What they can’t currently do is ask the right questions or determine the significance of finds.

Epistemological weirdness

The main thing that contemporary AI can do for historical research is, in effect, the digital equivalent of counting sheep. Because they never get bored, they can search through enormous datasets to find new evidence for existing claims (or, potentially, disprove them).

They are worse at coming up with new ideas of their own. What seems to work best is if they are placed on the boundary between two disciplines, given a source base, and told to work methodically toward answering a human-generated question.

They are also notably bad at judging the historical significance of what they find.

Again and again, in my attempts to find something tractable, Opus 5.5 and GPT-6 ended up spawning up to a dozen independent agents that that drilled down into minutiae and got utterly lost in the weeds.

Sometimes, the weeds ended up being fun. For instance, one agent discovered a very entertaining and novel account of an English ship captain, Jonathan Hide, who stole valuable ebony wood plus “two sea cows” (!) from the Dutch colony in Mauritius. When a Dutch official confronted Hide and his crew, “their carpenter threatened to split my head with his axe.” The official adds:

The Captain also took about 20 land tortoises on the voyage, claiming he intended to put them ashore on St Helena, so as to breed the said tortoises there.

This is historically significant as an environmental history finding. It turns out that the animal in question, the Mauritius giant tortoise, also ended up going extinct. Whether these twenty individuals ever did end up on St. Helena, many thousands of miles away, is unknown. But we do know that Captain Hide’s ship sank near the Azores on the return voyage home.

This is a pretty great story! Early modern people transplanting crops and animals is very much in my wheelhouse, and I love the carpenter brandishing an axe at the Dutch official. I will likely use it in some of my published work at some point.

Most of the time, however, agents veered off into archives that are totally illegible to me and require very extensive specialist knowledge to fact check. For instance, this was the product of a multi-hour search into Inca khipu:

Is that decisive? Does any of this mean anything? I genuinely have no idea. I assume Gary Urton does. But I don’t really want to bother someone who has dedicated his life to the study of Inca khipu with a question generated by an AI agent which spent a few hours on the same topic.

This is really the crux of the current problem in a number of fields that AI research agents stand poised to transform: how should human experts interface with these things?

I feel comfortable working with the material relating to, say, English merchants stealing giant tortoises, or Jahangir’s dodo, because this is the sort of stuff I’ve been studying for well over a decade now. But what happens when amateurs running AI research agents veer off into genuine new scholarly territory, without the knowledge or network to double check it?

This is what Carter Church gets at in the post I linked to at the top:

A patient specialist could have done this in 1970. But it would have meant weeks of a specialist’s time: period French, a steady eye for 1,300 hand-drawn signs, and the statistics, all spent on one plate in one army journal. People with those skills exist, and they have more important problems to solve. So the letter sat unread, because no one who could read it could justify the time.

I spent six hours of model time and a few evenings of my own. Tomokiyo says he’s receiving solutions faster than he can record them. I’m sure few of these are from cryptographers. A year ago that sentence probably wouldn’t have made sense.

I’d guess most “unsolved” lists, in most fields, hold more problems like this than anyone assumes. Those lists are about to get a lot shorter, and the people shortening them will increasingly be people who were simply curious.

Personally, I would be thrilled if a bunch of curious amateurs running a small army of AI agents dug into the dodo material, or into the early modern drug trade, or the history of consciousness science in the 19th century, or any number of other things I’m actively researching. But it is going to get really weird, really soon, when these things happen.

The bottleneck will soon become not research findings themselves, but the attention of experts in niche topics.

A guest post on mathematician Terrence Tao’s blog recently concluded: “We’re gonna need a lot more mathematicians.”

I agree, and I would add: we’re gonna need a lot more historians and humanists.

The Daily Front Page 16 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Mapping for Everyone
repository

StreetComplete on iOS is now in public beta

by Snowly·▲ 550 points·147 comments·github.com ↗
★ 4,971⑂ 458 forks Kotlin

Easy to use OpenStreetMap editor for Android

This ticket is something like the master ticket to coordinate development on an iOS port of StreetComplete. It replaces #1892 which also included a lot of discussion and research / observation work.

TLDR: Have a look at the Project Board for a list of tasks. Contributions are welcome!

Also have a look at the Slides from SotM Europe 2024 talk (I added speaker notes to make this understandable when flipping through).

Approach

The code base of this app is written in 100% Kotlin, a modern programming language that is quite similar to Swift. Kotlin code can be transpiled to JavaScript and also to machine code, just like Swift. Furthermore, many dependencies of this app by now are pure Kotlin libraries.

An iOS version of this app hence can be done with Kotlin Multiplatform.

The UI code can be shared using Compose Multiplatform, which is currently in alpha beta for iOS. It is a fork/extension of Jetpack Compose with largely the same API. Jetpack Compose is a reactive UI framework in which developers define the UI completely in code (similar idea as SwiftUI, Flutter, ...). We'll have to re-create the entire UI (incrementally) in Compose, though.

This will keep the amount of code that needs to be platform dependent (Android / iOS) to a minimum.

This approach has the big advantage over others in that further maintenance of this project will not increase significantly, as there will continue to be just one code base. In comparison to using the framework Flutter for multiplatform (as used by Every Door), it allows us to largely not touch the Kotlin codebase. When using Flutter, we'd need to rewrite it all in Dart.

Steps in a nutshell

  • Separate all platform specific code from application logic. Replace Android/Java dependencies for application logic with Kotlin multiplatform dependencies

  • Incrementally migrate the UI code to Compose Multiplatform:

    1. Separate data access and UI state code from pure UI code (use view models: Use ViewModels #5070)
    2. Migrate the UI code that currently uses Android XML layouts to Android Jetpack Compose. This can be done incrementally when done bottom-up (see migration strategy guide)
    3. Then, migrate from Jetpack Compose to Compose Multiplatform. This is a small step compared with the first one.

Current State

This section will be updated continuously.

The steps necessary are described in detail in a Kanban-style Project Board. (Some tasks have not been created yet because they 100% depend on other tasks completed first and some research). Unless stated otherwise, they are explicitly up for the taking by people who read this and (I hope 😊) want to contribute to the development towards an iOS port. If you would like to implement one of the tasks described, comment in that ticket.

We very roughly estimated some time ago that developing a full port to iOS would take one man-year of work. So, the scope of this remains very large. We will only realistically achieve it together with lots of contributions from the community. Luckily, this is exactly what has been happening in the last years.
In the first half of 2024, I have been able to work on this full-time. The migration is now about 50% complete.

So, let's shift gears!

How you can help

  • You could take over a task from the project board! Or, you could familiarize yourself with the mentioned technologies / frameworks to make meaningful contributions later. In particular: Jetpack Compose / Compose Multiplatform. This is very new to me too, so I have to find my feet here, too
  • You can sponsor development! See the title "Sponsor this project" in the sidebar on the main page. More money allows me to devote more time to development on this app in general. If you know any eligible sources for larger scale funding, talk to me!
  • You can help with maintenance and issue triage in general. Time saved on that is time I can put into furthering development on this!
The Daily Front Page 17 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Platforms, Permissions & Privacy
article

Returning from vacation? The government can search your phone without a warrant

by rbanffy·▲ 369 points·337 comments·arstechnica.com ↗

Reminder: The “border exemption” to your rights is real.

Credit: Kevin Carter/Getty Images

An Argentinian-American writer and immigration advocate recently sued the federal government, demanding that it delete data that he believes was copied off of his phone when he re-entered the United States earlier this month.

According to the seven-page complaint, Thomas Kennedy said that a Customs and Border Protection agent at Miami International Airport physically searched his bags, questioned him about his books and magazines, and then demanded that he hand over his phone.

“[The agent] threatened me, saying that if I didn’t give him my phone, my interrogation was going to take much longer and they could retain my phone indefinitely,” Kennedy wrote. “I felt like I had no choice, so I handed my phone to the CBP agent.”

The agent took the phone away and only returned after approximately 45 minutes, during which Kennedy believes that data on the phone was copied. He was then released with no charges.

The activist says there is a significant amount of sensitive personal and professional information on his phone, and he is now seeking that the government delete this data.

He collaborates with multiple nonprofit groups, including the Florida Immigration Coalition, Amnesty International and the Community Justice Project. He now believes that he was targeted for this work, in part because he was asked repeatedly what he did for a living and if he was an immigration attorney.

“I believe CBP flagged me because of my organizing and political work around immigrants’ rights in Florida,” he wrote in his court filing. “This isn’t the first time that law enforcement targeted and harassed me because of my political viewpoint: in 2021, after speaking out against Governor [Ron] DeSantis, the Miami Police were surveilling me and barring me from press conferences.”

Border search exemption

Federal courts have long-recognized a “border exception” to the Fourth Amendment of the US Constitution, where people, bags, and electronic devices can be searched without a warrant.

Kennedy’s story is reminiscent of a 2017 incident at San Francisco Airport, where a local artist explained to Ars how border agents there allegedly threatened to “be dicks” if he did not hand over his phone.

On its website, CBP states that it can copy such data “if there is probable cause to believe that the information contains evidence of a violation of law that CBP is authorized to enforce or administer” or “if the information relates to immigration, customs, or other enforcement matters.”

CBP says that such searches of electronic devices are very rare.

“In [Fiscal Year] 2025, out of the over 419 million travelers CBP processed at ports of entry, CBP only searched the electronic devices of 55,318 international travelers,” the agency wrote, or 0.0013%.

Still, Kennedy is angry about what happened to him.

“CBP shouldn’t have been able to confiscate my phone, let alone copy its contents,” he wrote in the complaint. “I believe they did so to suppress my political speech.”

The case was first reported by the Miami New Times.

The Daily Front Page 18 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Platforms, Permissions & Privacy
article

Google breaks promise to provide 10 years of updates to Chromebooks

by speckx·▲ 345 points·155 comments·osnews.com ↗

Google launched its Googlebooks platform a week ago, and a lot of people were wondering what this meant for Chrome OS and Chromebooks. Since Googlebooks and its Android-based Googlebook OS lack the management frameworks markets like schools require, Chromebooks will continue to be available for now, until such time Googlebooks catch up in that regard. However, in a support document, Google states that update support for all Chromebook devices will end in 2034:

ChromeOS devices will continue to receive regular updates and security patches through mid-2034. For qualifying devices purchased today whose 10-year support lifecycle extends beyond 2034, Google is committed to supporting your transition to Googlebook OS, with many devices offering direct migration paths.

↫ Google support document

Google promised 10 years of updates for all Chromebooks, and it’s now breaking that promise for anyone buying a Chromebook between now and whenever the last Chromebook rolls off the production line. Sadly, we live in a world where corporations are free to make and break whatever promises they want virtually free of consequences, and as society we’re so used to it that anti-consumer behaviour like this barely elicits a shrug.

Google does state that “many newer commercial Chromebook models will be capable of upgrading to Googlebook OS”, but that, too, is just another promise – and a vague, one at that – so who knows how many devices will actually be capable of upgrading out in the real world. On top of that, we have no idea if Googlebooks will just be yet another in a long line of quickly abandoned Google tablet/laptop projects, further adding to the uncertainty.

Stuff like this should not be legal.

The Daily Front Page 19 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Platforms, Permissions & Privacy
The Daily Front Page 20 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Platforms, Permissions & Privacy
The Daily Front Page 21 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Markets, Regulators & Red Hats
article

Micron CEO Says Memory Supply Will Be Much Tighter in 2027 and 2028 Than in 2026

by speckx·▲ 351 points·400 comments·techpowerup.com ↗

Micron CEO Sanjay Mehrotra says memory and storage supply will likely be much tighter in 2027 and 2028 than it was in 2026. He made the remarks during Micron's fiscal Q4 2026 earnings call on September 30, where the company reported record quarterly revenue of $54.2 billion. Here's what he said:

Industry demand has strengthened since our last earnings call, and we expect memory and storage supply-demand conditions to be much tighter in fiscal 2027 and 2028 than they were in 2026. AI is becoming super intelligent, and memory enhances this intelligence and the competitiveness of our customers' platforms. Even with additional industry DRAM clean room space plans with robust demand trends, including new upside requests from customers, we do not have line of sight to when supply and demand will return to balance.

In June, Micron CEO said they expected industry supply to improve gradually in 2028, but couldn't predict when supply would catch up with demand. The company now says it still has no line of sight to a balance, even with additional industry cleanroom space planned. New capacity takes time as well, since Micron's Idaho ID2 fab is only expected to start wafer output in late 2028. Mehrotra also said more than 75% of Micron's 2027 output is already committed to customers. On the consumer side, Micron said DRAM prices rose in the high-teens percent range last quarter, with NAND up about 30%. It looks like relief isn't close, although these are company projections and could change.

Source: Micron Q4 2026 Earnings Call Transcript

The Daily Front Page 22 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Markets, Regulators & Red Hats
article

FTC is investigating OpenAI, Anthropic and other AI companies over product risks

by dgellow·▲ 202 points·153 comments·cnbc.com ↗

Key Points

  • The FTC has opened an investigation into OpenAI, Anthropic and other AI companies over the potential dangers posed by their products, CNBC has confirmed.
  • The probe adds to the mounting scrutiny that OpenAI and Anthropic have been facing over their safety practices.
  • An FTC spokesperson declined to name any other companies that are being investigated.

FTC opens probe of Anthropic, OpenAI and other super intelligence models

The Federal Trade Commission has opened an investigation into OpenAI, Anthropic and other artificial intelligence companies over the potential dangers posed by their products, an agency spokesperson confirmed to CNBC.

The probe adds to the mounting scrutiny that OpenAI and Anthropic have been facing over their safety practices, especially after industry researchers warned about how the companies' AI models could cause catastrophic harm. OpenAI stunned the industry in July when it disclosed that its agents broke out of a testing environment and hacked into open-source platform Hugging Face.

The FTC spokesperson declined to name any other companies that are being investigated. The New York Post was first to report the probe.

Representatives for OpenAI and Anthropic did not immediately respond to CNBC's request for comment.

Earlier this month, Anthropic CEO Dario Amodei rocked the tech sector by urging AI companies to slow how quickly they improve their most advanced models and calling for stronger government oversight. He published a three-step proposal aimed at tempering the pace of development without "sacrificing commercial advantage or the United States' lead in AI."

Several of Amodei's competitors, including OpenAI CEO Sam Altman and SpaceX CEO Elon Musk, expressed support for his proposal, while others, including Meta CEO Mark Zuckerberg and Nvidia CEO Jensen Huang, argued that individual companies should be responsible for ensuring the safety of their products.

President Donald Trump convened top executives from Alphabet, Meta, SpaceX, Nvidia, Palantir, Anthropic, OpenAI and other companies on Tuesday to discuss the issue. The group signed a short voluntary, nonbinding accord, which says that "every company is responsible for developing its own technology safely and in a way that builds trust with customers and the public."

"We all need to work together to make sure that we can win, and we can win safely," Amodei said outside the White House on Tuesday. "If we do this right, if we work with the president and everyone here, we can win safely."

The Daily Front Page 23 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Markets, Regulators & Red Hats
article

Red Hat being phased out of existence?

by amcclure·▲ 193 points·108 comments·techrights.org ↗

The "Red Hat" brand (and badge) is being dissolved some more today

Yesterday was my last day at Red Hat.

"Today the "badge" says IBM," Thomas Wilson said two hours ago (above). "The team is still here. The work continues. And I’m excited about what comes next."

But the role changed, there's lots of slop ("hey hi") dross or filler, and everybody at IBM knows what PIPs and RA come next.

It's not hard to see that the vast majority of redhat.com blog posts sell slop, not Linux. It helps inflate the share price without accomplishing anything of substance. It's "fake work", just like slop. It cheats the shareholders, but for how much longer?

Red Hat's "way" or "culture" or "open source org" is going away, step by step (one step at a time), and some people altogether quit today (or yesterday), not only in Red Hat but also Nordcloud. Some receive money to leave 'voluntarily'...

The quantum (vaporware) teams are going "the way of the Kyndryl" via Anderon.

IBM is imploding 'creatively'.

The Daily Front Page 24 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — The Working Toolkit
article

SvelteKit 3

by sampsn·▲ 219 points·72 comments·svelte.dev ↗

Get it while it’s hot

Version 3.0 of SvelteKit, the official application framework for Svelte, is now available.

If you’ve used earlier versions of SvelteKit, everything will feel very familiar — it’s the same framework with a little more polish, a little more type safety, and a little less junk. We’ve made migration as seamless as we can with the sv migrate command...

npx sv migrate sveltekit-3 --tasks all --confirm

...which will automatically migrate as much of your codebase as possible, and generate a TODO list for everything else. (If you’re agentically inclined, your robot friends will make short work of it.)

To create a new app, run sv create:

npx sv create my-new-app

As with any major version bump there are a handful of breaking changes to be aware of, which are covered in the migration guide (or, more briefly, in the recent release candidate announcement).

Quick highlights:

  • configuration now lives in vite.config.ts instead of svelte.config.js
  • the $lib alias is now #lib, making use of standard subpath imports
  • environment variables are more powerful and easier to use
  • service workers are less boilerplatey
  • error handling is improved across the board

Are remote functions ready yet?

Not quite. But it’s our top priority!

Remote functions are a set of utilities for secure, efficient, type-safe client-server communication. You’ve likely seen some version of this idea in other frameworks, but we think you’re going to prefer this one.

Using them requires Async Svelte, which for now requires an experimental flag. Bear with us.

Join us in Ljubljana next month

This is as good a place as any to remind everyone that the next in-person Svelte Summit is taking place on November 19-20 in the lovely town of Ljubljana, Slovenia. Among other things it will be a celebration of Svelte’s 10th birthday, and we’d love to share some cake with you.

The Daily Front Page 25 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — The Working Toolkit
article

Various Projects Find Hidden SDR Capabilities in ESP32 Microcontrollers

by nkw·▲ 207 points·32 comments·rtl-sdr.com ↗

Back in 2025, we posted about ESPARGOS, a phased array of many patch antennas, each connected to an ESP32 WiFi microcontroller. ESPARGOS could be used to determine the direction of arrival for WiFi signals and create a live augmented reality heatmap.

Recently, the ESPARGOS team has made an exciting discovery. They found that several ESP32 chips have an undocumented feature that lets the firmware bypass the fixed WiFi and Bluetooth functionality and instead capture raw IQ baseband samples. As a result, several ESP32 models can now be used as an internal SDR covering 2.2–2.7 GHz, plus 4.8–6.0 GHz on the ESP32-C5, with up to 80 MS/s sample rate and roughly 13–54 MHz of analog bandwidth, depending on the chip.

However, for use as a general-purpose PC-connected SDR, the output bandwidth is insufficient, so only snapshots of data can be exported to a PC. This means that the SDR will only work as a spectrum analyzer, and demodulating or decoding continuous radio data is not possible with just an ESP32. The exception is the new ESP32-S31, which can stream continuously at up to 16 MS/s over its Gigabit Ethernet interface, with a SoapySDR driver for GNU Radio and gqrx coming soon. If you want to try it yourself, the ESP-WebSDR page lets you flash the firmware to most ESP32 dev boards directly from your browser and view a live spectrum and waterfall.

Furthermore, ESPARGOS notes that phase-coherent IQ sample capture is now possible with their hardware. This means ESPARGOS is no longer limited to WiFi and Bluetooth signals; it can now perform direction finding on any arbitrary signal in the 2.4 GHz band. The team also says phase-coherent transmissions would be possible, but they aren't implementing them right now because they could be misused.

It also seems that, independently, at least two other projects discovered the same or similar features around the same time, but to solve different problems.

Over on Reddit, user /u/h0m3us3r discovered the same feature and uploaded it to GitHub on Sept 26, and recorded a video showing an ESP32-S3 working as an SDR with an FPGA used as a USB3 front end. Unlike ESPARGOS, h0m3us3r's project streams the raw IQ data to a PC continuously via the FPGA rather than in snapshots, so full demodulation/decoding on PC should be possible. However, the current prototype uses the FPGA to clock the ESP32, which results in poor phase noise. So if the clocking issues can be resolved, an ESP32 combined with an FPGA could make a standard general-purpose SDR, like the RTL-SDR, but with a 2.2–2.8 GHz frequency range and up to 80 MHz of bandwidth.

Another project that seems to be using a somewhat similar finding is C5VRX, which was first uploaded to GitHub on August 13. C5VRX uses an ESP32-C5 as a 5.8 GHz real-time FPV video receiver. Although this project appears to use a different mechanism, the result is similar: it uses an undocumented IQ data stream on the ESP32 to sample FPV signals and demodulate them onboard, outputting analog composite video through a simple resistor DAC. The project is still a work in progress and doesn't yet work reliably at range.

eSpDR ESP32 80 MHz output to SDR++

eSpDR ESP32 80 MHz output to SDR++

The Daily Front Page 26 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — The Working Toolkit
article

Context Language Models

by emersonmacro·▲ 139 points·29 comments·arxiv.org ↗

Abstract: We introduce Context Language Models (CLMs), language models that natively manage their own context. We implement this by treating the context as a file and allowing the model to make unrestricted updates to this file. This allows the model to learn what is most important to maintain in context, and naturally extends to multi-agent systems where multiple agent contexts coexist as files. Building CLMs zero-shot with existing models outperforms SOTA context management strategies across a variety of tasks: 11.4% higher accuracy with 21.5% fewer FLOPs on BrowseComp-Plus, 5% higher scores with 59% fewer FLOPs on 12-hour EdgeBench, and 65% greater improvement with the same compute on a 24-hour multi-repository agent-swarm task. Moreover, by shifting context management from external harness control to intrinsic model behavior, CLMs naturally enable both in-context and parametric learning of context-management strategies. We show that CLMs can be steered with natural-language instructions evolved through a standard skill-optimization loop, improving held-out accuracy by up to 35.9 points on a context-management task while reducing compute. We also introduce an online reinforcement learning method for CLMs, improving Qwen3.5-9B performance on BrowseComp-Plus by 47.6% while using 12% fewer FLOPs. Finally, we co-design Suffix Cache Reuse for CLM serving, further reducing server-side compute by 35% relative to standard SGLang at matched performance.

The Daily Front Page 27 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Also on the Front Page
The Daily Front Page 28 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Appointments
ask hn

Ask HN: Who is hiring? (October 2026)

Please state the location and include REMOTE for remote work, REMOTE (US) or similar if the country is restricted, and ONSITE when remote work is not an option.

Please only post if you personally are part of the hiring company—no recruiting firms or job boards. One post per company. If it isn't a household name, explain what your company does.

Please only post if you are actively filling a position and are committed to replying to applicants.

Commenters: please don't reply to job posts to complain about something. It's off topic here.

Readers: please only email if you are personally interested in the job.

Searchers: try https://hnwork.app, https://nthesis.ai/public/hn-who-is-hiring, https://dheerajck.github.io/hnwhoishiring/, http://nchelluri.github.io/hnjobs/, https://hnjobs.emilburzo.com.

Don't miss this other fine thread: Who wants to be hired? https://news.ycombinator.com/item?id=49922568

View the position →

The Daily Front Page 29 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — In Brief
article

Cops Can Bypass iPhone's Automatic Reboot to Get into Locked Phones

by speckx·▲ 256 points·205 comments·404media.co ↗

Magent Forensics, the owner of the GrayKey phone unlocking tool, says it can bypass an iPhone rebooting feature that was locking cops out.

Cops Can Bypass iPhone’s Automatic Reboot to Get Into Locked Phones, Leaked Video Claims

SCREENSHOT FROM MAGNET FORENSICS PROMOTIONAL VIDEO.

A company that makes phone hacking devices claims to have developed a solution that freezes iPhones in a state that lets cops more easily access sensitive data inside them, according to a video obtained by 404 Media.  

This is the latest salvo in the never-ending battle between Apple and companies that help cops — sometimes those in authoritarian countries — break into iPhones.

In November 2024, 404 Media revealed Apple quietly introduced a new feature in iOS that automatically reboots an iPhone that has not been unlocked for 72 hours. The idea behind this so-called “inactivity reboot” is to revert the phone to a state that makes it harder for police to break into the device, and thus extract sensitive data from it with forensics technology. 

At the time of Apple’s change, law enforcement agents expressed concern about this new feature, given that oftentimes they can’t immediately try to break into iPhones that have been seized. That could be because police are still waiting for a court authorization to do so, or there is simply a backlog of devices to unlock, for example.

The new technology to get around inactivity reboot was developed by Magnet Forensics, the company behind GrayKey, a popular tool sold to law enforcement agencies that allows them to unlock and access data stored in iPhones and Android smartphones. Magnet has developed a new device called GrayKey Preserve and a feature for its regular GrayKey devices called Evidence Preservation Mode, according to the video.

The Daily Front Page 30 of 31
Thursday, October 1, 2026 The Daily Front No. #261001 — Colophon

That's the Front for Today

Issue No. #261001 — Thursday, October 1, 2026 — went to press 2026-10-02 at 06:59 UTC.

About This Magazine

The Daily Front is a daily digital magazine assembled from the stories that reached the front page of Hacker News on Thursday, October 1, 2026. Headlines, points, and comment counts are recorded as they stood at press time. All articles remain the property of their original authors — every piece links back to its source and its discussion thread.

How It Was Made

Fetched, cleaned, and typeset by an automated pipeline. An editor model laid out the pages and chose the highlights; a second read a handful of the day's stories and briefed the cover illustrator — 31 model calls and 274k tokens in total. Set in Jacquard 12, Playfair Display, Source Serif 4, and IBM Plex Mono, all served via Google Fonts under the SIL Open Font License.

The Cover

The cover illustration was commissioned with this prompt:

Inside a secure server workshop, a compact autonomous machine tends a transparent filing cabinet whose drawers hold glowing context cards, sliding the most important cards forward while several smaller machines share neighboring drawers. Beside it, a mechanical gate sorts incoming objects into a few precise compartments, demonstrating bounded decisions rather than free-form output. Behind them, copper processor packages sit under lock and key on a balance scale, while cooling pipes and reinforced panels suggest a hardened, tightly controlled agent platform.

Create a calm, airy vertical magazine cover in soft color-field abstraction: broad translucent painted zones in deep teal, pale apricot, muted violet, and cool cream, with one compact focal form expressing the autonomous machine tending the transparent filing cabinet as glowing context cards slide forward; reduce neighboring machines, shared drawers, the precise mechanical sorting gate, locked copper processor packages on a balance scale, cooling pipes, and reinforced panels to a few lucid symbolic forms, preserving their relationships and the sense of bounded, tightly controlled agency.

Absolutely no text, letters, numbers, readable symbols, or logos anywhere in the image. Keep the main image subject primarily below the upper 10% of the composition, where a title may be overlaid; the scene may extend naturally underneath that title area.

Production Ledger

StageModelCallsTokens InTokens Out
extractgpt-5.6-luna 27 177,211 70,918
layoutgpt-5.6-terra 1 19,416 2,580
covergpt-5.6-luna 2 1,601 333
covergpt-image-2.5-flare 1 252 1,372

The Publisher

Published by Johnny.

Support the Press

If The Daily Front brightens your morning, consider supporting its publisher.

Credits & Contact

All content — articles, posts, comments, and the images within them — belongs to its original authors and is reproduced here to point readers back to the source. Full credit goes to those creators; every item links to its original and its Hacker News discussion.

If you are an author and would like your content removed from an issue, write to hi@johnnys.page and it will be taken down.

Feedback is always welcome at the same address: hi@johnnys.page.

Credit where credit is due.

Every page of this issue began as someone else's work — these are the original sources, linked in full.

  1. Pi 1.0 by sergiotapia — earendil.com·HN discussion ↗
  2. Clef: Open-weight decision models, and new RL fine-tuning platform by jasondavies — blog.cloudflare.com·HN discussion ↗
  3. Pi Durable by paulsmith — earendil.com·HN discussion ↗
  4. Git 3.0's upcoming SHA-256 default will be a costly mistake by chmaynard — blog.gitbutler.com·HN discussion ↗
  5. RIP, vector database by razin — turbopuffer.com·HN discussion ↗
  6. How to speed up the Rust compiler in September 2026 by trickypr — nnethercote.github.io·HN discussion ↗
  7. Several vulnerabilities have been discovered in the Linux kernel by luispa — lwn.net·HN discussion ↗
  8. Cloudflare K2: serverless event streams by elffjs — blog.cloudflare.com·HN discussion ↗
  9. GPT-Synopsys: Frontier Intelligence to Revolutionize Chip Design by giuliomagnifico — news.synopsys.com·HN discussion ↗
  10. Automatic Transmission – a data-privacy study of connected vehicles by rafaelc — automatictransmission.khoury.northeastern.edu·HN discussion ↗
  11. The death of web development education by ibobev — molily.de·HN discussion ↗
  12. RacketCon Is Saturday by spdegabrielle — con.racket-lang.org·HN discussion ↗
  13. SlutCon by ekluger — thenewcritic.com·HN discussion ↗
  14. Using Opus 5.5 to discover a new eyewitness record of the dodo by benbreen — resobscura.substack.com·HN discussion ↗
  15. StreetComplete on iOS is now in public beta by Snowly — github.com·HN discussion ↗
  16. Returning from vacation? The government can search your phone without a warrant by rbanffy — arstechnica.com·HN discussion ↗
  17. Google breaks promise to provide 10 years of updates to Chromebooks by speckx — osnews.com·HN discussion ↗
  18. Fuck Android Developer Verification Program by 0xcrypto — twitter.com·HN discussion ↗
  19. Figma restricts MCP access to whitelisted clients, excluding Pi by thdr — twitter.com·HN discussion ↗
  20. Micron CEO Says Memory Supply Will Be Much Tighter in 2027 and 2028 Than in 2026 by speckx — techpowerup.com·HN discussion ↗
  21. FTC is investigating OpenAI, Anthropic and other AI companies over product risks by dgellow — cnbc.com·HN discussion ↗
  22. Red Hat being phased out of existence? by amcclure — techrights.org·HN discussion ↗
  23. SvelteKit 3 by sampsn — svelte.dev·HN discussion ↗
  24. Various Projects Find Hidden SDR Capabilities in ESP32 Microcontrollers by nkw — rtl-sdr.com·HN discussion ↗
  25. Context Language Models by emersonmacro — arxiv.org·HN discussion ↗
  26. Meta Uses A.I. Data Centers to Avoid Billions in Federal Taxes by gmays — nytimes.com·HN discussion ↗
  27. Vote on which of Hacker News' challenges for AI have been met by stabbles — stoppels.ch·HN discussion ↗
  28. 10-year Treasury yield climbs above 5.3% to a level not seen in 24 years by kaycebasques — wsj.com·HN discussion ↗
  29. Ask HN: Who is hiring? (October 2026) by whoishiring — news.ycombinator.com·HN discussion ↗
  30. Cops Can Bypass iPhone's Automatic Reboot to Get into Locked Phones by speckx — 404media.co·HN discussion ↗

Browse all issues in the archive →