Please join me in congratulating the new CiviCRM Community Council. The council has 11 seats. Nine candidates each received endorsements from two community members. There were fewer candidates than seats, so all nine are elected by acclamation....
Please join me in congratulating the new CiviCRM Community Council. The council has 11 seats. Nine candidates each received endorsements from two community members. There were fewer candidates than seats, so all nine are elected by acclamation.
The
CiviCRM Community Council
is an elected advisory body. It brings together the community’s ideas and values, works with the Core Team on open decision-making, and keeps the CiviCRM community a safe place to collaborate.
Meet the Council members:
Nina Carstensen
I started using CiviCRM in 2017, when both the organisations, the one I was volunteering for and the one where I worked, introduced the software. I now work as a project lead for CiviCRM at a community foundation in Germany. I co-founded and help organise the monthly German-speaking CiviCRM meetup as well as the meetup for fundraisers using CiviCRM. Both meetups bring together users to learn and share their knowledge. Based on this background, I see myself primarily speaking for end users. On the Council, I would like to help more users become confident members of the community by learning how to find help, help others and being able to participate without coding skills.
Lesley Carter
I have used CiviCRM with our clients for fourteen years, helping them to utilize it to its fullest extent in support of their missions. The core principles underlying CiviCRM – data and system ownership, flexibility, development by a community rather than a for-profit corporation – are tremendously important to me and I hope to help the Civi team continue to build on them. As a system admin/user rather than a developer, I’ve found the Civi community to be welcoming and patient with questions – my goal is to expand that ambience for folks who are new to CiviCRM or still grappling with it and to find new and creative ways to make Civi even more accessible to a variety of users.
Don Hirst
I have supported CiviCRM users and websites since 2015. Along the way, I identified issues with the documentation and worked to improve it. When the Community Council was established, I volunteered to serve, focusing on documentation. Since then, I have worked with community contributors, partners, and Community Council and Core Team members to strengthen and expand the documentation suite.
Going forward, my focus remains on documentation. I support the use of the Diátaxis framework to help restructure existing documentation and guide the development of new content. Recent efforts to use AI tools to improve documentation and make it more accessible are valuable and should continue. CiviCRM is a world-class application. My goal is to help ensure that it is supported by world-class documentation.
Benedikt
Kaleß
I am Benedikt Kaleß and I will serve on the CiviCRM Community Council as a representative of a user organization.
In my professional capacity, I serve as Head of IT at Pro Peace. We use CiviCRM since 2009. From the very beginning, I am part of the CiviCRM community. I recall meetings in Berlin focused on establishing a German-speaking community or the discussions of funding the extension CiviSepa. In my role within the user organisation Pro Peace, I am also a board member at Software für Engagierte. I actively contributed to #CiviOneClick, which received funding from the Deutsche Stiftung für Engagement im Ehrenamt (DSEE). My goal is to strenghten the new concept of Regional Ambassadors envolving more end user organizations in CiviCRM community.
Rich Lott
I'm standing because I want CiviCRM to be a useful thing for organisations that are focussed on improving humanity. Our democracies are under threat; our climate is fast becoming un-live-able; our ability to communicate and organise is being co-opted by big tech.
I want to make sure that Civi's "do-ocracy" doesn't leave smaller organisations behind and I also want to help us remember not to sell out our ethics or community to big tech billionaires via AI.
I've been implementing, running, developing and supporting Civi for clients since 2010. I've been a partner for many years too. I'm a regular at UK/EU sprints and camps. I maintain over 30 extensions used by hundreds of orgs and contribute to many more. I have about 10 Civi clients ranging from tiny orgs to larger ones with ~1M contacts. I frequently contribute to core; I was key to bringing Standalone and RiverLea into being. I had 20 years' experience as a senior manager and co-director of a small UK NGO before going full time on my freelance business called
Artful Robot
.
Bashar Makhay
I'm Bashar Makhay, Senior Communications & Technology Officer at the NYC Preparedness & Recovery Institute, where I implement and manage CiviCRM. I’ve also managed CiviCRM for Columbia University’s Office of Government and Community Affairs, Columbia Community Service, and Tarab NYC. My experience is primarily as an implementer, administrator, and organizational decision-maker rather than a developer. CiviCRM is an incredibly powerful platform, but we don’t always communicate its value effectively, particularly beyond the existing community. Drawing on my background in communications and community organizing, I want to make CiviCRM more accessible, approachable, and appealing to organizations considering adopting it. On the Council, I hope to amplify non-technical voices while advocating for better user experiences, stronger marketing, and more accessible resources. Cheers!
Joe Murray
I've been in providing CiviCRM services through
JMA Consulting
since 2005. Over the years I provided significant early funding, specifications, developer resources and/or leadership to lots of community initiatives. While serving on the Community Council, I’ve helped with policy development and compliance on things like CiviCRM trademark and brand, use of the blog, and using AI when contributing to CiviCRM. I hope the Community Council continues to contribute to healthy ecosystem governance and the growth of the project. I have a particular interest in the product roadmap, especially making the system easier for non-technical nonprofit staff to use. JMA will continue funding user experience research in this area and working with the core team and others, initially to create a simpler FormBuilder UI.
Neil Planchon
I've been using and championing CiviCRM since 2008, all pro bono, as an end user rather than a developer or implementer. My background spans 25 years in the cohousing and intentional communities movement, Sociocracy and shared governance, and nearly 30 years in nonprofit technology, including organizing with NTEN Oakland.
I've led two West Coast CiviCamps, volunteered at several CiviCons, and recently helped Sociocracy For All and the Cohousing Research Network put CiviCRM to work. Much of my ambassador work is introducing CiviCRM to organizations that could benefit from it and helping newcomers find their way into the community, and I enjoy helping different voices find common ground.
Returning to the Council, I look forward to finishing a confidential way to raise concerns, regular Council updates, and AI guidelines for the project, and to supporting the Core Team and welcoming our new members.
Peter Reck
I actively managed the introduction and implementation of CiviCRM four years ago to help digitize the processes of Stiftung Pfadfinden, a volunteer-run foundation in Germany. I have invested significant time building automations with Form Processor and Search Action Designer to make CiviCRM as simple and accessible as possible for our volunteers. In my professional life, I work as a Project Manager, bringing experience in stakeholder management, governance, and finding common ground between different perspectives. As a Community Council member, I would like to strengthen the voice of small NGOs, end users, and administrators, ensuring that community decisions reflect the practical needs of organizations that rely on CiviCRM every day and encourage more people to actively contribute to the community.
AI Skeptics: The AI Wuhan Moment (with Tom Adams)
Math Babe
mathbabe.org
2026-11-02 10:37:07
Shit is getting real, people: Apple Spotify YouTube...
We've been tracking various metrics each month for over a year now in lieu of producing a big annual report. The latest, for October, is now live at https://civicrm.com/about
At this point, we have a number of trends that we can confidently point to (because the methodology of collecting them has...
We've been tracking various metrics each month for over a year now in lieu of producing a big annual report. The latest, for October, is now live at
https://civicrm.com/about
At this point, we have a number of trends that we can confidently point to (because the methodology of collecting them has been consistent), even if the numbers behind them are debatable (speaking of the stats, for example).
For those that don't want to read the entire report, here are the highlights.
Key takeaways
As an ecosystem, CiviCRM is growing. Installation growth, based on anonymous pingbacks, is up 104% YoY, Spark growth is up 30% YoY, and partner, contributor and member growth is slowly inching up.
Combined website traffic across civicrm.com, civicrm.org and docs.civicrm.org are is down almost 7% after having been rising consistently through the first half of 2026. This is likely due to the impacts of AI-based search. In fact, CiviCRM's own AI assistant "Doc Bot" is seeing increased usage.
Financially, we're at breakeven for the past rolling 12 months due to 1) strong earned and subscription income (accounts for over 43% of budget) and 2) stronger than expected event income (accounts for 13.5% of budget). Community funding remains consistent but flat. We expect to close out the year at a loss.
The largest expenses for CiviCRM at present are labor and events, coming in at 76% and 14% of budget, respectively. We expect labor to increase in the coming months and into next year as we press forward with various intiatitives.
We're coming up on 4 years of climate action with Ecologi:
https://ecologi.com/civicrm
It's a small amount each month that reflects a large impact over time.
Improvements to the monthly report
Improve the expense breakdown to be more meaningful
Test and verification technique effectiveness with GPT-6 Astra
Dan Luu
danluu.com
2026-11-01 19:00:00
When we looked at how well agents used test/verification techniques in August1, we saw that GPT-5.6 Sol generally did what you might call a caricature of various techniques when asked to use a technique or library such as TDD, QuickCheck, Lean 4, etc.; not specifying any particular test method (whic...
When we looked at
how well agents used test/verification techniques in August
1
, we saw that GPT-5.6 Sol generally did what you might call a caricature of various techniques when asked to use a technique or library such as TDD, QuickCheck, Lean 4, etc.; not specifying any particular test method (which we'll call Default) resulted in many worthless unit tests, which was one of the best performing conditions because asking agents to test in specific ways mostly made them worse. In that eval, we gave agents the Zstd RFC and asked them to implement Zstd (with an addendum for how they should test for all conditions other than Default).
On re-running the same eval with GPT-6 Astra, we see two big differences:
Astra's capability has increased by enough that we need a more difficult eval (on the Zstd implementation eval, almost every condition gets 100% correctness almost every time on medium regardless of technique)
Agents seemed to use test and verification techniques more effectively
On (1), we previously saw that, when implementing Zstd from the RFC with 5.6 Sol, on average, agents spent $3.50 on medium effort and $5.50 on xhigh effort to get full (holdout) test correctness about 63% and 77% of the time, respectively. With Astra, agents cost $1 to get full test correctness over 99% of the time at medium effort.
On (2), an example would be that when we asked 5.6 Sol to do fuzzing, it would generate many worthless random inputs, which would mostly hit the same code paths and not test anything interesting. With 6 Astra, we see agents that are asked to do fuzzing in a structured way that actually exercises code paths and finds non-trivial bugs, but we can't tell if this improved correctness or not because the Zstd implementation benchmark is saturated.
We also tried giving 5.6 Sol the IMAP RFC, but it was too hard for 5.6 Sol. When trying again with 6 Astra, we get the following distribution of results (the y-axis is the percent of runs where all tests pass; agents are not given the tests and the points are the results across 80 runs of each condition).
Default once again looks pretty good. Some conditions result in somewhat better correctness, but also with higher cost. Although the IMAP RFC isn't saturated, it would be nice to also see results on a harder task since most of my time goes to tasks that agents can't one-shot most of the time. To test this, we'll try the
pandoc eval we looked at when comparing programming languages
. A reason I want to see results on larger evals is that, as we observed
when looking at caveman mode
and as we saw with languages, models often perform fairly differently on larger tasks. With caveman mode, the large wins that people reported became smaller or disappeared and with languages, we saw this in multiple ways, such as C and C++ implementations of Zstd being at least somewhat ok on memory safety, whereas C and C++ implementations of Pandoc were plagued by memory safety issues.
Pandoc is significantly harder, and even after running multiple turns (roughly 14 on average), no condition reached 100% correctness, so we'll look at the fraction of tests passed instead of fraction of runs that got to 100%.
For this, we only ran each condition 25 times due to the cost involved. At MSRP, this cost about $90k.
Recall that, in past evals we ran on languages and test/verification techniques, the failures were often idiosyncratic results of how agents operate, such as agents using Clojure writing incorrect byte conversion code by default or agents using Verus writing vacuous proofs. This kind of thing is quite different from the reasons I've seen people say that agents should use some particular language or test/verification technique, which are generally nice-sounding explanations for why something ought to be better that sound appealing in a very human way but appear to be unrelated to reality when we look at what agents actually did
2
.
Because we "only" ran $90k worth of evals here, we don't really have enough information to say why almost anything happened. We can observe that some conditions performed better than others, but it's difficult to say what it means. As a result, we shouldn't read too much into this, but we do see some things that seem consistent with what one might expect, in that we might expect most of the test techniques and libraries suggested to give better generalization, which would then give better holdout vs. test scores (result is up and to the left of the Default line when viewing visible vs. holdout test scores), with TDD giving worse generalization (down and to the right of the Default line).
But, if it's true that testing properties gives us better generalization and conditions like TDD that result in a lot of small tests give less general results, we'd expect the built-in condition to also have a low holdout:visible relative to Default and that's not what we saw. Why this is is unclear and I don't think we can really determine this without a lot more runs.
For the actual results, the line shown for cost vs. holdout and cost vs. visible show curves fitted to the shape of all graph trajectories across multiple turns, fit to Default. Things that are below / right of the line can be thought of as worse and above / left can be considered better. With 5.6 Sol, it was clear that the test conditions generally weren't doing useful work for a combination of reasons:
Almost no condition outperformed Default
On other evals (not discussed in detail), similar prompts also did not outperform Default
The tests produced by non-Default conditions were mostly ridiculous and didn't capture the value of the technique
Here, we have a situation where many different techniques have a better result than Default. The conceptual error bars on each condition are quite wide (more so than indicated by the bootstrap intervals shown on the plots), but the number of conditions that outperform Default makes it
plausible that one or more conditions truly outperforms Default
even if we don't know which ones exactly. Furthermore, some conditions likely truly outperform other conditions, but we don't really have sufficient data to tell which conditions are generally better. It's much simpler when almost everything looks bad across a wide variety of techniques.
Here are some questions I have about the results:
To what extent can these results be extrapolated to running more turns to get to
near-complete correctness for Pandoc
? In general, conditions do maintain something like their rank order with additional turns, so it's plausible the ranking will continue as-is, but this is untested
How much of the results are due to a small sample size (with respect to each condition)? For the Pandoc eval, we "only" ran each condition 25 times. Many different turns were run, but we know from previous experiments as well as just using agents that there's a high degree of path dependence when looping over generated code
How much of the results are due to a small sample size (with respect to minute / trivial variations)? From having run a few silly evals, I know that it's possible to get very different results when asking for the same thing due to trivial changes (such as changing sentence structure, changing capitalization, etc.); how much of the current results are due to something arbitrary like this?
How much of the results are due to a small sample size (with respect to the problem being solved)? We looked at one "Pandoc-sized" problem. If we looked at 100, how representative would Pandoc be?
If I really wanted to answer these questions, I'd want to run at least 100x what was run here to run the full matrix. Steve Yegge has mentioned using ~20 Claude subscriptions to spend ~$120k/mo of MSRP token spend. Getting to 100x isn't plausible with a setup like that, but 2x to 3x could be done with testing expanded in a limited fashion and some guesswork and extrapolation. I don't know that it really makes sense for me to do that given how much time it would take and how little spare time I have, but considering
what kinds of things academics have looked at when studying programming productivity
, maybe it makes sense for a grad student to do this, since it would be more informative than a number of widely cited studies. But, in industry, I'm not sure who would do this outside of an AI lab.
That being said, if you keep in mind that we don't know how well any of these results generalize, I'll note a few things that I thought were interesting.
Differential testing caused agents to examine tests and invariants in a way that engendered better "understanding" than other conditions
TDD once again underperformed, but not all conditions that caused agents to write a lot of small tests underperformed
Property-based testing (not the named condition, but a number of libraries that force the use of the technique) finally resulted in tests that do what one might hope from PBT
(1): I tried to get agents to do this with the hastily written skill I wrote for the 5.6 Sol Zstd eval; although the skill performed decently, agents basically didn't do this. However, for the Pandoc eval, differential testing did cause agents to closely examine boundary conditions and figure out how to write tests (and therefore how to write code) that correctly implements both sides of the boundary. I'm not confident that this generalize, but it would be interesting to see if it does generalize and what else can get agents to do this kind of thing systematically.
(2): Although TDD underperforming is exactly what I'd expect (recall that I added TDD to the 5.6 Sol eval because I thought it would underperform), the lack of underperformance of other conditions that cause many small tests to get generated should reduce confidence in the plausible sounding reason that writing many small tests underperforms.
(3): I've felt for a long time that ACL2 is underrated relative to other verification tools (it was heavily used to good effect in industry in some areas relative to the amount of academic work on it). I had low confidence in this opinion and continue to have low confidence, but it has performed well in evals I've done so far. Given how much effort is being poured into getting agents to use Lean effectively, I'd expect that Lean will eventually outperform ACL2 even if ACL2 outperforms today, but ACL2 doesn't seem like a bad choice today. For people doing verification or proofs with Lean 4, I'd be curious how the results compare to using ACL2.
(4): Yay (perhaps). For all the reasons I noted above, I have low confidence that this generalizes, but Proptest once again performed well. And, this time, the testing was a lot better than we saw in the 5.6 Sol Zstd eval. I have no inside information on this, but I would guess that there wasn't a major effort on improving PBT / fuzzing / etc. between 5.6 Sol and 6 Astra and that this comes out of better generalization and higher capability. If that's true (and this isn't just some artifact of my only spending $90k MSRP and not $9M MSRP), this bodes well for better testing in the future in that we should expect models to get better at testing without any particular effort to improve testing capabilities.
Between my running these tests and publishing this post, a claim that you should tell agents not to write tests (based on running DeepSWE) went viral. The specific claim was
ok it's official...[ellipses from original quote] AI-written unit tests and integration tests are empirically proven to be unhelpful. you should tell your agents to stop writing tests by themselves
As we previously noted
, I find DeepSWE unrepresentative of work that I do and therefore meaningless to me personally. Additionally, that was done with Sonnet 5.5 High, so it generally only passed on problems that are much easier than the problems discussed here, and as observed here and in other recent evals, which techniques are effective often doesn't generalize across problem size or problem difficulty. I find it plausible that for problems coding agents find very easy, telling them not to test reduces cost (which is what was actually shown conditional on someone caring about DeepSWE). Generalizing this to "AI-written unit tests and integration tests are empirically proven to be unhelpful" based on the test that was run seems wrong regardless of whether or not this holds for other problems, and it seems unlikely that the claim holds. The claim was based on asking for no tests, which resulted in similar correctness and a small cost savings (9%, on average). In our tests here as well as before, we find differences in correctness as well as a larger than 9% difference in cost, so it seems unlikely that a claim like "AI-written unit tests and integration tests are empirically proven to be unhelpful" based on a 9% difference in cost on a benchmark of small problems is correct. Another thing to note is that DeepSWE's grader is broken with respect to testing because (among other issues),
an agent can add a test name that conflicts with a grader's secret test name, which will then cause a failure
. Given issues like that, adding tests is inherently penalized in a way that isn't representative of real-world usage.
You can argue the claim was highly effective, in that making overstated claims that something is empirically proven is a good way to go viral
3
or
get a lot of citations
, but it's not a good way to figure out how to use coding agents effectively.
My goal here is not to write the end-all-be-all benchmark for “I’m a vibe-coder, which framework should I choose?” The point of this post is to demonstrate that it’s possible in the era of AI coding to still make decisions based on evidence rather than vibes.
I feel the same way here, in that I think it's valuable to run some toy evals and see what the results are. Even if someone had the resources of an AI lab available to them, I don't think they could say that X or Y are "empirically proven to be unhelpful [or helpful]", but we can still get some kind of information.
From what we've seen in our testing evals, I'd be inclined to try proptest if I wanted a property-based testing library in Rust, and for any problem that I'd use Lean on, I'd be inclined to try ACL2 as well to see how results vary and if I get better results, and there's also a fair amount of information that fits into some kind of vibes-based feel for things.
As I've noted in my N most recent posts, I've been trying to write up each of these in 30 minutes because there are too many results to write up and not enough time, so I'm not going to provide
an accounting of what happened for each condition like I did for the 5.6 Sol Zstd eval
. I'm already over 30 minutes on this post, so I'll stop here and perhaps we'll look more into testing and verification in a future post.
Thanks to Laurence Tratt and Marco Primi for comments/corrections/discussion.
Appendix: why don't AI labs publish more comparisons on what techniques are effective?
Unlike us randos, they actually have the resources to run relatively comprehensive evals and there's a general lack of information about what's effective. If people understood how to use AI better, it seems like that would result in more AI usage. Also, my experience has been that different techniques are effective with OpenAI's models vs. Anthropic's models. If one of these companies published good information about what works with their models, that could move people towards interacting with agents in a way that's advantageous for them.
I guess the case against this is something like, revenue growth is so rapid that more money can be made by doing other work and/or differences in how people prompt don't really matter anyway. As someone on the outside of these labs, the former seems plausible to me, whereas the latter doesn't seem like it can be true (because I've repeatedly observed reasonable people who aren't doing obviously silly things get very different results, to the point where one person might fail to get a working solution to a problem where another person easily makes things work).
David R. MacIver noted:
Btw one thing I'm noticing in my evaluations on the skill is that ChatGPT is way less into PBT than Claude is. Claude will pretty eagerly write property-based tests and seems to benefit from them during development in my current benchmarks, but ChatGPT sol doesn't do that unless you're really insistent. So there might be some prompt sensitivity going on here, or it might be model specific. I've not yet optimised the skill for ChatGPT at all so it's possible I've inadvertently fucked something up for it. BTW I don't actually know that Claude is
better
at PBT than ChatGPT (I should really check this). It's just more proactive about doing it, but it's plausible that when they actually write properties they're about the same level of quality.
I haven't done the same breadth of testing with Claude. Given what MacIver said, it's plausible that Claude is better at property-based testing or that it's not. Also, given that he develops Hegel and is generally using Claude, it's also plausible that Hegel works better with Claude than with Codex and we'd see better results from Hegel if we tried with Claude. So there might be some prompt sensitivity going on here, or it might be model specific.
Although it's not shown on the graph, the original Hegel skilled used for the 5.6 Sol Zstd eval and the updated one that was created as a result of MacIver doing more testing on the skill after that eval both fared worse than Hegel with no skill. Correctness was pretty similar, and both cost a lot more, with the updated skill being the more expensive of the two. I think it's pretty interesting that this skill, which was improved for some cases got worse for other cases. As we discussed in the last post, it seems very difficult to write certain kinds of skills (such as test technique skills) that are effective across models and effort levels. A related thing we can observe here is that the Skill condition, which was a skill I quickly whipped up based on my experience driving agentic testing with GPT-5.5 and GPT-5.6 Sol outperformed in our 5.6 Sol eval, but underperformed here with 6 Astra on Pandoc. Someone who has more experience driving testing with 6 Astra on larger problems could probably write a skill that outperforms in those circumstances, at least on problems that are similar in nature to what that person has worked on, but I haven't seriously looked at Astra test effectiveness enough to write that skill myself.
On a related note, for various arbitrary reasons, I've gotten used to using Codex. I seem to do ok with it. This gives me little idea how effective I would be with Claude.
Roman Leventov commented:
Hi Dan, I was encouraged by your post about ai-coding to try fuzz/generated testing.
A part of a system I develop has a statechart-like architecture. Think of it as a support chat where automation could suggest actions or messages for support agent (human) to send to the user. LLM is not used to author messages, but just to classify some of the support intents, but state transitions are deterministic. There could also external events about the subject of the ticket that materially affect possible next actions or decisions. All of this gives rise to a rich statechart system. It is written in TypeScript.
So I had to rewrite a significant chunk of that system so to derisk rewrite but also to try fuzzing I decided to go with it during the rewrite. I used sol xhigh for the first 5 days of the rewrite, then mostly astra medium or high for 4-5 days more (it was around astra release). I instructed agent to develop generate traces of all the possible kinds of events and effects that affect the logic.
For the first 4 days it couldn't make the generated testing system find a single de novo defect that agent reviewers themselves didn't find first. I always use my approach where I define many angles/scopes/areas of review (for this rewrite there were about 15), make agents generate quite detailed prompt for these areas based on my templates, then start subagents in these areas with verbatim prompts in the areas as long as they find any defects or things to fix.
In total throughout the whole rewrite, agent reviewers found about 210 bugs/defects, generated tests took off the ground a bit towards the end and produced about 20 de novo defects that agents themselves didn't notice. In total about 230.
Production code change was about 30k lines, the generated testing harness and everything that was written specifically to support this generated testing approach was about 300k lines at the end. Probably it was very ineffective, but I didn't look into it.
After the deploy, there were a few (4-5) very "stupid" bugs that you would think a process that run well over 100 agent reviewers and found 230 bugs couldn't have missed. Still, I consider this a good result for a rewrite of such a complex statechart system.
Overall I consider this a negative result because generated tests helped find just 10% of the defects, and required gargantuan amount of code (300k lines) and agent tokens to develop and support.
I think this is interesting and I would love to see more people writing up case studies of what they observe.
We opened a ticket with support about Gitbook availability issues and got this in reply. We have yet to see any official customer communication or breach notification. Apologies for the formatting, did the best I could as it's a mobile paste.
Update:
GitBook security incident update
Hey <$name>,
The GitBook app, the GitBook API, and published docs are available again. A few services may still be degraded as we finish restoring everything to full performance.
*What happened*
GitBook has been the target of a sophisticated, highly targeted attack using AI agents.
At 19:00 CET, November 2, the attacker gained unauthorized access to some of our infrastructure credentials. We detected the attack immediately and acted swiftly to block further impact.
To make sure our infrastructure was fully secure, we then took the GitBook app and authenticated docs sites offline. We kept publicly published content live for as long as possible, using cached data.
*What we did immediately*
* Blocked the attacker and closed the vulnerabilities involved
* Replaced every credential and secret across our infrastructure
* Brought services back only once we were confident they were secure
* Invalidated every customer’s API tokens on our platform
*Your data*
Our investigation shows that the attacker may have accessed the following:
* Git Sync secrets.
* GitBook API tokens.
* Third-party API tokens used to connect external tools to GitBook.
* Questions asked to GitBook Assistant by your site visitors.
At this stage, we have found no evidence that any of your content in GitBook was modified.
*What you need to do now*
* Rotate any existing GitBook API tokens. We revoked all personal API tokens during the incident.
* Rotate any third-party API tokens or secrets you use to connect other tools to GitBook.
* If you have published integrations that use secrets, rotate those secrets.
* If you use the GitBook MCP server, re-authenticate it.
Please contact your GitBook organization’s admin to assist with this process.
*What we are doing next*
* Monitoring the situation in case of further attacks.
* Introducing further security measures to our platform.
* Writing a full post mortem that will be published soon with more detailed information about the incident.
* If you have any further questions, please reach out to your account manager or our support team. You can also check status.gitbook.com for updates
Thank you for your patience, and we apologize again for the disruption
The GitBook team
A robot needs to fetch a packet from the shelf and put it down on the workbench.
Easy enough: drive over to the shelf, pick up the packet, drive back, and put it down.
Four actions.
Unless the battery is low.
Then the robot has to visit the charger first, and the questions become where in the plan that visit should go, and how long the robot should stay there.
This is planning in miniature: a start, some actions, a goal, and nobody telling us how long the plan should be.
Planning is a research field of its own, and a common first idea is to describe the problem in
PDDL
and hand it to one of the many planning systems that read it.
For a lot of problems, that is the right choice.
Constraint programming is another natural fit, especially when the actions come with restrictions like a battery that runs down.
The common objection is that most constraint programming solvers fix the set of variables before search starts, so we need a bound on the length of the plan before we know how long it will be.
Gecode has always allowed new variables and constraints to be added during search, but before
Gecode 6.5.0
there was no explicit support for it.
Gecode 6.5.0 adds that support as
open variable lists
.
An
OpenIntVarList
is a list of ordinary
IntVar
s that are created when propagation or search needs another position, together with an ordinary
IntVar
for its length.
When a position is added, a
transition callback
can create more variables and post constraints for that step, such as the next state of a plan, so any constraint in Gecode can be used in a model that grows.
In addition, the release has open versions of some common constraints, such as
regular
,
distinct
, and
sequence
, which are posted once on the whole list and follow it as it grows.
A list brancher decides both the next value and whether the list should grow, and most of the usual variable and value selectors work on the positions.
1
All of this is built with the propagator and brancher interfaces that Gecode already had, plus a few small additions to the kernel.
2
The release also includes two experimental search engines, A* and complete anytime beam search.
This post models the robot, then the fifteen-puzzle, and ends with the new engines.
The shelf, the workbench, and the charger are connected in a line, in that order, as in the picture at the top.
The robot starts at the workbench with one unit of charge.
Each move uses one unit, each charge action at the charger adds one, and the battery holds five.
Picking up and putting down the packet are free.
With one unit, the robot can reach the shelf, but then it is stuck there with the packet.
The shortest working plan visits the charger first.
Action
Location afterwards
Charge remaining
Packet
Initial state
Workbench
1
On the shelf
Move to charger
Charger
0
On the shelf
Charge
Charger
1
On the shelf
Charge
Charger
2
On the shelf
Charge
Charger
3
On the shelf
Move to workbench
Workbench
2
On the shelf
Move to shelf
Shelf
1
On the shelf
Pick up
Shelf
1
Carried by the robot
Move to workbench
Workbench
0
Carried by the robot
Deliver
Workbench
0
Delivered
Three charges are exactly enough, and with two the robot is stuck at the shelf.
Charging four or five times also works, but every extra charge makes the plan longer, so the first plan a solver finds need not be the shortest.
Try it below, and head straight for the shelf first to see what happens.
Workshop planning
Location
Workbench
Charge
1
/
5
Packet
On the shelf
Actions
0
Each move uses one unit of charge.
Manual controls
Follow the plan
Step 0 of 9
Optimal plan:
Right
→
Charge
→
Charge
→
Charge
→
Left
→
Left
→
Take packet
→
Right
→
Deposit packet
What I want is a model that just describes the actions and their effects, and lets the solver discover the detour on its own.
A straightforward CP model has a variable for each action, variables for the state before and after each action, and a transition constraint relating them.
For a plan with four actions, there are four action variables and five states, with the first state fixed to the initial situation and the last required to satisfy the goal.
For our example, that model has no solution.
Planning encodings have traditionally dealt with the unknown length in two ways.
One is to solve again with five actions, then six, and so on up to nine, so that the first plan found is also a shortest one.
The other is to choose an upper bound, say twelve actions, and allow an unused suffix, at the price of modelling which positions are active and having every position up to the bound in the model from the start.
An open list gives a third option: keep the bound of twelve, but create positions only when search or propagation needs them.
The model then grows the way a plan does when you work it out by hand: first the charging visit, then the trip to the shelf, and once the packet is delivered, we can stop.
The full model is in
open-robot.cpp
.
The actions are kept in an open list, and the states between them in three more: where the robot is, how much charge it has, and where the packet is.
Each action is an
IntVar
over the six action codes, and there are at most twelve of them.
actions.length()
is the length of the finished plan, and
actions.known_length()
counts the positions created so far.
Creating a position is called
materialization
, and it does not assign a value.
When the plan grows, the new action is materialized and the callback calls
step
, which materializes the state after it and posts the constraints between them.
The callback is shared between copies of the space, so it casts the space it is given instead of capturing
this
.
It must also be deterministic, since recomputation and parallel search may repeat an extension in another space.
The legal steps are a table with one tuple for each action and the states before and after it, posted as an extensional constraint for each step.
static TupleSet
robot_steps(void) {
TupleSett(7);
// Moving to a neighbouring location uses one unit of charge. A move
post_goal(Home home, IntVar pk, IntVar length, int i) {
BoolVar done =expr(home, pk == Delivered);
rel(home, (length == i) >> done);
rel(home, done >> (length <= i));
}
The plan can only end where the packet has been delivered, and it ends as soon as it has.
Propagation does some planning before search starts.
The packet cannot be delivered in fewer than four actions, so the root already has four, the first a move to the shelf or the charger and the second picking up or charging.
Branch-and-bound then finds the nine-action plan.
We can also use the
regular constraint
to encode the state as a transition system, folding the values of
at
,
charge
, and
packet
into the states of a finite automaton instead of keeping them in variables.
Each tuple in the table becomes a transition labelled with its action, so the accepted words are exactly the delivery plans.
staticint
state(int at, int ch, int pk) {
return (pk * (capacity+1) + ch) *3+ at;
}
// Read the table of steps as an automaton over the actions.
static DFA
robot_dfa(int initial_charge) {
TupleSet steps =robot_steps();
std::vector<DFA::Transition> transitions;
for (int i=0; i<steps.tuples(); i++) {
// A step is (a, at0, ch0, pk0, at1, ch1, pk1).
TupleSet::Tuple s = steps[i];
int action = s[0];
int from =state(s[1], s[2], s[3]);
int to =state(s[4], s[5], s[6]);
transitions.push_back({from, action, to});
}
transitions.push_back({-1, 0, 0});
// The plans end in the states where the packet has been delivered.
IntArgs delivered;
for (int ch=0; ch<=capacity; ch++)
for (int at=Shelf; at<=Charger; at++)
delivered <<state(at, ch, Delivered);
delivered <<-1;
int start =state(Workbench, initial_charge, OnShelf);
The interesting part is what an open regular constraint does with an unfinished plan.
After moving to the charger and charging once, the packet is still on the shelf, but the plan can still reach the goal.
Moving straight to the shelf is a dead end, and is rejected while the list is still open.
So while the list is open, a prefix is kept if it can reach an accepting state within the maximum length, and once it is closed, its last state must be accepting.
Regular propagation works on a
layered graph
, with a layer of automaton states for each position and edges labelled with the values in each domain.
The widget uses a small automaton for the words that start with
a
and end with
b
.
With a fixed length of two, only
ab
has a path.
The open list has the same two positions but a length of up to four, so a prefix like
aa
can still become
aab
.
Lower the maximum length to two, and the open list behaves like the fixed one.
A DFA and its unfoldings
The DFA
Fixed-length unfolding
length = 2
Open list and possible continuations
2 ≤ length ≤ 4
Open, so a prefix ending in q₁ can still finish with b.
Gecode does not build the future layers.
It computes the shortest distance from each automaton state to an accepting state, and keeps an end state of the prefix only if that distance fits within
length().max() - known_length()
.
Both the table and the automaton list every combination of location, charge, and packet status.
That works for the robot, but with more packets and a second robot the combined states explode, and the transitions are better posted as ordinary constraints over the state variables, as in the fifteen-puzzle below.
The list brancher assigns the materialized positions, and once they all have values, it tries closing the list, with extending it as the alternative.
For the robot, closing fails until the packet is delivered.
The usual selectors choose among the materialized positions.
To settle the number of actions first, branch on the length before the actions, and depth-first search with minimum-value selection then tries shorter plans first.
Building the plan incrementally can find a longer plan before a shorter one, so the companion minimizes the length with branch-and-bound.
With
-branching max
, it tries the highest action code first, which means charging whenever it can, and finds plans of eleven, ten, and finally nine actions.
Real planning models collect side rules: don’t repeat an action, don’t keep the charger busy too long, pick up before you deliver.
The open constraints in the release express rules like these, posted once and applied to every new position.
rel(*this, actions, IRT_NQ); // no immediate repeats
sequence(*this, actions, IntSet(Charge, Charge), 4, 0, 3); // at most 3 charges in 4
precede(*this, actions, PickUp, Deliver); // pick up before delivering
distinct(*this, jobs); // each job at most once
sliding_sum(*this, loads, 4, 0, 6); // load in each window of 4
The last three assume other open lists, of jobs, loads, and battery levels.
Side rules can change which plans exist at all.
For the robot, forbidding immediate repeats leaves no plan, since a single charge never pays for the trip there and back, while at most three charges in every window of four removes the two longer plans and keeps the nine-action one.
What makes these constraints different from their closed versions is the positions that do not exist yet.
sequence
and
sliding_sum
only count complete windows, so a plan shorter than the window is unrestricted.
distinct
remembers the assigned values and removes them from positions created later.
min
and
max
can only bound the result from one side while the list is open, since a later position can still lower the minimum or raise the maximum.
The fifteen-puzzle is the classic test problem for heuristic search, with far too many boards for a table or an automaton.
Fifteen numbered tiles and a blank occupy a four-by-four board, and a move slides a tile next to the blank into the blank.
The goal has the tiles in order, with the blank at the bottom right.
This board needs two moves: slide tile 14 left, and then tile 15.
Click a tile beside the blank to slide it. With the board focused, arrow keys move the blank.
Seen from the blank, it moves right twice, so a plan can be described by the successive positions of the blank.
Gecode’s
fifteen-puzzle.cpp
uses two open lists:
path[i]
is the cell of the blank in board
i
, and the sixteen entries from
tiles[16*i]
are board
i
, with 0 for the blank.
Only
path
has a transition callback, which creates the board for each new blank position.
tiles(*this,IntSet(0,15),16*(opt.limit()+1)),
path(*this,IntSet(0,15),
[](Space&home, OpenIntVarListx, inti) {
static_cast<OpenPuzzle&>(home).transition(x,i);
},opt.limit()+1)
The constructor body ties the two lengths together, fixes the first board, and bounds the length from below.
rel(*this,tiles.length() ==16*path.length());
IntVar start = path.get(*this,0);
post_start(*this,state(0),start,initial);
rel(*this,path.length() >=manhattan(initial)+1);
The Manhattan distance, the sum of each tile’s distance to its goal cell, is a lower bound on the number of moves, so propagation creates several boards before any move is chosen.
Each new blank position materializes its board, connects it to the previous one, and posts the goal, just like the robot’s
step
.
Every board is a permutation of the tiles, so an assigned path determines all the boards, and it is enough to branch on
path
.
The example also has a fixed model,
-model fixed
, that creates every board up to the move limit and uses a branch filter so that search does not choose moves after the goal.
For a two-move solution with a limit of eight, it has nine boards where the open model has three.
Gecode 6.5.0 also includes two experimental search engines,
AStar
and
CABS
(complete anytime beam search), enabled with
GECODE_ENABLE_EXPERIMENTAL=ON
in CMake or
--enable-experimental
with Autoconf.
They work with any Gecode space, with or without open lists, and their APIs may still change.
Branch-and-bound explores depth-first, and has no idea which of the pending partial plans looks most promising.
Heuristic search estimates how good the best completion of each partial plan can be, and explores the most promising ones first.
It is also the workhorse behind many of the planning systems mentioned at the start.
The estimate must be
admissible
, never above the true cost.
For the robot, ignoring the battery gives one: after moving to the charger and charging once, two actions are used and at least five remain, a bound of seven where the true total is nine.
Both engines take a
Search::HeuristicGuidance
, whose bound callback returns an optimistic value for the
total
objective, including the cost so far, and must be exact on solutions.
For the puzzle, the bound is the number of moves made so far plus the Manhattan distance of the board they lead to.
int
depth(void) const {
int i =0;
while (i+1< path.known_length() && path[i+1].assigned())
i++;
return i;
}
int
bound(void) const {
constint g =depth();
constint h =manhattan(values(state(g)));
return std::max(g+h,path.length().min()-1);
}
depth
stops at the first undecided move, even when later boards have been created, and the length gives the bound instead when it is stronger.
Both engines use the model’s
constrain
to require improvement after each solution, so as with branch-and-bound, the first solution need not be optimal.
A* keeps every pending state.
CABS keeps only a beam of candidates at each layer of the search tree, starting with a width of one and doubling it while the discarded candidates might still lead to a better solution.
That finds a plan quickly, and spends more effort later on improving it and proving optimality.
CABS can also use a dominance test, which discards a candidate when another one can match each of its completions with one that is no worse.
Gecode’s
tsptw.cpp
, for the travelling salesman problem with time windows, offers all three engines on a closed model.
I wrote an
open-list variant
that creates each position of the tour when the tour reaches it.
Every tour visits all customers, so stating its length would create every position at the root.
Instead, the variant states the goal as a condition on the visited customers.
Both models find and prove the optimal travel times for the two built-in instances with branch-and-bound, A*, and CABS.
The instances are far too small to say which combination works best on hard problems.
Leaving future positions uncreated is a tradeoff.
They take no storage, but their domains are not available for propagation either, so a fixed-horizon model may detect some failures earlier.
My guess is that open lists pay off when a large upper bound is needed to admit all plans, while most of the search works with much shorter prefixes, but that needs measuring.
For classical planning problems, a dedicated planner will often be the better tool.
A constraint model becomes interesting when the plan also has to satisfy side constraints, like resource limits, time windows, or the rules above.
Back in the workshop, the model is the same whatever the initial charge.
With a full battery, the shortest plan is the direct four actions, and with a single unit, it is the nine-action detour.
Nobody had to guess the length of the plan in advance.
The model describes what the robot can do, and search works out how long it takes.
The exceptions are the activity-based (
Action
) and conflict-history (
CHB
) variable selectors.
They require the complete list to be materialized when the brancher is posted, so they cannot be used for positions created later.
↩
For example, callbacks run inside a
Space::NoGPI
scope, so that propagators created and discarded during search do not accumulate
global propagator information
such as the
accumulated failure count (AFC)
.
A callback can open a
Space::UseGPI
scope for postings that should be tracked as usual.
↩
Qwen 3.8 27B on my laptop can interpret model weights, too
Simon Willison
simonwillison.net
2026-11-03 11:29:48
Yesterday's hot paper was Sparks of Weight-Space Programming: LLMs can natively read & write neural network weights by Rikiya Takehi, Jayden Teoh, Alex Zhang, and Omar Khattab. The paper found that frontier models, in particular GPT-6 Astra, can both interpret and modify the raw weights of a mac...
Yesterday’s hot paper was
Sparks of Weight-Space Programming: LLMs can natively read & write neural network weights
by Rikiya Takehi, Jayden Teoh, Alex Zhang, and Omar Khattab. The paper found that frontier models, in particular GPT-6 Astra, can both interpret and modify the raw weights of a machine learning model—literally a text description of the model containing a bunch of floating point numbers. I’ve been playing with one of the examples from the paper and I’m delighted to share that Qwen 3.8 27B running on my laptop can do this as well!
Weight-Space Programming
Here’s the highlight from their abstract, describing impressive capabilities for GPT-6 Astra and coining the term
Weight-Space Programming
for when LLMs analyze and modify model weights:
Just by looking at the raw weights, GPT-6 Astra
can tell what a network was trained to do
. And without any environment feedback, it
has no trouble writing, from scratch, small game-playing networks
that outplay networks trained with PPO for 100 million steps.
Likewise, asked to make Qwen3.5-0.8B better at math without gradients, Astra
identifies an issue in its weights
causing reasoning loops that Qwen’s own
model card
warns about, and
fixes this by natively editing 0.016% of the weights
. With the same sampling settings, this weight correction raises MATH-500 from 7.9% to 48.1% and generalizes out of the box to instruction following, raising IFEval by 3x.
All of this is possible without allowing Astra to write training loops. It uses its reasoning to figure out what each part of a neural network computes, or should compute, and changes the weights accordingly. We call this
Weight-Space Programming
.
The paper combines two topics that I think deserve to be treated separately. The first is what models can do with raw weights
without
running tools or executing code. The second explores how well models, once armed with code, can run operations to update and improve other models.
I’m going to focus on the no-tools question, which I think is the more interesting of the two.
The paper presents the first question as
Can LLMs understand model behaviors from weights?
They trained four neural networks to play simplified 10x10 grid versions of four classic computer games—Breakout, Pong, Pac-Man, and Freeway (I had
to look that one up
, it’s an Atari 2600 game from 1981). Then they fed those weights (as floating point numbers) to an LLM along with the following question:
The weights below belong to one policy network that was trained with reinforcement learning to play a game on this grid. Which game was it trained on? Work from the weights. You have no tools: no code execution, no calculator, nothing to run. This is a single response.
I checked and, aside from the weights, each prompt is identical to the others.
Trying it out with Qwen 3.8 27B and other models
The prompts on GitHub are self-contained. My
LLM
tool has a
-f/--fragment
option which can be passed the URL to a text file to use as a prompt, which means I can run any of the above like this:
This example requires the
llm-openrouter plugin
installed, and runs the Breakout prompt against Kimi K3.1 Pro via OpenRouter. Here’s
what I got back from Kimi K3.1 Pro
, which successfully guessed Breakout after 9m 41s and 19,493 reasoning tokens.
But how about
Qwen 3.8 27B
? That’s still my favorite model to run on my own laptop—it’s just 17GB (I use
this version
) and somehow feels close to the leading proprietary models of 2025.
I fired up
LM Studio
, ensured Qwen 3.8 27B was loaded with a long context window (the default 8192 context failed with errors), installed the
llm-lmstudio
plugin and ran this command:
Game: A simplified Pac-Man-style gridworld: an agent moves through a fixed 8x8 maze with central and corner wall blocks, moving objects/ghosts, and reward targets/pellets.
Description: The agent navigates a fixed maze-like 8x8 board, using current agent/moving-object/previous-frame cues to move through corridors, collect reward-target cells, and avoid moving objects or hazards.
Confidence: 72%
This is impressive. I tried it on two of the other games as well. It
identified Pong
(
reasoning
) in 1h 4m 54s:
Pong
— specifically a Pong-like paddle/ball game where the agent controls a vertical paddle on the right side and must move up/down to intercept or return a moving ball/reward object.
Description:
The agent moves a right-side paddle vertically to hit or catch a moving ball-like reward target moving across the 8×8 field, while a left-side moving object/opponent and wall borders define the play; reward is obtained by successfully intercepting/returning/scoring the ball, and missing or failing to hit it is penalized.
Game: Breakout, or an Arkanoid-like paddle/ball/brick game.
Description: The agent is a paddle on the bottom row and moves left/right to keep a ball in play; the ball moves around the upper grid, and bricks/reward targets in the top rows give reward when hit, while missing the ball/hitting the bottom wall ends the episode or gives penalty.
Confidence: 88%
Qwen failed at the Freeway prompt, which didn’t surprise me considering that game is more obscure than the other three. Here’s
that transcript
—Qwen thought it was “A simplified Pac-Man-like grid game: agent moves 4-directionally”.
The reasoning traces are fun to skim, and almost incomprehensible. Here’s a sample:
What about agent channel0? We see some large channel0 rows near row8 col7/8 and maybe bottom? Let’s list channel0 large: line436 input435 (row8 col7 ch0) -2.107,1.169,0.513...; line441 input440 (row8 col8 ch0) -0.376,0.010,1.564,3.855...; line445 input444 (row8 col8 ch4) 0.142,0.491...; line382? input381 ch0? Wait line382 input381: 381//5=76 (row7 col6), ch1? 381%5=1? 76 * 5=380, ch1. So not. Channel0 large maybe at row8 col7/8 only. Also top row? line44 input43 ch3, line49 ch3. Channel0 large maybe not many. Agent position could be near bottom-right? If the agent is typically at bottom-right?
That said though, I expect a sufficiently experienced human being armed with a notepad and a pencil could get there with enough effort.
It’s a cool paper, but some of the wider commentary I’ve seen around it does not feel justified. I’m not ready to declare that the age of source code is over and our future involves incomprehensible machines editing their own model weights in incomprehensible ways.
[$] LLM reviews for Debian's new queue spark debate
Linux Weekly News
lwn.net
2026-11-03 11:28:40
The Debian project has wrestled with the topic of LLM usage for years, which
culminated in a general-resolution
vote this August. The project voted in favor of the fifth, out of
eight, option: "Responsible Use of
Generative AI". With the door open to LLM use, the DFSG, Licensing & New Packages
T...
The page you have tried to view (
LLM reviews for Debian's new queue spark debate
) is currently available to LWN
subscribers only.
Reader subscriptions are a necessary way
to fund the continued existence of LWN and the quality of its content.
If you are already an LWN.net subscriber, please log in
with the form below to read this content.
Please consider
subscribing to LWN
. An LWN
subscription provides numerous benefits, including access to restricted
content and the warm feeling of knowing that you are helping to keep LWN
alive.
(Alternatively, this item will become freely
available on November 12, 2026)
Two months ago
, we
turned
compfuck
back into an interpreter and wrote a specializer that, given a Brainfuck
program, folded the interpreter away and left behind the operations we
couldn’t specialize. That’s the first Futamura projection, which is what
I likened compfuck to historically in lazy shorthand. If you missed the
article and this whole paragraph refuses to make sense to you, start
there!
Of course, that article was only the first step. We’re not done with
our Origami piece.
Specifically, we ended up with a way to obtain compiled programs
without writing instruction translations by hand. That’s great, but we
still ran the specializer on every single program, walking through the
interpreter’s source each time. The specializer and the interpreter were
always the same, though, we just had a different Brainfuck program. This
is wasteful and we can do better.
You might also have a hunch about how to deal with this now: if part
of the input is fixed, we can specialize. And the second Futamura
projection does exactly that to the specializer itself:
Fig. 1: Specializing a specializer to an interpreter.
We feed the specializer to itself, with the interpreter as its known
input. What comes out is a program that takes a Brainfuck program and
produces the residual code directly, without ever executing the
interpreter. That’s a compiler, delightfully weird.
It might sound like a parlor trick, and it took me a while to believe
it would produce anything sensible, even after the time it took for me
to understand it. But it does work, and the compiler we get at the end
looks a lot like the one I wrote by hand years ago. Let’s see how we get
there.
Why our old specializer won’t
do
To specialize a program, the specializer has to understand it. Our
old specializer understood exactly one program, the interpreter. For
instance, it knew that
p
and
i
were static and
that every
if
and
let
belonged to the source
traversal. We decided a whole bunch of things by hand, basically making
a mini DSL for Carp-like sources.
This won’t scale to the specializer itself. It has static and dynamic
parts mixed in a bunch of places, it calls helper functions, and its
recursive calls don’t all terminate if you naively unfold them. So the
first step is to write a specializer that is general enough to
specialize itself, without tricks this time.
There is a second, sneakier problem I glossed over a bit last time,
because I wasn’t quite sure yet how to solve it when I wrote that piece:
the old specializer evaluated static expressions by handing them to
Carp’s
eval
. If we specialize that, the best we can do is
leave a call to
eval
in the output, and our “compiler”
would still interpret pieces of the interpreter at compile time. To get
rid of that, the specializer needs to evaluate static code itself, in a
way that can be specialized in turn. If that doesn’t make sense yet, no
worries. It’s easier to show than to tell.
Just one more thing before we continue, though, because I want to be
honest: for the purposes of this tutorial, I opted not to make this an
absolutely generic implementation of the second Futamura projection.
We’ll still cut corners where it’s expedient without undermining the
conceptual purity. I’ll also call it out when it happens.
An introspective specializer
Last time,
definterpreter
stored the interpreter’s body
as metadata. Now a macro called
remember
stores the
parameters as well, and
defmix
—
mix
is the name
handed down by the forebears of this technique—does the same for the
specializer’s functions and collects them in a list. That list is the
specializer as a program. The bracket search is stored like the
interpreter, so the interpreter is now a program with two functions, an
interpreter loop and a helper function.
Carp expands macros before the body gets stored, so
case
,
cond
,
and
, and
or
arrive as
if
s and
let
s
1
. Our specializer only has
to understand
if
,
let
with a single binding,
quote
, function calls, and a handful of primitives. It’s
basically a small Lisp, and the specializer is written in it, too (sans
the macro’s syntactic sugar).
Which bits are static?
We keep last time’s split into static
p
and
i
and dynamic
t
and
h
, but
replace the hand-made decisions with a rule:
Fig. 2: Does an expression use any of these variables?
An expression that doesn’t mention any
dynamic
variables can
be evaluated during specialization, and an expression that doesn’t
mention any
static
variables has nothing to specialize, so we
leave it alone. Everything else gets taken apart.
The rule is purely syntactic, so it has plenty of blind spots. An
expression that only mentions static variables gets run during
specialization even if it has side effects. Neither of our programs has
one, so we’ll leave it at that. Its semantic generalization is left as
an exercise to the reader.
Our very own evaluator
Before we can fold things, we have to evaluate.
Last time,
known
handed static expressions to
eval
. We need to get rid of that
eval
, though,
so we write an evaluator in and for our small Lisp:
The primitives are what both programs need: a few list operations,
comparison, a bit of arithmetic, and string access. Anything else,
including the specializer’s own helpers, is a function in the program
and gets evaluated from its source. We cheat a bit here, and map this
Lisp’s operations one-to-one to Carp, which is nice, because it’s
trivial, but also a bit horrendous, because, well, look at the code.
Last time’s bindings array is now split into
names
and
vals
. When we specialize the specializer,
names
is known and
vals
is not, so a lookup
like
(index-of e names)
happens ahead of time and only
(List.nth vals 2)
is left over. With names and values in
one list, every lookup would have to search at compile time.
To see this in action, here is the body of
ev
specialized to the expression
(+ i 1)
, with
i
static:
Fig. 5: An evaluator, specialized away.
The evaluator is gone. What’s left is the expression itself, reading
i
from whatever slot the compiler keeps it in. The dispatch
over primitives disappeared, because which primitive we apply is
known.
If you take only one thing away from this post, it should probably be
Figure 5. It’s our whole trick! But we’re not done yet.
Walking the code
The specializer proper is called
mix
(a nod at those
before us, again). It takes the program, the variables, an expression,
and the environment (as two lists), and returns residual code:
Again: quite a lot of
car
ing and
cdr
ing, so
let’s take it slow.
The first two lines are the rule we mentioned above. Code without
static variables is returned as-is. Code without dynamic variables gets
evaluated, and
lift
turns the value back to code, quoting
it if necessary.
memo
is a special case that calls
mix-memo
.
We’ll defer it one more time.
The rest are the same branches as last time, except that an
if
only picks a branch if its condition is static, and
calls to functions in the program are unfolded. It looks quite odd, but
if you squint, you might see the resemblance.
Unfolding and a stop
condition
unfold
is the unfolding of the interpreter’s recursive
call we had last time, but generalized for any function in the
program:
Let’s start at the bottom this time, in the catch-all call to
list
. It means that dynamic arguments get a
let
. This happens unless the caller passes a variable of
the same name (condition just above).
Last time we needed to insert fresh names here, but our interpreter
always passes
t
and
h
on unchanged, so with
the condition above we just skip the
let
entirely
2
.
But there’s that
memo
thingie again. What is it?
When the specializer runs normally,
memo
is the identity
function and does nothing.
Fig. 8:
memo
in our regular world.
But as we saw above, when the specializer reads a call wrapped in
memo
, it calls
mix-memo
instead.
mix-memo
doesn’t unfold. Instead, it generates a
separate function specialized to the call’s static arguments, remembers
it, and emits a call to that function.
We need this because of what happens when the specializer specializes
itself. When we unfold
mix
on the interpreter’s body and
reach the interpreter’s recursive call,
unfold
calls
mix
on the interpreter’s body again. With the interpreter’s
source known, that is the same specialization we started with, and
unfolding it would go on forever. The interpreter never had this
problem, because each of its recursive calls moved to a new, known
position in the Brainfuck program. Here, we need an explicit base case
marker.
The same happens in
ev
. When we specialize the
evaluator, it meets calls whose arguments aren’t known yet, like the
bracket search. Unfolding those wouldn’t stop either, so they get their
own functions as well.
And that’s the whole reason
memo
appears in the
recursive and mutually recursive cases that are not clearly reductive.
Once we’ve seen a call before and specialized it, we just emit a call to
the already known name, closing the loop.
Deciding where to place these markers is, as far as I understand, one
of the harder problems in partial evaluation. I put the two we need
there by hand. Doing this automatically is, say it with me now, left as
an exercise to the reader.
Two projections
We are ready to project now! The first one, with the new
specializer:
(mix interpreter '(t h) (caddr (car interpreter)) '(p i) (list",[.-]"0)); => (do (Array.aset! t h (IO.Raw.get-char)); (do (while (/= (ref 0) (Array.unsafe-nth t h)); (set! h (do (IO.print (ref (str (Char.from-int (copy (Array.unsafe-nth t h)))))); (do (Array.aupdate! t h (ref (fn [x] (max 0 (Int.dec x))))) h)))); h))
Fig. 10: The first projection, again.
Alright, looking “good”. Looks like the specializer is working. But
that’s the easy case, right?
For the second case, we hand the specializer to itself.
residual
is the function behind
memo
. It
specializes a function in a program to values for some of its
parameters.
Here the program is the specializer, the function is
mix
, and the known values are the interpreter, its dynamic
variables, its body
e
, and the
names
(
p
and
i
).
The only thing left unknown is the values of
p
and
i
.
Two functions come out. The first is the compiler, and I’ll give it
to you lightly abridged and re-indented, but true to its mindboggling
form:
This takes some squinting (your eyes must be tired by now), but bear
with me.
vals
starts out as the program and the position.
Each
let
in the interpreter
cons
es its value
onto the front, so after the first one,
(List.nth vals 0)
is the current character
3
.
The first lines check for the end of the program and a closing
bracket, and return the symbol
h
. Then we dispatch on the
character, and each branch returns a quoted piece of code:
+
returns the tape update,
>
returns
(set! h (+ h 1))
, and so on. The loop builds a
while
around a recursive call that compiles its body.
Finally, we compile the rest of the program, and put both into a
do
. Easy-peasy, or something like that.
search-matching-bracket
wasn’t even in our list of
required parts. During the first projection, our evaluator runs it from
source. When we then specialized the specializer, the evaluator got
specialized to its body, and it spit out a compiled version.
The interpreter is gone, and so is the specializer. There is no
machinery, no
ev
,
mix
or source walks. What’s
left is a function from Brainfuck to Carp that dispatches on characters
and returns quoted code.
What’s funky to me is that here is the core of the compiler I wrote
by hand
back in 2019
:
(defndynamic compile-compf-char [c s i] (case c\+ (list1 '(Array.aupdate! &t h &(fn [x] (mod (Int.inc x) 255))))\- (list1 '(Array.aupdate! &t h &(fn [x] (max0 (Int.dec x)))))\> (list1 '(set! h (+ h 1))); ...
Fig. 14: Our hand-written compiler.
It’s the same idea! Across two blog posts, we started with that
compiler that I got from hand-dynamicizing an interpreter, turned it
back into an interpreter, and specialized our way back to it.
It took a lot more machinery than writing it by hand, but it
automatically determined which code to emit for each character. And
that’s our origami in its full glory!
Fin
This was quite a bit more work than the first projection.
It’s not even completely general, some of the decisions are still
mine: which variables are static, which primitives exist, and where to
put
memo
all needed a guiding hand in our implementation
(though as I alluded to, they’re not insurmountable). We also make a
bunch of assumptions about the code playing nice and coloring inside our
lines, which we probably shouldn’t in the real world.
But I find it remarkable that it works at all! We wrote an
interpreter and a specializer. Neither of them knows anything about
compiling Brainfuck. But feed one to the other, and a compiler just
falls out, plus a bracket search that was needed but didn’t get asked
for.
There is, of course, a third projection, where we specialize the
specializer to itself and get a program that turns interpreters into
compilers. I’m not going to promise anything. Our specializer would have
to unfold its own memo machinery, and I have a feeling that would get
ugly quick. This implementation also already took twice as long to make
as the last one (figuring out how to make it explainable was most of the
work), and I might not have enough time on my hands for more card
tricks. But maybe I do.
See you soon!
Footnotes
1.
Last time I said that the stored source is the
interpreter before Carp expands it, but that wasn’t true. Carp expands
the macros in the code a macro returns before running it, and that
includes the body we hand to
meta-set!
. Whoops. Our old
specializer handled that just fine, it simply never entered its
case
branch and I didn’t notice.
2.
Strictly speaking, the unfolded code now
shares
h
with its caller, and an assignment inside it
changes the caller’s
h
. That’s fine for our interpreter,
because every call hands its
h
back and the caller
continues with that. We could also just bind it again, but
(let [h h] ...)
compiles to
int h = h;
, which
C rightfully rejects. That’s why last time’s version went through a
gensym
, but we can just avoid the whole
let
instead!
3.
The third
let
is the one from the
expanded
case
statement, which binds the current character
once more. That’s why the dispatch reads
(List.nth vals 0)
again after it.
QUILICURA, CHILE SITS WITHIN THE MAIPO RIVER BASIN, ONE OF THE MAIN
SOURCES OF WATER FOR PEOPLE AND FARMING. SINCE THE EARLY 2010s,
QUILICURA HAS BECOME A MAJOR HUB FOR A.I. DATA CENTERS THAT USE
LARGE AMOUNTS OF WATER TO COOL DOWN SERVERS. BECAUSE OF THAT,
COUPLED WITH AN ONGOING CLIMATE CRISIS, CHILE IS FACING A SEVERE
DROUGHT EXPECTED TO LAST UNTIL 2040.
[Becoming AI for a Day]
Even though A.I. can move mankind ahead, the irresponsible use of
A.I. can have disastrous effects on our water and other resources.
It is inconceivable to think that someone casually using A.I. to
create funny images in NYC or Berlin, can affect the water supply in
Quilicura, Chile.
To make the impact visible, and to help draw visibility to the
problem, the residents from Quilicura became “human A.I.,” for a
day. Answering prompts, creating content with local artists, and
completing other tasks manually.
The initiative helped dimensionalize a complex problem, and helped
show the world the real people affected by the the irresponsible use
of A.I. and the hidden cost it has on local water resources.
Show HN: Interactive notes on RLHF, attention, LoRA and LLM evals
Engineering ideas you understand by changing the inputs.
This page needs JavaScript.
The New York Times (et al.) Sues Brave for Copyright Infringement, Selling Scraped Content to AI Companies for Model Training
Daring Fireball
www.theverge.com
2026-11-03 10:46:25
Jay Peters, The Verge:
The New York Times and a group of other publications have filed
lawsuits against the company that makes the Brave
web browser over alleged unlawful scraping to train AI and also
letting users bypass their paywalls, [as reported by Reuters]nyt
brave-2.
According to a compl...
The New York Times
and a group of other publications have
filed lawsuits
against the company that makes the Brave web browser over alleged unlawful scraping to train AI and also letting users bypass their paywalls,
as reported by
Reuters
.
According to
a complaint
filed by the
New York Daily News
, the
Chicago Tribune
, and the
Orlando Sentinel
, Brave Software has monetized its index of scraped websites by, in part, providing AI companies with paid access to “real-time online content from the Brave Index.” The AI companies then use that index to train their models, access content to “respond to specific user queries,” or both. Brave has allegedly provided “stolen copyrighted content” to “many” AI companies including Anthropic, Perplexity, Mistral, xAI, and Cohere.
Brave also promotes “hundreds of top publishers” as being accessible through its “Paywall blocker” feature in its browser.
“Brave has never asked for the Publishers’ permission to access their websites, much less to copy the material and provide it to users or other AI companies,” the complaint says. “On the contrary, as noted above, Brave allows its users to bypass the Publishers’ paywalls without their consent, and has taken other steps that prevent the Publishers from blocking Brave’s access to the Publishers’ websites. Brave has never compensated the Publishers for the unlawful use, copying, and distribution of the Publishers’ copyrighted content.”
“While we believe in the ethical and responsible use and development of AI, Brave has flouted established copyright law and ignored repeated requests by The Times to stop its infringing conduct,” Graham James, an
NYT
spokesperson, says in a statement to
The Verge
. “We filed this lawsuit to hold Brave accountable for stealing our content to power its own products and to provide it to some of the most prominent and well resourced generative AI companies in the world.”
“AI giants are now desperate to avoid getting caught red-handed stealing news from publishers, so Brave Software is selling them a back door to the journalism they know they have no right to,” says Steven Lieberman, the attorney who filed the lawsuit on behalf of the other three publications. “Buying stolen goods secondhand doesn’t make them legitimate. Brave must be held responsible for laundering pirated reporting for the AI industry.”
Brave, Anthropic, Mistral, SpaceXSI, and Cohere didn’t immediately reply to a request for comment. “
The New York Times
is overpaying its attorneys and underpaying its journalists. (Who could’ve easily identified the disinformation in this suit.)” says Jesse Dwyer, Perplexity’s chief communications officer.
Update, November 2nd
: Clarified that one lawsuit was filed by
New York Daily News
, the
Chicago Tribune
, and the
Orlando Sentinel
, not the companies that run them. Also added a statement from the attorney who filed the lawsuit on behalf of those publications.
Follow topics and authors
from this story to see more like this in your personalized homepage feed and to receive email updates.
Jay Peters
Steve Jobs on His Final Quarterly Analyst Call: ‘We Think the Open Versus Closed Argument Is Just a Smokescreen’
Daring Fireball
www.macworld.com
2026-11-03 10:40:34
After linking to it earlier today, I re-read Steve Jobs’s remarks from his last appearance on a quarterly analyst call. It’s a banger of a good read:
You know, even if Google were right, and the real issue is
“closed” versus “open,” it is worthwhile to remember that open
systems don’t always win...
Hi, everybody. As most of you know, I don’t usually participate in Apple earnings calls, since you’re all in such capable hands with Peter and Tim. But I just couldn’t help dropping by for our first 20-billion-dollar quarter. I’d like to chat about a few things, and then stay for the rest of the Q&A, if that’s all right.
First, let me discuss iPhone. We sold 14.1 million iPhones in the quarter, which represents a 91 percent unit growth over the year-ago quarter, and was well ahead of IDC’s latest published estimate of 64 percent growth for the global smartphone market in the September quarter. And it handily beats RIM’s 12.1 million BlackBerrys sold, in their most recent quarter ending in August.
We’ve now passed RIM. And I don’t see them catching up with us in the foreseeable future. They must move beyond their area of strength and comfort, into the unfamiliar territory of trying to become a software platform company. I think it’s going to be a challenge for them to create a competitive platform and to convince developers to create apps for yet a third software platform after iOS and Android. With 300,000 apps on Apple’s App Store, RIM has a high mountain ahead of them to climb.
Google
But what about Google? Last week, Eric Schmidt reiterated that they are activating 200,000 Android devices per day, and have around 90,000 apps in their app store. For comparison, Apple has activated around 275,000 iOS devices per day on average for the past 30 days, with a peak of almost 300,000 iOS devices per day on a few of those days. And Apple has 300,000 apps on its App Store.
Unfortunately, there is no solid data on how many Android phones are shipped each quarter. We hope that manufacturers will soon start reporting the number of Android handsets they ship each quarter, but today that just isn’t the case. Gartner reported that about 10 million Android phones were shipped in the June quarter, and we await to see if iPhone or Android was the winner in this most recent quarter.
Google loves to characterize Android as “open,” and iOS and iPhone as “closed”. We find this a bit disingenuous, and clouding the real difference between our two approaches. The first thing most of us think about when we hear the word “open” is Windows, which is available on a variety of devices. Unlike Windows, however, where most PCs have the same user interface and run the same apps, Android is very fragmented. Many Android OEMs, including the two largest, HTC and Motorola, install proprietary user interfaces to differentiate themselves from the commodity Android experience. The user’s left to figure it all out. Compare this with iPhone, where every handset works the same.
Twitter client [TweetDeck] recently launched their app for Android. They reported that they had to contend with more than a hundred different versions of Android software on 244 different handsets. The multiple hardware and software iterations present developers with a daunting challenge. Many Android apps work only on selected Android handsets, running selected Android versions. And this is for handsets that have been shipped less than 12 months ago! Compare this with iPhone, where there are two versions of the software, the current and the most recent predecessor, to test against.
In addition to Google’s own app marketplace, Amazon, Verizon, and Vodafone have all announced that they are creating their own app stores for Android. So there will be at least four app stores on Android, which customers must search among to find the app they want, and developers will need to work with to distribute their apps and get paid. This is gonna be a mess for both users and developers.
Contrast this with Apple’s integrated App Store, which offers users the easiest-to-use largest app store in the world, preloaded on every iPhone. Apple’s app store has over three times as many apps as Google’s marketplace, and offers developers one-stop shopping to get their apps to market easily, and get paid swiftly.
You know, even if Google were right, and the real issue is “closed” versus “open,” it is worthwhile to remember that open systems don’t always win. Take Microsoft’s “Plays For Sure” music strategy, which used the PC model—which Android uses as well—of separating the software components from the hardware components. Even Microsoft finally abandoned this “open” strategy in favor of copying Apple’s integrated approach with their Zune player, unfortunately leaving their OEMs empty-handed in the process. Google flirted with this integrated approach with their Nexus One phone.
In reality, we think the open versus closed argument is just a smokescreen to try and hide the real issue, which is, “What’s best for the customer – fragmented versus integrated?” We think Android is very, very fragmented, and becoming more fragmented by the day. And as you know, Apple strives for the integrated model so that the user isn’t forced to be the systems integrator. We see tremendous value at having Apple, rather than our users, be the systems integrator. We think this a huge strength of our approach compared to Google’s: when selling the users who want their devices to just work, we believe that integrated will trump fragmented every time.
And we also think that our developers could be more innovative if they can target a singular platform, rather than a hundred variants. They can put their time into innovative new features, rather than testing on hundreds of different handsets. So we are very committed to the integrated approach, no matter how many times Google tries to characterize it as “closed.” And we are confident that it will triumph over Google’s fragmented approach, no matter how many times Google tries to characterize it as “open.”
Tablets
Second, I’d like to comment on the “avalanche” of tablets poised to enter the market in the coming months.
First, it appears to be just a handful of credible entrants, not exactly an avalanche.
Second, almost all of them use seven-inch screens, as compared to iPad’s near 10-inch screens. Let’s start there.
One naturally thinks that a seven-inch screen would offer 70 percent of the benefits of a 10-inch screen. Unfortunately, this is far from the truth. The screen measurements are diagonal, so that a seven-inch screen is only 45 percent as large as iPad’s 10-inch screen. You heard me right: just 45 percent as large.
If you take an iPad and hold it upright in portrait view, and draw an imaginary horizontal line halfway down the screen, the screens on these seven-inch tablets are a bit smaller than the bottom half of the iPad’s display. This size isn’t sufficient to create great tablet apps, in our opinion.
While one could increase the resolution of the display to make up some of the difference, it is meaningless unless your tablet also includes sandpaper, so that the user can sand down their fingers to around one-quarter of their present size.
Apple has done extensive user testing on user interfaces over many years, and we really understand this stuff. There are clear limits of how close you can physically place elements on a touchscreen before users cannot reliably tap, flick or pinch them. This is one of the key reasons we think the 10-inch screen size is the minimum size required to create great tablet apps.
Third, every tablet user is also a smartphone user. No tablet can compete with the mobility of a smartphone. Its ease of fitting into your pocket or purse. Its unobtrusiveness when used in a crowd. Given that all tablet users will already have a smartphone in their pockets, giving up precious display area to fit a tablet in their pockets is clearly the wrong trade-off.
The seven-inch tablets are tweeners: too big to compete with a smartphone, and too small to compete with an iPad.
Fourth, almost all of these new tablets use Android software, but even Google is telling the tablet manufacturers not to use their current release—Froyo—for tablets, and to wait for a special tablet release next year. What does it mean when your software supplier says not to use their software in your tablet, and what does this mean when you ignore them and use it anyway?
Fifth, iPad now has over 35,000 apps on the App Store. This new crop of tablets will have near zero.
And sixth and last, our potential competitors are having a tough time coming close to iPad’s pricing, even with their far smaller, far less expensive screens. The iPad incorporates everything we’ve learned about building high-value products, from iPhones, iPods and Macs. We create our own A4 chip, our own software, our own battery chemistry, our own enclosure, our own everything. And this results in an incredible product at a great price.
The proof of this will be in the pricing of our competitors’ products, which will likely offer less, for more. These are among the reasons that we think that the current crop of seven-inch tablets are going to be DOA—Dead on Arrival. Their manufacturers will learn the painful lesson that their tablets are too small, and increase the size next year, thereby abandoning both customers and developers who jumped on the seven-inch bandwagon with an orphaned product. Sounds like lots of fun ahead.
iPad and cannibalization
The iPad is clearly gonna affect notebook computers. And I think the iPad proves it’s not a question of if, it’s a question of when. And there’s I think a lot of development and progress over the next few years. But we’re already seeing tremendous interest in iPad from education and, much to my surprise, from business. We haven’t pushed it real hard in business, and it’s being grabbed out of our hands. And I talk to people every day in business, in all kinds of businesses, that are using iPads. All the way from boards of directors that are shipping iPads around instead of board books, down to nurses and doctors and hospitals, and other large and small businesses.
So the more time that passes, the more I am convinced that we’ve got a tiger by the tail here,and this is a new model of computing which, you know, we’ve already got tens of millions of people already trained on with the iPhone. And that lends itself to lots of different aspects of life, both personal, educational, and business. So I see it as very general purpose, and I see it as really big. And the timing, one could argue about the timing endlessly, but I don’t think one could argue that it’s gonna happen anymore.
[Q: You think this could be your second biggest business behind iPhone?]
I try to not predict, I try to just report, so we’ll keep you posted. As you know, we’re already shipping more of them than Macs after just a few quarters.
[Q: Any updates on your stance on Flash?]
Flash memory? We love flash memory.
[Q: You are the tablet market right now… This is the second time you’ve come on to talk about competition, and I’m just wondering if much like Apple encroaching on RIM’s monopoly in enterprise, if you think Apple is gonna be able to sustain share growth for tablets amid some of those new competitive headwinds. Some of those players may try different things and strategies, like tethering and Flash, multitasking, less content and app restrictions, and subsidized pricing. Just wondered if you think that may create itself a more fragmented market.]
I have a hard time envisioning what those strategies you mentioned are. In terms of pricing, so far the little we’ve seen, the tablets with far less functionality are having a hard time matching us in price. Flash hasn’t presented any problem at all—as you know, most of the video on web is now available in HTML5. And having the iTunes media store and over 35,000 apps on the App Store for iPad dwarfs anything else. And we think we have a very good product here that’s gonna be hard to match, and we’re not done, we’re working on a lot of things for the future. So I don’t know what exactly these strategies are, and we’ve priced iPad pretty aggressively. So we’re out to win this one.
[Q: Is the phone market a zero-sum game?]
As you know, the largest market of phones today around the world are non-smartphones. And so over the next several years, many of those non-smartphones are going to convert to smartphones. And the pie is gonna continue to grow. And I think there’ll be room for some number of companies to be successful, but eventually as most of those phones do convert to smartphones, it will turn into a zero-sum game, or at least a lot closer to that. I think right now it’s a battle for the mindshare of developers and for the mindshare of customers, and right now iPhone and Android are winning that battle.
[Q: What are your thoughts about Apple TV and how it’s going, since it seems to be on a streaming model now.]
We have gone to a streaming model on Apple TV. It’s complete streaming. So all the content is rented from the iTunes store, or is streamed from your computer, or soon to be streamed from your iPhone or iPad with AirPlay. And so how our new model of Apple TV doing? Well, I can report that in just a very short amount of time we’ve already sold a quarter million of them. Over 250,000. And we’re thrilled with that. I think that it’s a great product, and I think that its $99 price point is very enticing, and I think that when we get the AirPlay stuff in place before the end of this year, it’s gonna give another big reason for people to buy it. So we’re happy with how it’s turned out.
[Q: Biggest risks?]
Our goal is to make the best devices in the world, not to be the biggest. As you know, Nokia’s the biggest. And we admire them for being able to ship the number of handsets that they do. But we don’t aspire to be like them. They’re good at being like them. We want to be like us. And we want to make the best ones.
So, you know, in our part of the market Android is our biggest competitor. They outshipped us in the June quarter as we were transitioning to iPhone 4, they outshipped us for the first time according to Gartner’s numbers, which we think are pretty accurate. And so we’re waiting to find out what happened in this quarter. And we’ll find out—I don’t know how we’ll find out, but Gartner will put out some new numbers, and maybe others will, and so one of these days we’ll eventually learn. And I imagine we’ll be competing with them for quite some time, but we have very different approaches. And we believe in our approach very strongly: providing users products that just work. And we think there’s lots of users that want that, in the world. And their approach is very different from that. And there may be lots of users that want their approach as well, but we’re going to pursue ours, and we think that’s the winning approach in the end.
[Q: Market share question.]
Nokia makes $50 handsets, and we don’t know how to make a great smartphone for $50. We’re not smart enough to have figured that one out yet, but believe me I’ll let you know when we do. And so our goal is to make really breakthrough great products, make the best products in every industry that we compete in, and to drive the cost down while constantly making the products better at the same time. That’s what we did with iPod. We updated our products many times every year with better functionality, often times at same price and sometimes at a lower price. And it was the relentless improvement at in some cases a lower price, that was able to beat our competition and yield the market share that it did.
And as you know we have a very low market share in the phone market, in the single digits, in terms of all the handsets. And we have a very high market share now in tablets, because we’re the first mover. But we don’t think about it that way.
The reason we wouldn’t make a seven-inch tablet isn’t because we don’t want to hit a price point, it’s because we don’t think you can make a great tablet with a seven-inch screen. We think it’s too small to express the software that people want to put on these things. And we think, as a software-driven company, we think about the software strategies first. And we know that software developers aren’t going to deal real well with all these different sized products, when they have to re-do their software every time a screen size changes, and they’re not going to deal well with products where they can’t put enough elements on the screen to build the kind of apps they want to build.
So when we make decisions on seven-inch tablets, it’s not about cost, it’s about the value of the product when you factor in the software. You see what I’m getting at? So we’re all about making the best products at aggressive prices. And that’s what we will do. And that’s what we’ve done with the iPod, and that’s what we will do with the iPad as well.
You’re looking at it wrong. You’re looking at it as a hardware person in a fragmented world. You’re looking at it as a hardware manufacturer that doesn’t really know much about software, who doesn’t think about an integrated product but assumes the software will somehow take care of itself. And you’re sitting around saying, well, how can we make this cheaper? Well, we can put a smaller screen on it, and a slower processor, and less memory, and you assume that the software will somehow just come alive on this product that you’re dreaming up, but it won’t. Because these app developers have taken advantage of the products that came before, with faster processors, with larger screens, with more capabilities that they can take advantage of to make better apps for customers. And they’re not… it’s a hard one, because it throws you right back into the beginning of that chicken-and-egg problem again, to change all the assumptions on these developers. Most of them will not follow you. Most of them will say, “I’m sorry, but I’m not going to write down a watered-down version of my app just because you’ve got this phone that you can sell for $50 less, and you’re begging me to write software for it.”
[Q: Why not return some of your cash to shareholders?]
We strongly believe that one or more very strategic opportunities may come along, that we are in a unique position to take advantage of because of our strong cash position. You know, we’ve demonstrated a strong track record of being very disciplined with the use of our cash. We don’t let it burn a hole in our pocket, we don’t allow it to motivate us to do stupid acquisitions. And so I think that we’d like to continue to keep our powder dry, because we do feel that there are one or more strategic opportunities in the future. That’s the biggest reason.
[Q: Why do you think you have an advantage on the price point for iPad versus PC manufacturers?]
I think part of it is because we engineer so much of it ourselves. The A4 chip inside it is an Apple creation. Everything from the battery chemistry to the enclosures. And we’ve learned a lot from the miniaturization we’ve done on iPods and iPhones, and we’re a very high-volume consumer electronics manufacturer. So I think we’ve learned a lot, we’ve developed a lot of our own components where others have to buy them on the market with middlemen, you know, getting their cut of things. And I think we’re systems architects and known how to build systems in a very efficient way. So I think this is a product we’ve been training for for the last decade.
The Ubuntu 26.04 Rust sudo is not compatible with standard sudo
You're probably reading this page because you've attempted to
access some part of
my blog (Wandering
Thoughts)
or
CSpace
, the wiki thing it's
part of. Unfortunately whatever you're using to do so has a HTTP
User-Agent header value that is too generic or otherwise excessively
suspicious. Unfortunately, as of early 2025 there's a plague of
high volume crawlers (apparently in part to gather data for LLM
training) that behave like this. To reduce the load on
Wandering Thoughts
I'm experimenting with
(attempting to) block all of them, and you've run into this.
All HTTP User-Agent headers should clearly identify what they
are, and for non-browser user agents, they should identify not just
the software involved but also who specifically is using that software.
An extremely generic value such as "
Go-http-client/1.1
"
is not something that I consider acceptable any more.
One specific thing is that if your HTTP User-Agent header
contains an explicit marker that you are only 'compatible' with
what your User-Agent suggests, you must include an explicit, real
URL that describes your activities or the software. A minimal HTTP
User-Agent such as 'Mozilla/5.0 (compatible; mysoftware)' is not
acceptable. The same is true if your HTTP User-Agent says that you
are a 'bot' of some sort; your bot needs a working URL explaining
itself. An email address is not sufficient in either case.
Fearing my parody lacked seriousness, I created
XSLT.RIP
to ensure the developer world was informed of Google’s
death note
. This did the trick, although a
few commenters
believed it was satire. There is subtlety to
XSLT.RIP
. The website itself is built with XSLT and when Google kills XSLT they’ll kill my website.
The web standards process and its stewards (
Big Browser
) used to adhere to a social contract. Backwards compatibility was a major design principle. Under no circumstances do you ever purposefully break the web.
XSLT.RIP
will be broken soon and I’ll sit back and watch Google break it.
17 November 2026
appears to be the date of execution. Some Chromium-based browsers have been running a
man-in-the-middle attack
by injecting propaganda into XSLT websites.
This site uses XSLT; that functionality is being removed from this browser very soon. When that happens, this page will likely no longer display correctly. You might be able to install a browser extension that allows you to continue viewing it. Otherwise, you should contact the maintainer of the site for further information.
The line of death
is another “social contract” that Google has forgotten. They’re blaming website owners and acting like questionable purveyors of free public Wi-Fi. This is arrogant and intrusive.
“contact the maintainer of the site” — you broke the web Google, own it at least.
The strongest sign of a healthy democracy is that people participate in it. It's up to you to decide who to vote for, but no matter who you support, please show up and cast a ballot. A democracy with 75% voter turnout is healthier than a democracy with 50% voter turnout even exactly the same politicians got elected, because citizens participating in a democratic process signals that they value the process and want to keep it.
(Obviously, this only applies to people eligible to vote in ongoing elections. If you're not eligible to vote, please don't vote.)
Show HN: HackerChurn – which SaaS tools HN wants to cancel
We read a sample of public Hacker News comments from the last
3
years that name software we track, and counted which ones had the most complaints. Did your least favorite platform make the list?
negative comments matched
built their own replacement
Security breaches, weak encryption and lost trust.
→
Bitwarden
Disruptive updates, poor testing and performance costs.
Slow performance, lost notes and post-acquisition decline.
Built their own ·
2
→
Obsidian
Rent inflation, price fixing and intrusive payment prompts.
Lock-in, poor quality, intrusive AI and telemetry.
Built their own ·
1
Poor quality, frustrating workflows and integration issues.
Built their own ·
5
→
Xero
Unwanted rewrites, AI focus and repetitive ads.
Intrusive popups, clunky tools and restrictive licensing.
Overblocking, traffic interception and broken workflows.
Reset feed preferences, unwanted alerts and vapid content.
Unreliable code, context limits and compliance hurdles.
Broken tooling, poor performance and unwanted features.
Unfair pricing, dark patterns and clunky interfaces.
Built their own ·
3
Clunky workflows, high costs and obscure internals.
Built their own ·
2
Lock-in, poor usability and limiting abstractions.
Built their own ·
1
→
WordPress
Unwanted upgrades, poor AI and email delivery problems.
Built their own ·
1
Security failures, high costs and integration difficulties.
Overcomplicated boards, navigation and integration issues.
Built their own ·
4
Slow interfaces, licensing restrictions and poor support.
Built their own ·
3
Pricing, signing limitations and confusing documentation.
Built their own ·
10
High costs, noisy alerts and integration limitations.
Built their own ·
1
High costs, clunky workflows and slow performance.
Built their own ·
1
Platform constraints, lock-in and confusing design.
Built their own ·
3
High costs, poor integration and security handling.
Built their own ·
7
Slow queries, complex charts and rate limits.
→
Grafana
Stalled development, outages and cumbersome tooling.
Built their own ·
7
Manual task transfers, lost context and bloated workflows.
Built their own ·
3
Poor support, limited features and frustrating site editing.
Built their own ·
2
→
WordPress
Poor usability and frustrating ticketing experiences.
→
Linear
High costs, confusing naming and false positives.
High prices, complexity and overstated automation.
Complexity, slow performance and licensing costs.
Built their own ·
4
Rigid templates, wasted time and cloud file headaches.
Built their own ·
8
→
ChatGPT
Outdated data, clutter, accuracy and usage restrictions.
Built their own ·
2
Poor overall quality and inaccurate captions.
Resume submission friction, poor screening and AI hype.
Slow, bloated software and weak engineering.
Built their own ·
1
→
Basecamp
Enterprise focus, missing features and poor performance.
Built their own ·
3
→
Linear
Cumbersome setup, bloated UX and limited flexibility.
Built their own ·
6
Scaling limits, adoption friction and administrative burden.
Built their own ·
3
→
Basecamp
High costs and lack of community contributions.
High markups, security concerns and awkward authentication.
High prices, inflexibility and excessive customization.
Built their own ·
3
→
Notion
Poor support, slow syncing, privacy and spam concerns.
Limited notifications, high costs and restrictive terms.
High prices, poor design and file privacy concerns.
Built their own ·
8
Lock-in, benchmark restrictions and failed projects.
High prices, limited features and juggling tools.
Built their own ·
3
Proxy practices and weak safeguards.
Excessive complexity, bundle bloat and poor IPv6 support.
Built their own ·
2
Limited compatibility, rough features and monitoring gaps.
Declining relevance, ownership concerns and bandwidth costs.
Weak differentiation and poor mobile layouts.
Built their own ·
3
→
Claude
Inaccurate data, AI errors and invasive profiling.
Data consistency risks and service outages.
Built their own ·
1
Blocked real emails, slow support and thin training.
Feature bloat, sync limitations and vendor dependence.
Built their own ·
1
Weak disaster planning, messy HTML and animation bloat.
Built their own ·
1
High costs, complexity, poor usability and slow innovation.
Built their own ·
4
Manual setup, complex dependencies and unsafe defaults.
Built their own ·
1
Platform control, dependence and custom store costs.
Built their own ·
5
High costs, frustrating usability and unhelpful alerts.
Built their own ·
1
Unreliable AI, API limits and cumbersome task workflows.
Built their own ·
1
High costs, generic templates and questionable incentives.
Blocked access and intrusive tracking links.
→
Substack
Lock-in, price increases and canvas design limitations.
Built their own ·
1
Inaccurate traffic data and invasive tracking.
Paywalled features, fragmented tools and intrusive branding.
Built their own ·
5
Poor support, payroll errors and premature billing.
→
ADP
Closed source, subscriptions and ineffective motivation.
Built their own ·
2
Restrictive workflows and limited features.
Sales calls, weak search, account deletion and lock-in.
Built their own ·
1
Repetitive training and obvious test phishing.
Vendor dependence and scheduling limitations.
Unwanted crawling, data use and SEO practices.
Subscription costs, lock-in and unnatural avatar behavior.
Built their own ·
3
Data logging, scraping limits and traffic costs.
Security failures and authentication outages.
High costs, lock-in and a product falling behind.
Complexity, hard setup and awkward integrations.
Complaints focus on high costs, poor support, difficult integrations, and restrictive contracts.
Built their own ·
1
→
Teams
Integration failures, outages, lock-in and high prices.
Rising contact-based pricing and steep markups.
High pricing, complexity and poor user experience.
Scaling pains, lock-in, bugs and slow support.
→
Mailchimp
High costs, complexity and slow performance.
Built their own ·
3
Overlapping subscriptions, unused seats and rigid design.
Built their own ·
2
→
Asana
Unnecessary complexity, bloat and account recovery gaps.
Built their own ·
1
Cost, limited control and intrusive popovers.
Built their own ·
1
Subscription pricing and slow feature updates.
Built their own ·
2
Limited accuracy and weak video quality.
Costs and trouble scraping protected sites.
Tedious invoicing, slow pages and extra admin work.
Login restrictions and frustrating usability.
Tools need
3
complaints from
2
threads to be listed. Source: public comments via the Hacker News search API, labeled by AI and counted. Hacker News is one source; HissingKitty reviews are another. Counts update nightly. Spot a mistake?
Tell us
.
Paying for one of these?
Add your own rating. Anonymous, unpaid, 30 seconds.
Back in 2013, three friends who loved Apple and design couldn’t find a notes app they liked, so they built their own. That side project became Bear. It arrived on the App Store in November 2016, and within a year it had been named
Mac App of the Year
and won an
Apple Design Award
. This November,
the little Bear turns 10
. Today it helps millions of people around the world capture their ideas and organize their lives every day, and we’ve felt so much love and support from all of you along the way.
Bear 1.0
2013
The idea
We couldn’t find a notes app that fit how we write, so we started building our own.
More
We built it in our spare time. Our day job back then was building apps and websites for clients.
October 2014
First prototype
Our friends loved it. Would everyone else?
November 2016
Launch day!
Bear arrives on the App Store and hits #1 on Product Hunt.
December 2016
Mac App of the Year
Apple names Bear its Mac App of the Year.
June 2017
Apple Design Award
Bear wins a 2017 Apple Design Award.
More
…and we got a selfie with Tim Cook!
2018
Project Panda
We start rewriting Bear’s editor from scratch, code name “Panda”.
More
Your feedback showed us where the original Bear was hitting its limits. Six months in, we realized we needed our own Markdown parser too, so we started over. Again.
July 2023
Bear 2 is here!
Bear 2 launches with an all-new editor and 20+ new features.
July 2025
Bear Web beta
Bear comes to your browser in public beta.
Coming soon
Bear Web
The full release of Bear Web is almost here, and we have more features brewing in house…
Bear 2.0
Over the years, one thing we hear again and again is that Bear just
feels good
to use. So for this special occasion, we want to share the principles behind every design decision we make. Along the way you’ll find some tiny details we’ve hidden all over the app (you may be using a few right now without knowing it), a peek at an idea that never shipped, and some brand new Bear swag. Grab a slice of cake and come on in!
Bear Principles
Every change in Bear goes through a long journey from first idea to final release. Big or small, visible or under the hood, they all follow the same two principles:
Bear should be delightful to use, and safe to trust.
A feeling-good experience by design
We want you to feel delighted every time you open Bear. In practice, that comes down to three things.
Normally a space before the closing asterisks breaks the style, but Bear waits a split second so you can keep typing without the bold flickering away.
(Note: If GIF is not playing, long press and select “Play Animation”)
Simple.
No sign up, no tutorial. Just open a note and write. Bear has grown much more powerful over the years, but all of that power waits quietly underneath and never gets in your way.
💡
Did you know?
To make sure Bear stays easy to use, we always ask our parents to test it first!
Natural.
We believe the best tools disappear while you use them. So we put a lot of effort into making things work exactly the way you expect, and you’ll find these quality of life touches all over the app.
Take moving lines around. Press
⌘⌥
with the up or down arrow to move the current line, which is perfect for rearranging your writing. Bear understands what you’re moving and where it’s going, so it won’t break apart a list or a table along the way. It’s one of those things that feels so obvious you’d never guess someone had to design it.
Move lines inside Bear
Rewarding to explore.
Bear has a lot of depth, but we don’t believe in pushing everything to your face to promote it because we don’t know when or if you will need them. Many of our favorite user stories start with a happy little accident. Resize an image from its corner, and it snaps to line up with the images around it; swipe left on a note on iOS, and the Info Panel slides into view. We love those “Oh wow, I didn’t expect that to work!” moments. They’re a big part of why we sign off every post with “
Happy writing
!”
Post by @TodkarR on X(Twitter)
💡
Did you know?
Some of our favorite details are so small that you may be using them without ever noticing. Here are a few to try:
✍️ Typing in bold or italic? Press Return or the same shortcut again to step right out of the style.
⌨️ Press ⌘A inside a code block to select just the code. Press it again to select the whole note.
🖱️ Select some text and type
(
,
[
,
"
or
`
. Bear wraps your selection instead of replacing it.
🔗 Select some text and paste a URL. The text becomes a link.
Built to be safe
You can’t feel truly comfortable in a space you don’t trust. Your notes hold your ideas, your plans, and sometimes things you’d never share with anyone. That’s why
safety
has shaped Bear’s most fundamental choices from the very start.
Private.
We have no servers holding your notes, and we never see what you write. We also don’t build Bear on top of third party APIs, plugins, or outside services we can’t control. If one of them changed its rules, shut down, or simply stopped working, you would be the one paying the price. So we build what matters ourselves, and Bear keeps working the way you expect.
💡
Did you know?
We collaborated with
Cossack Labs
for note encryption to ensure a reliable and smooth experience. Even if your iCloud account were ever hacked, you can rest assured your encrypted notes stay unreadable.
Keeping a note taking app private and standard
wasn’t a revolutionary idea in 2016 when we first launched Bear, but today, it kind of is. And we are glad we stick to what we believe since day 1. The world is changing and we don’t know where it leads us to, but we know your notes are safe with us and you have full control of them anytime, anywhere.
How features get made
Every design in Bear starts with a problem: a feature people need, something that’s broken, or simply something we don’t like. From there, we are on a journey of problem solving.
multi color highlighter testing for all Bear themes
That usually means a designer and a developer pairing up for a week or two, then bringing something working to the whole team. Then the real fun begins. Matteo, one of our cofounders, describes fun as “clashing heads with wonderful people to make great things.” Everyone in the team gets to express their opinions no matter what title they have. As a matter of fact, job titles mean nothing to us as you can see on our
website
.
Discussing UI details
The feedback discussion can be brutal.
“No”
is a very welcome answer here, with one house rule:
you have to give a reason
. Wall of text and hour long slack huddles come and go, then the paring up buddies return to the improvement part and provide a second round, a third round, until we are all happy with it. There are lucky days that some ideas get a big yes on the first try. Others spark weeks and months of debate and never ship at all. We’d rather be a little stubborn about what feels like Bear than chase every trend.
💡
Did you know?
Back in 2022, we had the idea to create a fourth column for the info panel, TOC, and Backlinks in Bear 2 update. The concept was discussed internally and also shared with on our
forum
, but at the end we were not convinced by the design at practical level, and thus the feature was never born in Bear 2.
The never shipped 4th column mockup
A milestone, and more to come
Over the years, Bear has grown up much bigger than we expected with millions of users enjoying Bear everyday. We’ve seen so many different ways of using Bear: prepare teaching materials in school, work as their second brain, or just write grocery lists (yes, that’s our parents!). 10 years is a huge milestone for us and we want to say a huge thank you to everyone no matter if you have been here since day 1 with us, or just downloaded Bear two minutes ago.
Bear Web Beta
We won’t hand you a flashy roadmap, but here’s what we can say for sure. Bear Web is almost ready for its full release, and we’re also working on note versioning and some other top secret things. Beyond that, we’ll keep doing what we’ve done for ten years: working our best to provide you a comfortable, private space to create beautiful notes.
🎁 Present time!
Kumagotchi: a writing pal for your Home Screen
Meet Kumagotchi
1
, a cute pixel bear who lives in a widget on your Home Screen and keeps you company while you write. Its status quietly follows how you use Bear: it strolls around the meadow when you’ve opened Bear recently, scribbles in its own little notebook while you write, watches the clouds while you read, and takes a nap in the grass when you’ve been away for a while. It’s as old as your very first note, and its weight grows with every note you write.
Kumagotchi widget status
Six new app icons
6 new App icons
What’s a birthday without a little dress up? We’ve crafted six new app icons
2
for the occasion: a special 10th anniversary icon, Bear with Birdie, a golden Bear, a peeking Bear, and two classic pixel Bears. We hope they bring a bit of fun to your Home Screen, and a gentle reminder to enjoy the little things in life.
Did somebody say Bear swag?
Bear Merch selection
Yes, they are finally here! Many of you have been asking for Bear merch and we have been secretly working on them! Our 10th anniversary merch features pixel art of a classic Macintosh with the Bear logo glowing on its screen and our little Birdie perched on top, a nod to where it all began. Check our merch page below to grab your Bear swag!
See you in the next decade
Thank you for being part of the story, whether you’ve been here since day one or found Bear last week. We’d love to hear about your favorite hidden detail, or one you just discovered in this post. Come say happy birthday to us on our
Community Forum
,
Reddit
,
X (Twitter)
,
Bluesky
, or directly at
bear@shinyfrog.net
.
Happy Writing!
🐻❤️📝
“Kuma” means
bear
in Japanese. Kumagotchi is our little nod to the classic Tamagotchi.
↩︎
These are the words my older brother uttered—
pronounced
, more like—
decreed
, even—as I, a ten-year-old transitioning from elementary school to middle, debated the merits of various instruments I might learn, in band class.
(I had been leaning toward flute.)
(I ended up going with clarinet.)
I was recently in a conversation where a friend said, approximately:
I feel you’re on stronger ground, Duncan, when you say that the status quo is unfairly blocking some people from activities they spontaneously want to do and (you argue) safely could in a different society.
I feel less comfortable when you dig for reasons that other people’s aversions to touch or sexual activity or whatever might be “unhealthy” (against some standard I’m not sure you’ve made a case for the universal healthiness of).
I think the statistical case for the unhealth of the younger generation is very strong, vis-a-vis depression, isolation, anxiety, etc. I’m reminded of that meme:
Like, asexuals
absolutely
exist (and are a completely healthy type of human), but also we know the rough base rate for asexuality and the stuff we’re seeing with younger generations staying at home and touching no one ever and living on social media and masturbation
exceeds
that rate, by a lot.
(And it’s not like there aren’t obvious causes—things happening that are unprecedented in our social and evolutionary history, that you would expect to fuck people up in the very ways we’re seeing people get fucked up. It’s a deer in the subway prior—the vast majority of possible departures from equilibrium are not improvements, or at least not straightforwardly/costlessly so.)
In general,
if someone seems elsewise completely happy and healthy and well-adjusted, then I certainly don’t question their sexuality or their aversion to touch or whatever. It’s mostly just that I’ve almost never
seen
a person who had a strong aversion to touch who otherwise did, in fact, seem completely healthy and happy and well-adjusted. Something like 9 out of 10 people that I’ve met who had strong touch aversions were also visibly maladjusted in the same way that you would expect from the stereotype of an animal that was cringing away from normal touch (e.g. from other members of its own species).
The 1 out of 10 does exist!
But it’s a strong prior.
To put it another way: if someone is like “Yeah, I am wildly outside of the distribution for desiring touch, and also I’m deeply fucked up in this other way, but don’t worry, I swear, those things are totally unrelated, the touch thing is #valid,” I
squint
at them.
Healthy person who is touch-averse: sure, range of preferences; different people
exist
.
Unhealthy person: I bet on
entanglement.
Then some time passed, and I felt the need to
keep adding clarifications,
and I came to the insight that’s at the core of this essay:
Oh, also: hopefully it’s clear that, even if the touch aversion
is
part of a complex of maladjustments, the answer is
obviously
not to brute-force override their touch preferences, in the moment. Like, even a malignant touch aversion is still real! To the extent that you want to help them fix it (and they want that, too), you can’t just “should” it away.
A random human saying “your touch preferences are Wrong” is indeed likely to do or advocate a bunch of abhorrent shit that I also agree is wrong, and vocally advocate against—someone’s traumatic adjustment to unhealthy circumstances is often itself pretty well-adjusted, in the sense of making the available best of a bad situation.
(e.g. slowing down in winter, which I recently
argued against pathologizing
, even though winter itself was not really present in our African ancestral experience and there’s a decently strong argument that we’re not really adapted for it and therefore the slowing-down is more of a cope than a straightforward natural good.)
Here’s the thing about what my brother had to say, regarding the flute:
The boys in our middle school and high school who
did
play the flute did not do well, as a class.
That’s … mostly an indictment of the local culture. Like, it’s
bad
if your school bullies and hazes people because a) for some reason everybody has decided that one’s choice of musical instrument is a Gender Thing™ and b) if you pick the wrong one then you’re some kind of Wrong, yourself, and c) the correct response to
that
is to torment you for seven years.
That’s bad.
And also.
That was the reality of the situation.
There’s a sort of wishful thinking that I’ve written about
at length
, before, where a certain kind of Good Parent™ might look at the situation and go “That’s stupid. You shouldn’t be constrained in your choice of musical instrument by small-minded bullies and hicks. Get your shoes, we’re going to get you a flute
right now.
”
And in the moment, I probably would have felt a rush of satisfaction and validation, and appreciation for the support.
And then I would’ve spent seven years one layer further down in hell.
The
actual
choice before me was not, in fact, “costlessly choose the thing you want” versus “kowtow to the fickle whims of a broken society.”
It was “spend a large fraction of your finite points
here,
on this specific battle,” versus “keep your head down and enjoy playing the next-most-appealing instrument in relative peace.”
(The clarinet was also fraught, by the way—just somewhat less so. There was a rather awkward moment when Philip Howard and I got to high school, and the band divided up by instrument to go off and practice, and the clarinetists headed for the girls’ locker room, because that’s where the clarinetists had
always
gone to practice.)
A lot of shit is broken in the world right now.
And a lot of our
responses
to that broken shit are themselves broken. Masking. Being closeted. Self-medicating. Doom scrolling. Hiding.
Lashing out
.
Sometimes, those broken responses can be self-reinforcing. They can start a vicious spiral that digs you further, and further, and further. Political polarization begets further political polarization; touch-starved people often become averse to touch, and this sucks. There’s something there that is
important
to fix, before it crosses the point of no return.
But the
way
to fix it isn’t to ignore the problem. You don’t cure someone of their arachnophobia by tossing a box of spiders at them. Coping strategies are there
for a reason,
and you almost never improve a situation by yanking away the crutch.
My friend heard me loudly pathologizing certain signatures of the younger generation (such as their social isolation and touch aversion) and got
nervous,
because when people start saying “X is unhealthy and wrong,” they often move pretty quickly to
doing
something about it, and the cure is often worse than the disease.
His objection was sound, and reasonable.
(And I’m glad he lodged it openly, because it was a good reminder to back up and be explicit about
not
taking an ill-advised next step. I had forgotten to emphasize that part, because I had taken it for granted.)
People from
Agor
are a
tiny, tiny bit
more sane
, when it comes to stuff like that. We intentionally practice the habit of being able to acknowledge that a thing is broken and bad while
not
taking any action in response, because we know that hasty action is likely to
make things even worse
.
(The axiom “most possible departures from equilibrium are not improvements” applies
just as well
to the
new
equilibrium of [problem] + [coping strategy]. By the time someone has
developed
a coping strategy, they’ve usually already searched the space of possibility at least a little, and found a local balance that minimizes the bad stuff, such that any single step in any direction is unlikely to be better. The fix in such cases usually requires changing two or three or four things
all at once,
and
that
kind of intervention takes care and forethought and patience and humility.)
It was wrong for the people at my school to harass boys for playing “girly” instruments.
It was also wrong for my brother to trample all over my personal sovereignty, and (essentially)
take away from me
the freedom to choose which instrument I would play for the next seven years.
But those two wrongs
did
add up to a right. Or at least, they left me in the
least wrong
situation that was actually available, given all of the constraints. There are a lot of things I might change, if given access to a time machine, but “play the flute instead of the clarinet” isn’t one of them.
(An even
better
move would’ve been to just
give me an accurate map of where the fenceposts were
, and then let me make a truly informed decision, but my brother was only thirteen; he, too, was doing his best. (Also there would’ve been costs
to him
of me playing the flute, and he had a right to care about those.))
It takes more than mere wishing to get out of the
darkworld
. In the meantime, while you’re here, you have to make do.
BTW my novel
Pass
is still going up
online
; chapter three is set to go out on Friday morning. I probably won’t keep reminding everyone, but I
would
love it if you read it and left a comment.
A sad historical footnote: this brother has since thoroughly and explicitly disavowed his relationship to me, stating more than once, in unequivocal terms, that I am in fact
no brother of his
(even though I
didn’t
ever play the flute).
Discussion about this post
Ready for more?
Study estimates 75% of NFL players who died over 15-year span had CTE
An estimated 75% of professional football players who died over a 15-year span had signs of chronic traumatic encephalopathy, or CTE, a study published Wednesday found.
It’s the highest estimate to date. Most recently, a
study published in August
by the same group estimated that one-quarter of NFL players who died in a five-year span had CTE. The new study, published in
JAMA Network Open
, put the figure at three times higher.
Not all people with signs of CTE in the brain go on to experience cognitive decline or dementia, and some people may never experience symptoms at all. A smaller proportion of the former players in the analysis were estimated to have dementia, about 27%, the study found.
The results were surprising, said study leader Yorghos Tripodis, the director of statistics and data management at the Boston University Alzheimer’s Disease and CTE Center. Boston University houses the
UNITE Brain Bank
, which studies the effects of repetitive head trauma in donated brains, including the brains of athletes, military personnel and others.
“I had to double-check the numbers,” Tripodis said. Still, he said, the number is a best guess. “Right now we don’t know how to diagnose CTE when people are alive, so we are trying to estimate.”
In an emailed statement, an NFL spokesperson said, in part, that the league “continuously strives to make the game of football safer, including by implementing strategies to reduce concussions and head impacts.”
Repeated blows and bias
When a person’s head jolts during an impact, the brain — which is suspended in fluid inside the skull — can slam into the skull or twist, said Dr. Julian Bailes, chair of the neurosurgery department at Endeavor Health in the Chicago area. Each blow is an opportunity for proteins called tau to build up in the brain.
“If that happens over and over again, that damage accrues,” said Bailes, who wasn’t involved with the new research.
The disease can affect parts of the brain involved with
regulating behavior and emotions
, which can lead to memory loss, depression, violent mood swings and other symptoms. Those symptoms can also be linked to other illnesses.
Although CTE can cause symptoms similar to those of other neurodegenerative diseases, such as dementia and Parkinson’s disease, the signature it leaves on the brain is unique, Bailes said.
One huge hurdle in studying the prevalence of CTE is that the microscopic changes don’t show up on brain scans. That means the condition can be diagnosed only during an autopsy.
Past research has been criticized for bias, since people with cognitive decline and their families are much likelier to either donate their brains to brain banks after they die or ask for autopsies —
a previous study
by Boston University researchers found that 99% of the brains donated to research by former NFL players had signs of CTE.
In the new study, Tripodis and his team tried to remove as much of that bias as possible to determine a more accurate estimate of CTE rates in former NFL players. They combined data from the UNITE Brain Bank with national death records of other former NFL players who died from 2008 to 2023.
In total, the researchers looked at data from 396 donated brains, plus information from 1,966 other deceased former NFL players. They factored in the ages of death along with estimated rates of mild cognitive impairment and dementia in former NFL players older than 50.
About 93% of the donated brains had signs of CTE, which shows up as structural damage in the brain. The research team calculated that the families of players with symptoms of cognitive decline were about five times likelier to donate brains than the families of players without symptoms and then performed a statistical analysis to correct for that bias.
From there, they estimated that among the roughly 2,360 former players who died during the 15-year time frame, about 1,760, or nearly 75%, had CTE. In comparison, only about 1% of brains donated to banks in the U.S., Austria and Brazil have signs of the disease, the researchers said.
But plenty of people with signs of CTE never develop symptoms, Tripodis said.
The researchers estimated that 27% of the 2,360 players studied had dementia.
The dementia “can be from all causes,” Tripodis said. “But it is very likely that in this specific population that CTE is causing dementia.”
Reducing impacts
Until doctors figure out a way to diagnose CTE while people are still alive, any studies quantifying how many people have the condition will be estimates, said Dr. Jim Kelly, a professor emeritus of neurology at the University of Colorado Anschutz.
“These are all estimates. They had no autopsies on five times as many players who died as they did have autopsies for,” said Kelly, who wasn’t involved in the research.
Some of the autopsies may also have revealed just one or a couple of lesions associated with CTE, “and it seems unlikely that that would lead to anything in terms of a behavior change or dementia,” he said.
Those are difficult studies to do, Bailes agreed. They seek to determine “how many people out there have a condition when not all of them are symptomatic,” he said, adding that the findings are a call for more research into diagnosing CTE in people who are still living.
“If you can’t tell if someone has a certain disease until they’re dead, you really can’t help them,” he said.
In the meantime, prevention is key, Tripodis said: “If you reduce the number of brain injuries, brain impacts, you substantially decrease the risk.”
The NFL has already implemented measures to try to reduce the number of high-impact hits players face. They include
redesigned helmets
— such as the
Guardian Cap
— and the
dynamic kickoff rule
, which leads to lower collision speeds.
I am a computer science student. I got a scholarship to study computer science and AI last year and I love it! It's something that I wanted to do since I was a kid but couldn't afford it.
It's been a huge learning curve. I only had a B in maths from GCSE (which is the exam you take at 16 for non UK folk) and no technical training other than the funny little games I made on OpenProcessing*.
Regardless of how hard it's been, I have enjoyed the challenge. I wouldn't have signed up to study computing if I thought it would be an easy ride. The problem is that my university seems to be having an existential crisis because of AI, and it's making the experience much shittier than it was before.
The flip flopping makes everything uncertain
During my studies, my uni has flip flopped between YOU MUST NEVER USE AI and YOU MUST USE AI and also YES WE'RE USING AI BUT THAT DOESN'T MEAN YOU SHOULD!
They seem to have made an art of choosing the worst possible use cases for AI (marking and feedback, course content creation, and student engagement emails) and going all in on them, only to roll back the decision 3 months later. Students are mandated to use AI in assignments, only to reach the next module where you lose marks for even touching an LLM.
Coursework design has gone down the toilet
I mean, it was never perfect to begin with. Assessing skill in computer science is a difficult problem to solve, but getting Claude to crank out bloated assessment briefs is not the solution. Whereas before, assignments were designed by a person who thought them through at least once, then approved by other people in the department, now I doubt they're getting read more than once (if that). Errors abound, often with corrections coming a week or two before the deadline.
The amount of work involved has also tripled - LLMs don't know how much effort it takes for a student to learn new material then complete technical tasks, and professors are too far along in their careers to notice this when skim reading an AI generated brief. So those of us with less technical experience are forced to speed run content, which SUCKS! I am here to learn, god damn it, not barely scratch the surface of the 15 deliverables I have for a 3,000 word assignment.
Tutors are overloaded (even more than usual)
You know what university financiers love to hear? SCALE! Learning at scale, preferable automated, so they can milk the cash cow as much as possible without paying for extra staff. There has always been tension between educational and commercial interests in every institution, but the AI hype has forced through a level of workload that is unethical and unsustainable for tutors and lecturers. I only hear from my tutor these days when I haven't accessed the online portal in a while, because their data dashboard flagged me as 'at risk' T_T
Doomers left, right and centre
I don't care if computer science and maths are over! I still want to learn about them! OK, I do care about my future career, but it still doesn't mean I want to forget everything I learned or stop progressing on this journey. There are so many interesting avenues to explore (some AI, some not), but I can't move for headlines about how software engineering is over/not using AI makes you obsolete/blah blah blah. Can't a girl learn statistics for fun?
I could go on, but I won't. It'll give me indigestion. Maybe I'll go back to OpenProcessing for a bit and make some more silly games now I actually know how to do a bit of programming.
Send me an email if you have anything to share about this post!
Reply by email
A lightweight, fast, and fully-featured BASIC interpreter designed specifically for mid-range Arduino boards and MCUs. Write, edit, and run code directly on the hardware.
Key Features
In-Hardware Editor
Write and edit your BASIC programs directly on the Arduino without needing a connected PC IDE.
Hardware-Agnostic by Design
Built to be lightweight and portable. Tiny Basic for Arduino minimizes hardware dependencies so you can bring BASIC to almost any mid-range MCU with minimal effort.
Extensive Standard Library
Includes a comprehensive set of built-in functions for hardware I/O, math, and bit manipulation.
Fedora Linux 45 released
Linux Weekly News
lwn.net
2026-11-03 10:11:32
Fedora Linux
45 has been released. This includes all editions: Fedora Workstation, Fedora KDE Plasma Desktop, Fedora Server, Fedora Cloud, Fedora CoreOS, and Fedora IoT, as well as the Atomic Desktops and Spins.
This release adds support for installation
on Stratis storage using Anaconda or Kicksta...
Barracuda warns of critical flaws allowing root access to devices
Bleeping Computer
www.bleepingcomputer.com
2026-11-03 10:06:16
Cybersecurity company Barracuda Networks warned customers to patch two vulnerabilities that can let attackers run commands with root privileges. [...]...
Cybersecurity company Barracuda Networks warned customers to patch two vulnerabilities that can let attackers run commands with root privileges.
The first is a critical flaw (
CVE-2026-116606
) stemming from an Email Security Gateway (ESG) authentication weakness that attackers can exploit to modify an appliance's global configuration, while the second (
CVE-2026-111560
) lets threat actors with admin permissions inject OS commands that run as root.
However, Barracuda said successful exploitation also requires access to the administrative interfaces of targeted devices and advised customers to use appropriate network access controls and restrict access to trusted internal networks to limit exposure.
"Successful exploitation requires an attacker to have access to the administrative interface of an affected product. If exploited in combination, these vulnerabilities could allow an attacker to bypass authorization controls and obtain root access to the device,"
the company explained
.
"Barracuda immediately initiated a comprehensive remediation process and released security patches for affected products. Customers should review the affected products and remediation guidance [..], ensure their systems are running the latest firmware version, and have all security patches applied."
A complete list of all affected devices and available security patches is available in the table below.
Affected Product
CVE-2026-116606
CVE-2026-111560
Patch
Email Security Gateway (ESG)
Yes
Yes
BNSF-40425 (9.4.017+),
BNSF-40430 (<9.4.017)
Load Balancer ADC
No
Yes
BNADC-16586
Message Archiver (BMA)
No
Yes
BNMA-32468
WAF Control Center (WCC)
No
Yes
BNWF-60060
Web Application Firewall (WAF)
No
Yes
BNADC-16586
Web Security Gateway (WSG)
No
Yes
BNYF-24789
Three years ago, Barracuda also patched an Email Security Gateway flaw (CVE-2023-7102) that the UNC4841 hacking group
exploited in zero-day attacks
to execute arbitrary code on unpatched appliances.
The same year, UNC4841 hackers abused another zero-day (
CVE-2023-2868
) to target Barracuda ESG appliances as part of cyber-espionage attacks.
Barracuda later revealed that the vulnerability had been exploited
for at least seven months
, since at least October 2022, to deploy previously unknown SeaSpy and Saltwater malware and steal data from compromised systems.
Almost a third of appliances hacked in the 2023 campaign
belonged to government agencies
worldwide, most of them breached between October and December 2022, according to cybersecurity firm Mandiant.
Founded in 2003, Barracuda has more than 200,000 customers worldwide, including small- to medium-sized businesses (SMBs), large enterprises, and managed service providers (MSPs).
Octomind is a CLI-first AI coding agent runtime. It gives an LLM real access to your repo — reading and writing files, running shells, searching code, delegating to sub-agents — through
MCP
tools. The same session engine works
interactively
,
piped through stdin
, as a
background daemon
, over
WebSocket
, or as an
ACP sub-agent
inside another agent's stack.
# Interactive
octomind run developer:general
# Piped — CI, scripts, automationecho"Explain the auth module"| octomind run developer:general --format plain
# Daemon — keep it alive, talk to it from another terminalecho"watch the build"| octomind run --name watcher --daemon --format jsonl
octomind send --name watcher "run the test suite"
Why Octomind?
Most coding agents assume a human is watching the screen. Octomind is built for the work that keeps going after you leave.
Policy as code, not approval popups.
Deterministic
guardrails
— pre-call guards, post-result hooks, post-turn validators — live in TOML and scripts, so they work in CI, daemons, and scheduled runs.
Proven on real PRs.
It solved 24 of 25 held-out tasks at lower cost than the closest competitor. See the
benchmarks
.
Ready-made specialists.
octomind run developer:general
pulls a packaged agent (prompt, model, MCP servers, tool permissions) from a
tap
. Publish your own with one repo.
Sessions that stay sharp.
Adaptive
compression
keeps long tasks moving while retaining task knowledge and the live exchange.
Any model, any budget.
Use Octomind Cloud or your own key (OpenRouter, Anthropic, OpenAI, DeepSeek, Ollama, and more), pick a model per role, and set spend thresholds per request and per session. A request over its threshold stops; at the session threshold a terminal session asks y/N before continuing, while a non-interactive
octomind run
stops with exit code 75.
One config.
Models, tools, roles, guardrails, budgets: all TOML, no framework code.
2. Get model access.
The fastest path is Octomind Cloud, which includes models and needs no configuration:
Prefer your own provider key? Skip login and export one (also
OPENAI_API_KEY
,
ANTHROPIC_API_KEY
,
DEEPSEEK_API_KEY
), then follow
Model access
to point the config at it:
export OPENROUTER_API_KEY="your_key"
3. Run a specialist
in your project:
cd~/your/project
octomind run developer:general
You're now in a session with an agent that can read your code, run commands, and edit files. The interface is a plain line prompt with markdown rendering — no TUI to learn, so it works over SSH, in
tmux
, and in CI logs. The first time you run a specialist, it may install its tools and ask for credentials.
developer:general
comes from the default tap
muvon/tap
, not your local config. Plain
octomind run
starts the config's default role,
assistant:concierge
.
Try the
recorded bug-fix demo
: two failing tests, an agent fix, and an independent test rerun.
Benchmarks
Measured on
octobench
against
25 tasks harvested from merged pull requests
across Python, PHP, Rust, C++, and JavaScript. Each agent works in the pre-fix repo; held-out tests from the merged fix decide pass or fail. These are the published July 30, 2026 results, not a measurement of this checkout.
solved
judge Σ / 2500
cost
wall time
octomind + glm-5.2
24/25
2264
$63.43
3.6h
claude code + claude-opus-5
23/25
2262
$81.79
6.7h
codex + gpt-5.6-sol
21/25
2127
$14.86
1.0h
opencode + glm-5.2
19/25
2093
$129.54
3.3h
The harness matters.
opencode used the same model and endpoint; octomind solved 24 vs 19 at roughly half the cost. All four agents ran stock invocations with no tuning, so this measures the whole harness, not individual features.
Worst-case pricing, still ahead.
glm-5.2 ran without prompt caching while Opus billed ~97% of context re-reads at cache rates — and octomind still led on solves, cost, and wall time.
Reproducible.
Per-case table, artifacts, and reproduction guide:
BENCHMARK.md
. Background:
blog post
.
Guardrails: Policy as Code
Drop a
.agents/guardrails.toml
in your repo. The runtime enforces it deterministically, with no code to compile and no plugin to install.
# Pre-call deny — block a class of calls before they execute
[[guard]]
match = "shell(command=^rm\\s+-rf?)"message = "rm -rf blocked."# Conditional rule — only fires after the agent ran git status this session
[[guard]]
match = "shell(command=git push)"when = ["+shell(command=git status)"]
message = "Review changes before pushing."
Layer
When it runs
What it does
Guards
Before a tool call
Deny by capability, argument regex, and session history. A match returns a denial instead of executing the call.
Hooks
After a tool result
A non-zero exit injects stdout into the agent's inbox — lint and format failures become automatic corrections without restarting the turn.
Validators
After a turn
Scripts the agent reads on its next turn. This replaces "approve this change?" prompts in autonomous loops.
Need machine-readable results? Pass
--schema schema.json
to constrain the final response to a JSON Schema (requires a model with structured-output support). See
Structured output
.
Features
Feature
What you get
Learn more
Specialists & taps
Packaged agents with model, prompt, MCP servers, and permissions; installs their tool dependencies on first use
octomind run developer:general # general dev, language skills auto-activate
octomind run doctor:blood # blood-test interpretation specialist
octomind run lawyer:sg # legal specialist
Running a specialist fetches its manifest from the tap registry, installs any required binaries, resolves credentials, starts the right MCP servers, and then opens the session.
Build and register your own:
octomind tap init yourteam/my-tap # scaffold, validate, git-init, and register locally
octomind tap yourteam/my-tap # on another machine, after publishing to GitHub
The
octomind-
prefix is added automatically:
yourteam/my-tap
maps to the repository
yourteam/octomind-my-tap
.
scoop bucket add muvon https://github.com/Muvon/scoop-bucket
then
scoop install muvon/octomind
Cargo
(Rust 1.95+)
cargo install octomind
Docker
docker run --rm ghcr.io/muvon/octomind --help
From source
git clone https://github.com/muvon/octomind.git && cd octomind && cargo build --release
The install script detects your OS and architecture (Linux and macOS on x86_64/aarch64) and installs to
~/.local/bin/
. Pass
--install-dir <DIR>
or set
OCTOMIND_INSTALL_DIR
to override. On Windows (x86_64/aarch64),
install.ps1
installs to
%LOCALAPPDATA%\octomind\bin
and adds it to your user
PATH
; it honors
OCTOMIND_INSTALL_DIR
and
OCTOMIND_VERSION
too.
install.sh
still works from Git Bash or MSYS2.
Command not found?
Add the install directory to your
PATH
:
export PATH="$HOME/.local/bin:$PATH"
Building from source requires
protoc
; see
Building from source
for per-OS prerequisites.
Verify:
octomind --version
octomind config # generate the default config
octomind run # start your first session
Octomind Cloud
—
octomind login
(device-code sign-in, like
gh auth login
) stores a gateway key locally. The default config already uses
octohub:auto
.
Learn more
.
Bring your own key
— set the provider's environment variable (
OPENROUTER_API_KEY
,
OPENAI_API_KEY
,
ANTHROPIC_API_KEY
,
DEEPSEEK_API_KEY
, …) and point the model tables at it. The supervisor and compression profiles also default to
octohub:auto
, so update all three:
[model]
name = "openrouter:google/gemini-2.5-flash"
[supervisor.model]
name = "openrouter:google/gemini-2.5-flash"
[compression.model]
name = "openrouter:google/gemini-2.5-flash"
Config lives at
~/.local/share/octomind/config/config.toml
on macOS and Linux, and under
%LOCALAPPDATA%/octomind/config/
on Windows. Set
OCTOMIND_DATA_DIR
to override the data root.
Octomind reports anonymous usage: which commands, tools, and models are used, plus timings, token counts, and error kinds. It never sends your code, prompts, file paths, tool arguments, or environment values. Opt out in any of three ways:
export DO_NOT_TRACK=1 # the cross-tool standard, honored firstexport OCTOMIND_TELEMETRY=0 # for subsequent commands in this shell# or set `telemetry = false` in config.toml
The most impactful contribution isn't code —
it's specialist agents.
A cardiologist publishing
doctor:medications
. A tax attorney publishing
lawyer:us
. A security researcher publishing
security:owasp
. One TOML file, and everyone facing that problem gets a specialist-grade AI.
Gartner Predicts SOCs Will Have 50% More Engineers Than Analysts by 2028
Bleeping Computer
www.bleepingcomputer.com
2026-11-03 10:00:10
Gartner predicts that security operations centers will have 50% more engineers than analysts by 2028 as AI agents take over routine alert handling. Prophet Security examines how AI is reshaping SOC roles, from analyst responsibilities and detection engineering to threat hunting and exposure manageme...
If the prediction holds, the people who build and tune a SOC's systems will outnumber the people who work its queue.
Gartner starts its reasoning with alert handling. The report finds that AI SOC agents already cut alert-handling work significantly for common and traditional detection use cases. It describes this as the end of alert processing as the SOC's primary function.
From there, the report works through what that means for the people in the SOC. Analysts move from triage to case ownership, and entry-level roles need a new way in.
Detection engineering grows into a broader engineering job, the metrics shift from alerts to cases and decisions, and exposure management becomes a standing SOC function.
Prophet Security is offering the full report as a
free download
.
Analysts move from alert triage to case ownership
Gartner's recommendation for analysts is direct: "Human analysts must transition from alert triage roles to end-to-end case ownership and effective response option communication." In practice, the agent investigates the alert, and the analyst owns what happens next.
That means confirming what the agent found, choosing the response, and explaining the options to the people who have to act on them.
The report also holds that AI-assembled case files still need meaningful human validation before a team can rely on them,so analysts spend more of their time judging whether a conclusion holds up and less of it producing verdicts from scratch.
None of this shrinks the team, in Gartner's view. "The SOC will not shrink by 2030," the report states. The people who worked alert volume get redirected toward detection engineering, threat expertise, offensive testing, and exposure management.
Practitioners expect the same. Prophet Security's
State of AI in Security Operations 2026
survey asked more than 250 CISOs, SOC leaders, and practitioners about this. Of those respondents, 57% expect their team size to stay the same, and 9% expect it to grow.
Entry-level roles need a new way in
Many analysts learned the job in Tier 1 triage, and AI is
flattening those tiers
. Working a high alert volume taught them what normal looks like in their environment. Gartner's report addresses how L1 and L2 roles change and the training and staffing changes SOC leaders should make now. If agents take over triage, junior analysts lose the repetitions that built their judgment, unless the team replaces those repetitions on purpose.
Three practices can do that:
Study the agent's work.
When an agent records every question it asked, every query it ran, and the evidence behind its determination, each closed alert becomes a worked example. Junior analysts can check whether they would have run the same queries and reached the same conclusion. At
JBPCO
, the team was able to onboard a new analyst to senior level proficiency within months.
Own cases early.
Gartner's shift to case ownership applies to new analysts too. Giving them end-to-end ownership of lower-risk cases, with a senior reviewer, lets them practice the decisions and response communication the report puts at the center of the analyst role.
Feed corrections back.
Gartner lists "operational feedback management" among the responsibilities of the future detection engineer, and expects analysts to give more feedback to improve AI accuracy. Among Prophet Security's customers, some analysts have already moved from handling alerts to curating the guidance the AI platform uses in its investigations. The same work suits a new hire who is still learning the environment.
The risk to manage is an analyst who only confirms what the agent says. One control is to have analysts work a sample of cases on their own before they see the agent's determination, then compare the two.
Detection engineering grows into SOC engineering
The 2028 prediction rests on a wider definition of engineering work. Gartner describes
detection engineering
expanding into a broader SOC engineering discipline.
The report tells SOC leaders to "redefine detection engineering role descriptions and hiring requirements." The new descriptions should go beyond rule writing to include prompt design, workflow testing, and AI output validation. The report also calls for software engineering practices such as versioning, testing, and rollback.
Each of those maps to work that exists once agents run in production:
Prompt design and guidance:
writing the instructions and context an agent uses to investigate in your environment, such as asset criticality, VIP users and known-benign admin activity.
Workflow testing:
checking an agent workflow against past incidents before it goes live, the way a detection is backtested before it ships.
AI output validation:
sampling the agent's determinations on a schedule and measuring how often a reviewer agrees with them.
Versioning and rollback:
managing guidance and detection changes as code, so a bad change can be traced and reverted.
The analyst hours that agents return also go into
threat hunting
. In the State of AI in Security Operations 2026 survey, 49% of teams that hunt weekly or more said a hunt had surfaced malicious activity their detections missed.
Among teams reporting the lowest hunting frequency, the figure was 8%. A confirmed hunt finding often gives the engineers a new detection to write for their own environment.
The metrics move from alerts to cases and decisions
Gartner's guidance on measurement is short: "Stop recording alert metrics and run the SOC on cases and decisions." The report points SOC leaders away from alert volume, closure rates and
mean time to detect
, and toward case accuracy, cycle time and decision confidence.
One way to put a number on each:
Case accuracy:
review a fixed sample of closed cases each week, from agents and analysts alike, and track how often the reviewer agrees with the determination.
Cycle time:
measure the time from the first signal to a decision on the case, including the response.
Decision confidence:
record how much evidence supports each determination and how often one is overturned later.
Alert counts still help with capacity planning, but they say little about whether a determination was right. The new measures can sit alongside the SOC metrics a team already reports, such as mean time to respond.
Exposure management becomes a standing SOC function
Gartner's report calls exposure management "the emerging SOC capability to invest in before anything else." It calls for continuous threat exposure management (CTEM) to run as a standing SOC function, rather than as an annual or quarterly exercise.
It also predicts that by 2030, SOCs will be largely offensively driven, testing their own business the way an attacker would.
Many security teams have wanted to run this kind of continuous testing for years and rarely had the hours for it. Once agents handle the alert queue, the analysts and engineers who move into exposure work can validate exposures as they appear.
What they find goes to the people writing detections and planning hunts.
Planning the transition
The report's recommendations translate into decisions that are easier to make before an AI SOC rollout than after it:
Map today's roles against the work Gartner expects to grow: case ownership, SOC engineering, hunting and exposure management.
Rewrite the detection engineering job description to include prompt design, workflow testing, and AI output validation, as the report recommends.
Design the entry-level path, including case ownership and feedback work, before triage volume drops.
Record a baseline for case accuracy and cycle time, so the rollout has a before and an after.
Choose one exposure management practice to run continuously instead of once a year.
How Prophet Security helps
Prophet Security is
a leading agentic AI SOC platform
, recognized in Rising in Cyber 2026, an honor voted on by more than 150 CISOs and security leaders. Its platform, Prophet AI, uses specialist AI agents to investigate alerts, hunt for threats, and build and tune detections on the stack a team already runs.
Here is how it maps to the shifts described above:
Case ownership.
Prophet AI SOC Analyst investigates every alert and records every question, query, and piece of evidence behind its determination, so analysts can own the case and check the reasoning. It groups related investigations into one incident and takes only the response actions a team has approved.
SOC engineering.
Prophet AI Detection Engineer keeps a live MITRE ATT&CK coverage map built from a team's own investigations, then builds and tunes detections from what investigations, hunts, and coverage gaps reveal. Each change is backtested against the team's own history and arrives as a reviewable, version-controlled proposal, and by default nothing reaches production until the team approves it. Guidance that changes an investigation step is versioned and testable too.
Threat hunting.
Prophet AI Threat Hunter runs hunts automatically when a severe new threat emerges. Scheduled hunts against coverage gaps, and hunts a team writes as plain-language questions, run on the cadence the team sets. Suspicious findings go to Prophet AI SOC Analyst for a full investigation, and validated ones become candidates for new detections.
Case accuracy.
Prophet Security measures the quality of Prophet AI's determinations through a continuous QA program with ISO 2859-1 sampling audits. When the evidence does not support a verdict, Prophet AI SOC Analyst returns an inconclusive determination instead of guessing.
Read the full report
Gartner's report sets out the roles, metrics and skills a SOC needs as AI agents take over alert handling.
The government’s surveillance powers grew rapidly after Sept. 11, 2001, some in public view and some in secret. EFF suspected but couldn’t prove that the National Security Agency was spying on Americans' communications. The New York Times sat on a story about it for over a year, finally publishing i...
The government’s surveillance powers grew rapidly after Sept. 11, 2001, some in public view and some in secret. EFF suspected but couldn’t prove that the National Security Agency was spying on Americans' communications. The New York Times sat on a story about it for over a year, finally publishing it in December 2005. Then, in January 2006, a retired AT&T technician named
Mark Klein
walked into EFF's office with a manila folder of documents that blew the story wide open.
Welcome to the third episode of “Privacy’s Defenders,” a podcast about the people – lawyers, journalists, hackers, and others – who’ve fought to secure your digital liberties since before most people even knew what the internet was.
In this episode, former EFF Executive Director Cindy Cohn talks with former EFF lawyer
Kevin Bankston
, who was at his desk drafting a lawsuit against AT&T when Klein showed up. Less than two weeks later, EFF sued the phone company on behalf of its own customers in
Hepting v. AT&T
. Cindy speaks again with now-retired Justice Department lawyer Tony Coppolino, who asked for the opportunity to defend the case. He called EFF with a warning after Klein’s documents were filed in court: If they were classified, EFF would be in big trouble. You’ll also hear from Klein himself, and from Carolyn Jewel, a romance novelist and AT&T customer who became the lead plaintiff in
EFF's related case against the NSA
.
It's the story of a secret room in a San Francisco phone company building, a heroic whistleblower, and the people who refused to let mass surveillance stay hidden.
The “Privacy’s Defenders” podcast is a follow-up to Cindy’s book, “Privacy’s Defender: My Thirty-Year Fight Against Digital Surveillance,” bringing to life pivotal moments in the voices of those who fought for your rights. Sales of “Privacy’s Defender” benefit EFF, so
pick up your copy today
!
Joanne Elgart Jennings co-produced and created this podcast.
Jarrod Sport co-produced, mixed, and mastered it.
Corinne Ruff is our story editor.
We had additional help from Rachel Estabrook and Alison Broverman.
The original music was composed and performed by Nat Keefe of Hot Buttered Rum with Ben Andrews on the fiddle.
America Votes: 'CEKEVPATIVG EDELDOA'
403 Media
www.404media.co
2026-11-03 09:54:40
Slopfest 2k26 continues with an election, a fanfic fiasco, and World of Slopcraft....
28-Nov-2018
: I’ve added a small update at the end on how to prevent
‘handle collisions’ with a per-slot generation counter
Original Post
:
…wherein I talk a bit about how I’m doing dynamic memory management in C
and C++ these days which basically replaces raw- and smart-pointers with
‘index-handles’.
In my
last blog post
I was mentioning
pointer- and allocation-free programming, but was skipping over
the details. This is what the following blog post is
about.
This is all based on the (sometimes painful) experience of wrestling for 15+
years with fairly big C++ code bases (0.5 to around 1 mloc) where memory is
often managed through smart pointers. The worst case being tens- to
hundreds-of-thousands of small C++ objects, each in its own heap
allocation, pointing to each other through smart pointers. While such code
is quite robust in terms of memory corruption (segfaults and corruption
rarely happens, since most attempts are caught by asserts when dereferencing
smart pointers), this type of ‘object spiderweb code’ is also dog-slow
without obvious starting points for optimization, since the entire code is full of
cache misses. Other typical problems are memory fragmentation and ‘fake
memory leaks’ because a forgotten smart pointer prevents freeing the
underlying memory (I call them ‘fake leaks’ because this type of leaks cannot
be caught by memory debugging tools).
Nothing presented here is particularly new or clever, it’s just
a collection of a few simple ideas which together work fairly well in bigger
code bases to prevent (or at least detect early) a number of common
memory-related problems in C and C++, and may even be useful in higher-level
garbage-collected languages to reduce pressure on the garbage collector.
However, the underlying design philosophy doesn’t fit very well into a
classical OOP world where applications are built from small autonomous
objects interacting with each other. That’s why it’s also quite tricky to
implement those ideas in a big existing OOP code base, where object creation
and destruction happens ‘decentralized’ all over the code.
The approach described here works very well though with a data-oriented
architecture, where central systems work on arrays of data items packed
tightly in memory.
Most of the following blog post is written from a game developer’s
perspective, but should also apply to other areas where a program needs to
juggle a few hundred to a few million objects (or generally ‘data items’) in
memory, and where such items are created and destroyed frequently.
The gist is:
move all memory management into centralized systems (like rendering, physics, animation, …), with the systems being the sole owner of their memory allocations
group items of the same type into arrays, and treat the array base pointer as system-private
when creating an item, only return an ‘index-handle’ to the outside world, not a pointer to the item
in the index-handles, only use as many bits as needed for the array index, and use the remaining bits for additional memory safety checks
only convert a handle to a pointer when absolutely needed, and don’t store the pointer anywhere
I’ll explain each of those points in detail below. But the idea is basically
that common ‘user-level’ code doesn’t directly call memory allocation
functions (like malloc, new or make_shared/make_unique), and reduces the use
of pointers to an absolute minimum (only as short-lived references when
direct memory access to an item is absolutely needed). Most importantly,
pointers are never the ‘owner’ of an item’s underlying memory.
Instead, direct memory manipulation happens as much as possible inside a few
centralized systems where memory-related problems are easier to debug and
optimize.
Move memory management into central systems
In this blog post, a ‘system’ is a (usually fairly big) part of a code base
which takes care of a number of related tasks, like ‘rendering’, ‘physics’,
‘AI’, ‘character animation’ and so on. Such a system is separated from other
systems and ‘user-code’ through a clearly defined function API, and the work
that happens on the system’s data is performed in tight central loops instead
of being spread out all over the code base.
Systems often work on items created and destroyed under control of user code
(but note that creation and destruction of items is different from allocating
and freeing the memory used by those items!). For instance a rendering system
might deal with vertex buffers, textures, shaders and pipeline state objects.
A physics system works with rigid bodies, joints and collision primitives,
and an animation system works with animation keys and curves.
It makes sense to move the memory management for such items into the systems
themselves, because a general memory allocator doesn’t have the
system-specific ‘domain knowledge’ about how data items are processed and the
relationships between data items. This allows the system to optimize memory
allocations, perform additional validation checks when creating and
destroying items, and arrange items in memory for making best use of the
CPU’s data caches.
A good example for this ‘system domain knowledge’ is the destruction of
rendering resource objects with modern 3D APIs: a resource object can not
simply be destroyed immediately when the user code says so because the
resource might still be referenced in a command list waiting to be consumed
by the GPU. Instead the rendering system would only mark the resource object
for destruction when the user code requests its destruction, but the actual
destruction happens at a later time when the GPU no longer uses the resource.
Group items of the same type into arrays
Once all memory management has moved into systems, the system can optimize
memory allocations and memory layout with its additional knowledge about how
items are used. One obvious optimization is to reduce the number of general
memory allocations by grouping items of the same type into arrays, and
allocate those arrays at system startup.
Instead of performing a memory allocation each time a new item is created,
the system keeps track of free array slots, and picks the next free slot.
When the user code no longer needs the item, the system simply marks the slot
as free again instead of performing a deallocation (not different
from a typical pool allocator).
This pool allocation is most likely a little bit faster than performing a
memory allocation per item, but this is not even the main reason for keeping
items in arrays (modern general allocators are quite fast too for small
allocations).
A few additional advantages are:
items are guaranteed to be packed tightly in memory, general allocators sometimes need to keep some housekeeping data next to the actual item memory
it’s easier to keep ‘hot items’ in continuous memory ranges, so that the CPU can make better use of its data caches
it’s also possible to split the data of a single item into several subitems in different arrays for even tighter packing and better data cache usage (AoS vs SoA and everything inbetween), and all those data layout details remain private to the system and are trivial to change without affecting ‘outside code’
as long as the system doesn’t need to reallocate arrays, it is guaranteed that there will be no memory fragmentation (although this is less of an issue in a 64-bit address space)
it’s easier to detect memory leaks early, and provide more useful error messages: when a new item is created a system can trivially check the current number of items against an expected upper bound (for instance a game might know that there should never be more than 1024 textures alive at a time, and since all textures are created through the rendering system, the system can print out a more useful warning message when this number is exceeded)
Public index-handles instead of pointers
Keeping system items in arrays instead of unique allocations has the
advantage that an item can be identified through an array index instead of
requiring a full pointer. This is very useful for memory safety.
Instead of handing memory pointers to the outside world, the system can treat
the array base pointers as ‘private knowledge’, and only hand out array
indices to the public. Without the base pointer to compute an item’s memory
location, the outside code can’t access the item’s memory, even with a lot
of criminal energy.
This has a number of further advantages:
In many situations, code outside the system never even needs to directly access memory of an item, only the system does. In such an ‘ideal’ situation, user code never accesses memory through pointers, and can never cause memory corruption.
Since only the system knows the array base pointers, it’s free to move or reallocate the item arrays at will without invalidating existing index handles.
Array indices need fewer bits than full pointers, and a smaller data type can be picked for them, which in turn allows tighter packing of data structures and better data cache usage (this has the caveat that additional handle bits can be used to increase memory safety, more about this below)
If user code needs to access the memory of an item directly it needs to obtain
a pointer through a ‘lookup function’ which takes a handle as input and returns
a pointer. As soon as such a lookup function exists, the fairly watertight
memory safety scenario outlined above is no longer guaranteed, and the user code
should adhere to a few rules:
pointers should never be stored anywhere, since the next time the pointer is used it may no longer point to the same item, or even to valid memory
a pointer should only be used in a simple code block, and not ‘across’ function calls
Every time a handle is converted into a pointer, the system can guarantee
that the returned pointer still points to the same item that the handle was
originally created for (more on this below), but this guarantee ‘decays’ over
time since the item under the pointer may have been destroyed, or the underlying
memory may have been reallocated to a different location (this is the same
problem as iterator invalidation in C++).
The two simple rules above are easy to memorize and are a good compromise between
not exposing pointers to user code at all, and having a (somewhat costly)
handle-to-pointer conversion for every single memory access.
Memory safety considerations
First, each type of handle should get its own C/C++ type, so that attempting
to pass the wrong handle type to a function is already detected at compile
time (note that a simple typedef isn’t enough to produce a compiler warning,
the handle must be wrapped into its own struct or class - however this could
be limited to debug compilation mode).
All runtime memory safety checks happen in the function which converts a
handle into a pointer. If the handle is just an array index, it would look
like this:
a range check happens for the index against the current item array size, this prevents segmentation faults and reading or writing allocated but unrelated memory areas
a check needs to happen whether the indexed array item slot contains an active item (is not currently a ‘free slot’), this prevents the simple variant of ‘use after free’
finally the item pointer is computed from the private array base pointer and public item index
The resulting pointer is safe to use as long as:
the item array isn’t reallocated
the indexed item hasn’t been destroyed
Both can only happen inside one of the system’s functions, that’s why the two
‘pointer usage rules’ exist (don’t store pointers, don’t keep pointers across
function calls).
There is a pretty big hole in the above use-after-free check though: if we only
check if an array slot behind an index-handle contains a valid item, it’s
not guaranteed that it is the
same
item the handle was originally created
for. It can happen that the original item was destroyed, and the same
array slot was reused for a
new
item.
This is where the ‘free bits’ in a handle come in: Let’s say our
handles are 16-bits, but we only ever need 1024 items alive
at the same time. Only 10 index bits are needed to address 1024 items, which
leaves 6 bits free for something else.
If those 6 bits contain some sort of ‘unique pattern’, it’s possible to
detect dangling accesses:
When an item is created, a free array item is picked and its index is put into the lower 10 handle bits. The upper 6 bits are set to a ‘unique bit pattern’
The resulting 16-bit handle (10 bits index + 6 bit ‘unique pattern’) are returned to the outside world, and at the same time stored with the array slot.
When an item is destroyed, the item handle stored with the array slot is set to the ‘invalid handle’ value (can be zero, as long as zero is never returned as a valid handle to the outside world)
When the handle is converted to a pointer, the lower 10 bits are used as array index to lookup the array slot, and the entire 16-bit handle is compared against the handle that’s currently stored with the array slot:
if both handles are equal, the pointer is valid and points to the same item the handle was created for
otherwise this is a dangling access, the slot item has either been destroyed (in that case the stored handle would have the ‘invalid handle’ value), or has been destroyed and reused for a new item (in that case the upper 6 ‘unique pattern’ bits don’t match)
This handle-comparison check when converting a handle to a pointer works
quite well to detect dangling-accesses, but it isn’t waterproof because the
same combination of array index and ‘unique pattern’ will be created sooner or
later.
But it’s still better than no dangling protection at all (like raw pointers),
or a ‘fake memory leak’ which would happen in similar situations with smart pointers.
Finding good strategies to create unique handles that collide as rarely as
possible is the most important part of course, and left as an excercise to
the reader ;P
Obviously it’s good to use as many bits for the unique pattern as possible, and the
way how free array slots are reused is important as well (e.g. LIFO vs FIFO). It’s
probably also good to write a little creation/destruction stress-test which
checks for handle collisions and can be used to tweak the unique-pattern creation for
specific use cases. A system where items are created and destroyed with a very
high frequency needs more effort (or simply more handle bits) than systems
where item creation and destruction is a rare occurance.
Other useful properties of handles
Apart from the whole memory safety aspect, handles are also useful for other
situations where pointers are problematic:
Handles can be used as shared object identifiers across processes (all you need is
some sort of ‘create_item_with_handle()’ function, which doesn’t create a
new handle, but takes an existing handle as input argument). This is especially
useful for online games where handles can be shared between the server and
all clients in a game session, or in savegame systems to store references
to other objects.
Sometimes it’s useful to create a whole group of related items (for instance
animation keys and curves), and reference the whole item group with a single
handle. In that case some sort of ‘range handle’ can be used, which contains
not only an index (of the first item), but also the number of items in the range.
In some situations it’s also useful to reserve a few handle bits for an item
type if static type checking at compile time isn’t sufficient.
In conclusion, I find it quite surprising how naturally and elegantly handles
solve many problems I encountered in the past with the traditional ‘pointers
to objects on the heap’ model, and how little I miss this model now (and the
parts of C++ that are built around it).
Some real-world examples
The sokol-gfx API is an example of a C-API which uses handles instead of
pointer of rendering resource objects (buffers, images, shaders, …):
…in the post above I was sort of handwaving away the problem of creating
the same unique-tag twice for the same slot, and a nice person on twitter
hinted me about a very simple, elegant and embarrassingly ‘obvious’ solution:
Each array slot gets its own
generation counter
, which is bumped when a
handle is released (can also happen when the handle is created, but bumping
on release means you don’t need a reserved value for “free slots” to detect
an invalid handle).
To check if a handle is valid, simply compare its unique-tag with the current
generation counter in its slot.
Once the generation counter would ‘overflow’,
disable
that array slot, so
that no new handles are returned for this slot.
This is a perfect solution for avoiding handle collisions, but the handles
will eventually run out since all array slots will be disabled eventually. But
since each slot has its own counter, this only happens after
all
handle-bits are exhausted, not just the few unique-tag bits.
So with 32-bit handles, you can always create 4 billion items, with at most
2^(32 - num_counter_bits) alive at the same time. This also means the number of
bits for the unique-tag can be reduced without compromising ‘handle safety’.
It may also be possible to re-activate disabled slots once it can be
guaranteed that no more handles for that slot are out in the wild
(maybe at special places in the code like entering or exiting a level).
Chances are
you’ve seen me on X
: unpacking hundreds of MacBook Pros to deploy in a datacenter. The video hit a nerve: insane enough at the first sight, yet kind of rational if you know what we know now.
So today I want to give some background into what it takes to build custom Mac racks, how we can start macOS instances from scratch in seconds and deliver new Xcode versions
mere hours after Apple releases them
.
So why MacBooks?
Because our customers need Macs. And because Apple didn’t give us another option.
Many of our customers build and test iOS apps. You can't build iOS apps without a Mac. The iOS Simulator only runs on a Mac. Moreover, in order to release an app to the App Store, Apple requires using a recent Xcode version.
xtool
xtool
is cool, but it is not (yet) a serious replacement. So your coding agent needs a Mac.
But still, why laptops? Isn’t it a major waste of screen pixels and keyboard buttons and battery ions? Well yes, Mac Mini would be a better choice for a datacenter. Sure, it has very rudimentary remote management, no redundant power, and a beautiful case that ensures that cooling will be difficult regardless of which side you lay it on. But these are all known challenges that we have learned to manage.
But have you actually tried to order a couple hundred Minis? We have. Ordered in January, delivered in July. Welcome to the world of 2026 when the supply chains are in disarray. Never mind that Apple doesn’t release updated CPU models to all devices at once. So Mac Mini didn’t get M5 cores for 10 months (and then suddenly got M6 before any other device model!). We promise the best and the newest to our customers so we had to be inventive. That’s how the MacBook-in-Datacenter project was born.
Our beautiful Mac racks
Good design takes iterations; and we surely didn’t get everything right from the first try. But I think we have the system nailed down.
Every MacBook is connected to an IP KVM for remote management. Indispensable when dealing with laptops. Unlike Mac Mini, laptop firmware is designed with the screen in mind: some maintenance actions can only be done by clicking buttons in the beautiful GUI.
Of course, every MacBook gets an external 10G Ethernet NIC. Many folks at Namespace are networking geeks and we are proud of the connection speed and reliability that we provide to customers.
And then there is power. So in total, four cables per laptop, forty-eight per shelf, plus twelve for Ethernet, plus KVM wiring. Let’s just say that careful cable management is essential.
Heat management too. Currently we are deploying custom-made holders, designed to wick the heat from the hotspots and guide hot air away instead of blowing it at the nearby machines.
Not the problems we expected: HDMI, FileVault, and USB NICs
Naturally, we expected problems and challenges. Just not where they appeared.
I bet some of you looked at the pic above, saw MagSafe cables plugged in and already started writing a snarky tweet that MagSafe is not safe and may get accidentally disconnected.
And yes, I was worried about that too. But the reality is that we have seen very few cases of MagSafe disconnections.
The most unreliable cable? HDMI! Often thick and inflexible. Tends to fall out every time you touch the shelf.
Luckily by now we found almost perfect cables that bend exactly as we want them to bend. And we bought the entire supply of them. There are zero more of them available to order on Amazon.
Another source of pain: FileVault disk encryption. Or rather decryption. When a MacBook reboots (in an unplanned fashion) it prompts for a password to unlock the local disk. The prompt is shown on the screen (of a closed laptop somewhere in the rack, doh). No problem, we thought: we have the KVM connected just for this case!
Nope, not so easy. The password prompt disappears from the external screen after 5 minutes of inactivity. Then we remembered that macOS Tahoe introduced a useful feature: we could
unlock FileVault remotely
using SSH protocol. Still no luck. On laptops it expires after 5 minutes too. Looks like the only way out of this state is to reboot by physically pressing the button and racing to unlock in time.
Mac reboot
While on this topic, a small tip: you can reboot a Mac in a way that will keep the disk unlocked when you need it:
fdesetup authrestart
.
And then there are simply bugs. Under certain conditions, an external USB NIC stops working and acts as if it is not powered and shows no link. Trying another cable, another NIC, another switch port, no luck. But a quick visit to Network Preferences, deleting and recreating the “network service” in MacOS Settings brings it back to life.
What about Mac Minis and Studios?
At the moment we actually have it easy: M5 and M6 Mac Minis and Studios are coming into our fleet soon. They are way simpler to manage in the DC: they have a built-in 10 Gb network card, they boot up automatically after a power cycle and the OS can be configured entirely automatically via MDM.
But Namespace has some special sauce for the Minis too. We design custom-made shelves that hold the machines with focus on efficient cooling. We have tested a few designs using airflow simulation to arrive at what we are deploying now.
In the end installing Mac Minis is a breeze: unpack them, throw 10 pieces into the holder, connect power and network and press the power button once (famously inconveniently located). From there on automation takes care of them.
Virtualizing Macs
Under the hood a Namespace instance is backed by a virtual machine. We have multiple virtual machine engines integrated into a unified platform to run Linux, Windows, and Mac instances in the most efficient way. This way we can provide the same features that make Namespace special, like
cache volumes
, telemetry, or VPC connections.
Unsurprisingly, our Mac solution is based on Apple’s excellent
Virtualization framework
. It is an embeddable and flexible virtual machine engine. It’s easiest to compare it to Firecracker in how it fits the system architecture: it implements generic VM operations end-to-end as well as typical peripherals.
For completeness, Apple also provides a lower-level
Hypervisor framework
, which is comparable to the KVM API of Linux. For instance QEMU uses it on macOS under the hood. Hypervisor provides a way to execute machine code in isolation, but requires the application developer to implement the bulk of machine architecture and peripherals. It could give us a lot of control, but unfortunately it cannot run macOS (it requires an Apple proprietary environment that third parties cannot, or shouldn’t, try to recreate).
In fact, most competing platforms are built on the same foundation. But the details matter: Apple gives us a few primitives that need to be arranged in just the right way to work fast and be secure. The more interesting thing is to watch how different people solve similar problems with different constraints.
Limitations of Apple Virtualization
A well-known limitation is that Apple only allows two macOS VMs per physical Mac. It can be a Mac Pro with 24 cores and 192 GB memory, yet it is limited to running only two guest VMs. This limitation leaks into our product offering: we can only slice Mac resources in two halves. So we run instances with 6 or 12 cores on 14-core Mac Minis and 8/16-core instances on 18-core MacBooks (we reserve a couple cores for management overhead).
An important consideration of Virtualization VMs is that the virtual CPU is executed by a separate OS process (VMM process in the diagram) from the software integrating Virtualization (here Namespace VM host). If we want to hook some VM behavior or implement custom virtual devices, every interaction with them requires an IPC roundtrip between the VM process and the “host” process. Such context switches are unavoidable and need to be taken into account when designing the system.
Virtual networking
Virtualization framework offers a few ways to connect a virtual machine to the network. For instance, bridged and NAT networking modes route traffic directly from the VMM process to the host network interfaces. These are suitable for VMs running on a local computer where the workload is trusted.
Namespace instances run untrusted code and we need to enforce policies on what a VM can or cannot access (these policies
can also be customer-defined!
). Also we provide a few additional services to the instances that should appear “as if” they were on the local network for the guest system.
This requires us to take full control of guest networking in the mode where we process every packet that comes out and into the VM in software. We based our guest networking on a userspace TCP/IP stack from Google gVisor project and use it to implement an IP gateway/firewall for the instances. This way we minimize exposure of the host OS to unprocessed packets controlled by the guest.
Network packet handling needs to be very efficient, but as outlined above the path involves IPC. The VMM process needs first to pass the packets to the “VM host” process, which then processes and passes them to the network interface. It takes careful implementation and batch processing wherever possible to minimize the number of IPC roundtrips.
The above approach allows Namespace MacOS instances to reach 4 Gbps upstream bandwidth (per
Fast.com
). This is unfortunately still lower than the line rate. We have been exploring alternative approaches, including ideas on how to avoid IPC for network processing entirely. But productionizing the new setup is still left for the future. After all, 4 Gbps is still quite respectable.
VM images
Creating your first VM using Apple Virtualization is very easy: download a macOS installer XIP, use UTM/Tart/any of the dozens of open-source Virtualization wrappers to start a machine, click through Setup Assistant, install Xcode and you are good to go. Now you have a VM image that you can fork and run any workload locally.
But you need to test on multiple versions of iOS, so you install a few iOS runtimes. And then you install the upcoming Xcode beta version (and new runtimes too). And before you know it your VM image has grown to 500 GB (iOS runtime packages are huge).
You also want to have the previous version of macOS for testing that one little thing. Another 500 GB right here. Apple releases the new macOS developer preview, one more image.
And then you realize that the Xcode beta version subtly breaks the non-beta Xcodes on the same system (true story!). After all, Xcode installation bumps the “global” versions of CoreDevice and CoreSimulator. Hence any bugs in the beta Xcode simulator are visible when you’re using ostensibly stable Xcode versions. So now you are maintaining image versions with and without the pre-release Xcodes.
And now you have 2 TB of VM images. On what? A 2 TB MacBook hard drive?
That’s the challenge we faced: we need to build, distribute, and store huge images across the fleet of hundreds of machines.
Build process
Building images is a repeatable process so that we can reliably produce new images when Apple releases new software versions. Building is driven by a script that replicates installation and configuration as a human user would do it (e.g. the build script can run shell commands, click UI buttons or reboot the VM). Wherever possible we stick to using controls designed by Apple to configure the VMs in order to avoid surprising behaviours inconsistent with what a typical local user would be seeing. Naturally, building images is an automated and repeatable process. It is driven by a workflow expressed as a sequence of operations in a YAML file. Operations can be VM control (e.g. reboot), running a shell script or programmatic interaction with the system or setup UI over VNC.
Resulting VM images are handed over to
Namespace internal Image Registry
, in fact the same one that handles Linux and Windows image storage, replication and distribution (covered in
the excellent article by Matteo
). Disk images are of course quite different from normal container images: OCI layers are simple tarballs of files, while disks are generally flat arrays of bytes. Very large arrays in fact. And to a large extent they contain empty space: that’s the disk space that would be available to users as free space.
Naturally, it would be very wasteful to transfer and store the “empty” data in the registry. So we developed a simple format that allows us to preserve the “sparse-ness” of the images when stored in the registry. Unallocated spans of the image take just a few bytes.
And there is another important optimization. Remember the example scenario mentioned in the VM Images section: we have an image of the same system that differs only in addition of an extra Xcode installation. Obviously the latter image is built using the former as a base and most of the bytes are unchanged.
Our storage format preserves the “shallow copy” relationship and stores such images as multiple layers: the base layer is shared between them, while subsequent layers only contain the modified blocks.
Distribution
At this point we have the images in an OCI registry now. But of course Virtualization framework cannot start a VM directly using a disk residing in the registry. It needs to have something on the node itself: a VM disk can be backed by either an image file on the local host SSD, or it can route disk I/O requests to a server using Network Block Device (NBD) protocol. The latter would allow us to intelligently serve highly demanded data from a local cache, while conserving on-device space by not storing unneeded blocks.
But NBD has the same drawback as userspace networking from above: every I/O operation would incur an IPC roundtrip at minimum, including buffer copying and context switches. You see the same pattern as with networking: a very direct hardwired and fast option and an indirect “software-defined” but disappointingly slow option.
At Namespace we value performance a lot, so the choice is clear: we’ll serve the images from the local disk. We need to materialize them from OCI images in the registry on the SSD of every node in the fleet. 500 gig images to hundreds and thousands of nodes. And we need to do it fast.
Obviously, every node naively downloading from the central registry was not going to work. With the example numbers we are talking about half a petabyte of traffic transferred within, conservatively, tens of minutes. The registry (and the network fabric) would need to serve terabits per second!
The bytes that we are distributing are the same going to every node so the obvious solution is to organize a peer-to-peer delivery of these blobs. Each block only needs to be downloaded from the registry once by some node. Then another node that is close by (by certain metric) can download the block directly from the peer and we have two copies. So two more nodes can pull these bytes and so on. The fleet is exponentially flooded.
BitTorrent
Obviously, BitTorrent was a heavy inspiration for this design. But unlike BitTorrent, which works in a public network of untrusted peers, we could make different tradeoffs leading to better efficiency and predictability. But that’s a topic for another post.
Storage
Now the bytes are on the node disk. But remember the storage optimizations we did in the Build Process? With the naive approach of storing the images on disk there are a lot of bytes that are useless: they are either holes or could be shared with another image.
Some of you probably know that these are exactly the types of storage optimization techniques that are possible with modern file systems, namely APFS.
ZFS
Linux users have seen the same features in ZFS.
Using these cool features is also pretty easy: open a new file for writing, seek to offset 100G, write a block. And there you just made a file with a large hole in it. Only the block you wrote is allocated on disk, the rest is 100 GB of imaginary zeroes. When reading the file you won’t even notice the holes. The OS will return actual zeros.
Sharing the blocks is similarly transparent: just use the
cp -c
mode or
clonefile
syscall. The new file will share the same disk blocks and essentially not take any space.
Writing to the cloned file is also transparent: as soon as you try to overwrite some blocks, these particular blocks will be allocated on the disk, while the shared portion will remain shared.
What’s next?
The pace at which we are expanding our fleet is increasing and the experience from all the above has transformed into a repeatable process. We know exactly how long it takes to bring a MacBook rack into prod. The rack assembly line is dialed in. DCOps people are trained. Disk images are built and distributed. We can bring whatever number of machines our customers need into the fleet when we need to (well, as long as we can purchase them at all).
We can still do better! What if there was a “holy-grail” device to host a shelf of MacBooks, providing power, ethernet and KVM connections over a single USB-C cable? It should be possible, yet there is currently no hardware on the open market that satisfies our requirements. So we are working on something very custom.
Or maybe we’ll do another crazy thing? What if we deploy phones to the datacenter? See what the future brings on our X soon!
OpenAI seems to be silently re-enabling model training on Codex chats
My company is pretty paranoid about leaking IP to the frontier labs through prompts, so we've all been diligent about disabling data sharing in Codex/Claude Code/etc. But yesterday my coworkers and I noticed that the setting had been silently reenabled in Codex. None of us knowingly opted back in.
You can check your settings here: https://chatgpt.com/settings/data-controls. Look for "Improve the model for everyone".
Curious if this is an isolated issue or something more widespread.
EDIT: looks like this has been noted before https://news.ycombinator.com/item?id=49643556
EDIT: apparently you can also turn off data sharing here: https://privacy.openai.com/policies?modal=take-control
Chance Miller Reviews the New A20 Pro iPad Mini
Daring Fireball
9to5mac.com
2026-11-03 09:51:14
Chance Miller, writing at 9to5Mac:
Unfortunately, the new iPad mini’s screen has one limitation: it
doesn’t support ProMotion, or a 120Hz refresh rate of any kind.
Instead, it’s still locked to 60Hz. This is an incredibly
frustrating decision that I can’t quite wrap my head around.
Apple touts ...
Apple’s smallest iPad has gotten its biggest update in years. The new iPad mini features a much thinner and lighter design, a larger OLED display, water resistance, and the powerful A20 Pro chip.
I’ve been testing the new iPad mini, and there’s a lot to like — but also a couple of frustrations. Here’s everything you need to know.
The new iPad mini lives up to the “mini” name even more than its predecessor. It’s significantly thinner, down from 6.3mm on the previous iPad mini to 5.4mm on the new model. In fact, that puts it very close to the ultra-thin iPad Pro and the unfolded iPhone Duo. Here’s how it compares:
Device
Thickness
13-inch iPad Pro
5.1 mm
iPhone Duo (open)
5.2 mm
11-inch iPad Pro
5.3 mm
iPad mini (2026)
5.4 mm
iPhone Air
5.6 mm
iPad Air (11-inch and 13-inch)
6.1 mm
iPad mini (2024)
6.3 mm
iPad (A16)
7.0 mm
iPhone 18 Pro
8.75 mm
iPhone Duo (closed)
11.3 mm
The new iPad mini is also significantly lighter, dropping from 293 grams to 255 grams. That puts it in the realm of the iPhone Duo, for comparison’s sake:
Device
Weight
iPhone Air
165 g
iPhone 18 Pro
211 g
iPhone Duo
254 g
iPad mini (2026)
255 g
iPad mini (2024)
293 g
11-inch iPad Pro
444 g
11-inch iPad Air
464 g
iPad (A16)
477 g
13-inch iPad Pro
579 g
13-inch iPad Air
616 g
The reduction in weight and thickness was immediately noticeable when I picked up the new iPad mini. It feels significantly nicer to hold, more premium, and less “dense” in my hands.
The new iPad mini features an 8.5-inch screen, a slight increase from the previous generation’s 8.3-inch display. The overall footprint is mostly the same (the new model is actually about 2.2mm narrower). The larger screen is possible because the new iPad mini’s bezels are 24 percent thinner than before.
In addition to allowing a bigger screen in the same form factor, the narrower bezels also modernize the iPad mini’s overall look and feel. The bezels are noticeably slimmer than the iPad Air and base model iPad, and slightly thinner than the iPad Pro.
With smaller bezels, a thinner chassis, and a lighter weight, the new iPad mini feels significantly more premium than before. It reminds me less of the base model iPad or iPad Air and more of the iPad Pro, just shrunken down.
Display technology
The big news about the display, though, is the switch to OLED. This marks Apple’s first non-Pro iPad to offer an OLED screen. It’s not the fancy tandem OLED display of the iPad Pro, but it’s a huge improvement over the previous model’s LCD panel.
The new iPad mini offers SDR brightness up to 600 nits, up from the previous model’s 500 nits max. The iPad mini also supports HDR content, with up to 1200 nits peak brightness.
The new iPad mini’s screen is undeniably an improvement over its predecessor. All of the inherent benefits of OLED apply here, including better colors, improved contrast, higher brightness, and more.
Unfortunately, the new iPad mini’s screen has one limitation: it doesn’t support ProMotion, or a 120Hz refresh rate of any kind. Instead, it’s still locked to 60Hz. This is an incredibly frustrating decision that I can’t quite wrap my head around.
Apple
touts
the iPad mini’s OLED screen as offering significantly faster pixel response time than the previous generation’s LCD panel, leading to improvements like smoother scrolling and reduced motion blur.
I’ve noticed that things like swiping between Home Screen pages, scrolling social media, and system animations are noticeably smoother. They aren’t, however, as smooth as an Apple device with a ProMotion display, and they’re not a substitute for a higher refresh-rate display.
I’m sure Apple knows the iPad mini’s market, and it seems to have decided not to prioritize ProMotion based on that information. However, as someone who has longed for a so-called “iPad mini Pro” for years, I’m disappointed by the decision. The new iPad mini’s screen is
so much
better … I just wish Apple had gone that extra step and added ProMotion. We’ve reached a point where ProMotion should be table stakes, especially after Apple brought it to the base iPhone 17 last year.
Nano-texture
For an extra $100, you can upgrade the new iPad mini to have a nano-texture display (on the 256GB and 512GB models).
I’m a huge fan of Apple’s nano-texture display and have it on my 14-inch MacBook Pro. On the iPad mini, I think it makes even more sense.
The iPad mini is ultra-portable, and you naturally carry it around and use it in different lighting environments. The nano-texture glass helps reduce reflections and glare in a wide variety of lighting conditions. I also really like the combination of the iPad mini’s book-like size and the nano-texture finish.
There is a slight tradeoff in color vibrancy compared to a glossy OLED screen, as on other Apple devices with nano-texture, but it’s a very minor difference in my experience. The screen still looks fantastic.
Speakers and durability
One of the more interesting changes with the new iPad mini is something Apple calls the “Acoustic Display.” Instead of traditional speakers with visible grilles, Apple has developed a new system that uses the display itself to produce sound.
Essentially, Apple has designed special woofers that vibrate the display to produce low and midrange frequencies. For higher frequencies, custom tweeters are hidden between the glass and aluminum enclosure. Apple says this new system delivers louder audio, “punchier” bass, and clearer highs, despite the iPad mini’s significantly thinner design.
In practice, I think the new iPad mini sounds great. I’d choose headphones or an external speaker for serious music or video consumption, but day-to-day the iPad mini’s built-in speakers are perfectly adequate. (I’d bet that this Acoustic Display technology shows up in future iPhones too, and the iPad mini is serving as a test bed of sorts.)
The Acoustic Display also plays an important role in another major upgrade: water and dust resistance. The new iPad mini is IP67 rated, which means it can be immersed in 1 meter of freshwater for up to 30 minutes. It’s the first iPad to have an official water-resistance rating.
Adding water resistance to the iPad mini is particularly notable given its size and portability. I naturally find myself wanting to take it everywhere, and water resistance makes that more feasible.
One use case where all these improvements really come together is reading. The thinner and lighter design, nano-texture glass, and water resistance make the new iPad mini the most compelling iPad yet to serve as an e-reader.
Performance
The new iPad mini is powered by Apple’s A20 Pro chip, which I already covered in detail in
my iPhone 18 Pro review
. The short version: the A20 Pro chip gives you plenty of power for anything you can throw at the iPad mini today.
One detail worth calling out is that Apple uses two different versions of the A20 Pro in the iPad mini. The 128GB and 256GB models feature a five-core CPU and 16-core Neural Engine, while the 512GB model gets a six-core CPU and Dual 16-core Neural Engine. All three configurations feature the same seven-core GPU.
I don’t think anyone should buy the 512GB version of the iPad mini just for those extra cores. You should pick your iPad mini configuration based on how much storage you need, not the version of the A20 Pro chip. You don’t need to worry about performance with the new iPad mini. And perhaps most importantly, the A20 Pro chip ensures the iPad mini has enough headroom for the future.
9to5Mac’s Take
There’s been a lot of consternation about where the iPad mini fits in a world where the iPhone Duo also now exists. It’s a fair question. After all, when the iPhone Duo is unfolded, the two devices share a similar form factor … but that’s really where the similarities end.
The iPad mini offers the full-fledged, unapologetic iPadOS experience. It supports the full multitasking prowess of an iPad Pro, including windowing and the menu bar. The new iPad mini also supports extended display mode, so you can plug it into an external display and extend your iPad experience there.
The iPad mini also gets iPadOS app layouts, and most importantly, a desktop-class browsing experience in Safari. It’s a remarkably capable device in a remarkably compact form factor. It fits where other iPads can’t, yet it runs the same version of iPadOS as other iPads.
The new iPad mini does all of that, but better than before. The thinner, lighter design paired with smaller bezels gives the new iPad mini a meaningful visual refresh. The added water resistance means you can do even more with the compact and pocketable iPad mini design.
But all of this comes at a higher price of $699. This marks the second price increase for the iPad mini this year. It started the year at $499, rose to $599 as part of
Apple’s broader price increases
in June, and is now $699 as of this refresh.
The new iPad mini also still starts with 128GB of storage. Increasing the base storage to 256GB would’ve helped ease some of the pain of that price increase. It’s also getting increasingly hard to manage a device with 128GB, particularly with the
storage needs
of Apple Intelligence and Siri AI. The lack of ProMotion and Face ID also make the price increase sting more.
Ultimately, the iPad mini form factor is a joy to use. The design feels great in the hand, and having the full iPadOS experience in such a compact device remains impressive. It’s not quite the “iPad mini Pro” I’ve always wanted, but it’s big upgrade to a form factor that I’ve always loved.
FTC: We use income earning auto affiliate links.
More.
Binance battles to save its brand after record $6.3bn crypto hack
Guardian
www.theguardian.com
2026-11-03 09:45:30
World’s largest crypto exchange faces fallout from angry customers, and Lula wins with WhatsAppThis was originally published in TechScape, a newsletter about how technology shapes our lives. Sign up to receive it hereThis week in tech, we’re discussing the fallout from the multibillion-dollar hack o...
This week in tech, we’re discussing the fallout from the multibillion-dollar hack of Binance and the significance of Lula’s political mobilization on
WhatsApp
.
And if you’ll be at Web Summit in Lisbon next week, drop me a line! I’ll be there moderating panels on open-source
AI
and human agency in the age of AI agents.
After a multibillion-dollar hack, Binance faces a crisis of trust
The world’s largest
cryptocurrency
exchange endured the world’s largest online theft late last week. Binance was hit by a $6.3bn heist that, according to experts, was likely the work of North Korean hackers.
More than $2.5bn of the $6.3bn was taken in one transaction alone. A
Binance
engineer’s laptop was infiltrated, which in turn allowed the attackers to drain wallets. Binance later added that there were “additional points of breach” in its systems. The exchange said on X it would “cover all losses” and that “user funds are safe”. It also said it had frozen about half the funds targeted in the hack, stopping the thieves from making off with that tranche of cryptocurrency.
Most customers won’t have legal protections. Crypto users are not covered by formal deposit protections in countries such as the US, UK or Australia, meaning they won’t be reimbursed by their governments for their losses if an exchange is hacked or goes bankrupt. In Australia, you can claim a capital loss on your tax return if you can offer proof that a crypto asset was lost or stolen.
Binance, which was hacked last week.
Photograph: Beata Zawrzel/NurPhoto/Rex/Shutterstock
As Binance worked to contain the technical damage from the hack, it faced fallout from angry, scared users. The company announced Sunday afternoon that it had processed $4.6bn in withdrawals and $1bn in deposits, resulting in a net outflow of about $3.6bn – representing 2.1% of its $171bn in total assets under management.
Yesterday, former Binance CEO Changpeng Zhao warned that crypto scammers are now in “overdrive”, circulating screenshots of fake recompense schemes that promise $150 in free compensation for withdrawal suspensions. Binance has confirmed that it is false information and the screenshots are digitally altered. The hack has also spooked traditional financial markets, with investors also pulling out funds from Bitcoin exchange-traded funds in the US.
Yi He, co-founder of Binance and longtime partner of Zhao, has said that the company’s top priority was to “ensure the environment is secure, after which users can withdraw their funds and Binance can resume operations”. Alongside a proof of its reserves, the company tweeted: “Our commitment is unchanged: Binance will absorb the financial impact of the stolen funds, not our users.”
The name Binance was already associated with crime before the hack. Zhao pleaded guilty to violating US anti-money laundering laws in 2023 and stepped down as CEO. It’s no FTX, but the company faces an uphill battle to save its brand from $6.3bn worth of permanent damage.
Less than two weeks ago, Brazilian president Luiz Inácio Lula da Silva was accusing Meta of suppressing his posts on Instagram and Facebook and attempting to derail his campaign. Flávio Bolsonaro, his opponent and the son of the previous president, had all the momentum after the country’s first round of elections. Lula’s supporters felt like they would be crushed under the rightwing wave sweeping over Latin America. Meta denied bias but acknowledged technical failures in response to Lula’s accusations.
We will likely never know the full truth of what Meta did or did not do for Lula. Individual algorithmic moderation mistakes – usually a few egregious ones among millions of otherwise unobjectionable choices – seem like bias in times of heightened political tension. That’s what Meta says happened in Brazil. Raging against those errors makes for engaging posts, which outsizes the glitches’ significance. The history of accusations against Meta of political interference is arcane and complicated. The motives of everyone involved are suspect. Independent studies conducted after the 2020 US election showed that
rightwing content traveled further on social media
than leftwing posts do. That small data point indicates it may not have been the heavy thumb of Meta on the political scales in Brazil.
During the second-round runoff, Lula, 81, bought a smartphone for the first time and assembled WhatsApp groups of millions of supporters who mobilized in response to the threat of yet another Bolsonaro. (WhatsApp is owned by Meta.) At the helm of these channels was André Janones, the captain of “Lula’s army” and a federal deputy from the state of Minas Gerais. Janones issued daily social media challenges to the supporters he called his “soldiers”.
Lula celebrates with supporters after winning his presidential runoff against Flávio Bolsonaro.
Photograph: Alexandre Meneghini/Reuters
The successful campaigning via WhatsApp bears out a prediction that Meta CEO Mark Zuckerberg made in 2019: that the “digital living room” of private direct messaging and group chats would eclipse the “town square” style of public social media feeds. Lula’s supporters gathered in channels full of friendly faces to participate together in on-the-ground canvassing. Janones wasn’t posting to convert the general populace to his side. He was motivating the base with online communication to pursue IRL action. Members of Lula’s army were explicitly instructed supporters to neither share nor respond to posts from the opposition, displaying an understanding that any engagement boosts algorithmic reach in public social media.
Lula won the Brazilian election by 5 million votes, securing an unprecedented fourth term. After Janones’s innovative use of WhatsApp, Lula’s accusations seem like politicking borne of desperation. Lula also plays into longstanding conflicts between Brazil and tech giants like Meta. A decade ago, the country’s supreme court suspended WhatsApp, the very app Lula rode to victory, in a fight over end-to-end encryption. The court has also ordered investigations into Google and Telegram executives. In 2024, a supreme court justice banned Elon Musk’s X from the country after Musk refused to ban accounts threatening democracy and froze the financial accounts of his satellite internet company Starlink.
Having a common enemy helps to galvanize a base of supporters. In Lula’s case, the enemy was an easy target: a foreign tech company accused of interfering in Brazil’s democracy, as did Jair Bolsonaro, Lula’s longtime foe. According to my colleague
Jonathan Watts
, among the most popular chants of Lula supporters was “Hey Meta, vai tomar no cu!” (Hey Meta, go take it up the arse!).
Ashley Hinson’s Digital Chief Oversees Firm Paid Millions to Push Israeli Propaganda
Intercept
theintercept.com
2026-11-03 09:39:10
The GOP candidate for Iowa’s open Senate seat tapped the co-founder of a consulting firm with a $9.9 million Israel contract.
The post Ashley Hinson’s Digital Chief Oversees Firm Paid Millions to Push Israeli Propaganda appeared first on The Intercept....
The person in
charge of digital strategy for the Senate campaign of Iowa Republican Rep. Ashley Hinson helps run a company that received nearly $10 million to influence Americans with pro-Israel propaganda.
In September 2025, Hinson — who is battling Democratic state Rep. Josh Turek in a tight race that could decide control of the Senate — tapped Abe Adams to lead her campaign’s digital efforts.
Adams is a co-founder and managing partner of Targeted Victory, a digital consulting firm that has been used by high-profile Republican candidates such as Ted Cruz and Marco Rubio. Targeted Victory shares an address and much of its staff with Targeted Communications Global — a related company with no discernible online presence. Both are subsidiaries of marketing company Stagwell Global.
Israel awarded Targeted Communications a $9.9 million contract in March 2025 focused on social media and paid advertising, documents show. By October 2025, the firm was at work pitching news content and guests on Fox News and CNN, and creating
YouTube ads
suggesting young Iranians have been educated to believe the “most sacred thing they do is stab a Christian in the heart.”
A June 2026 Department of Justice
FARA filing
from Targeted Communications details much of the firm’s work for Israel. The document lists 10 registered foreign agents working on the Targeted Communications contract for Israel. Six of them are identified as Targeted Victory employees on the company’s website or their LinkedIn accounts. Adams is not named in the filing.
Hinson, Adams, and Targeted Victory did not immediately respond to requests for comment.
Adams is not the only Hinson campaign adviser with ties to Targeted Victory and the Israel lobby. Hinson’s current deputy campaign manager, Addison Lavis, worked at Targeted Victory before serving as Hinson’s campaign manager in her 2023 congressional run. Lavis was previously an intern at AIPAC. Lavis did not immediately respond to a request for comment.
Hinson has received more than $100,000 from AIPAC and related pro-Israel PACs in 2026, and as an Iowa state representative
supported
legislation that prohibited the state from working with any companies that boycott Israel.
Hinson’s political action committee has paid Targeted Victory more than $1.6 million this election cycle for digital consulting and ads — 27 percent of its total expenditures, according to Federal Election Commission
filings
.
Israel’s deal with Targeted Communications is part of a major public relations push that has pumped more than $100 million into swaying public opinion, particularly among young conservatives, back toward Israel.
Apple’s Analyst Calls Have Been Scripted for Decades
Daring Fireball
9to5mac.com
2026-11-03 09:39:03
Bloomberg opinion columnist Dave Lee:
Apple investors and fans hoping to get an insight into the
philosophy of new Chief Executive Officer John Ternus on Monday
were left sorely disappointed. The 51-year-old’s first earnings
call was a timid affair, with Ternus taking cover behind a
carefully wr...
Apple investors and fans hoping to get an insight into the philosophy of new Chief Executive Officer John Ternus on Monday were left sorely disappointed. The 51-year-old’s first earnings call was a timid affair, with Ternus taking cover behind a carefully written script as analysts peppered him with questions.
Lee acknowledged that the slump in pre-market trading will have been largely driven by Apple’s caution about rising expenses in the current quarter. The company said that memory costs were continuing to rise and that building out Siri AI data centers we’re going to add to the RAM bill. But he argued that Ternus missed an opportunity to talk up the company.
In front of Ternus on Monday night was a chance to counteract the gloom and doom by instilling in Wall Street the fundamentals of the Ternus Doctrine — what he sees Apple becoming under his tenure, the “product guy” taking the company to a new era of innovation. Instead, he spoke like a man glancing at the clock and wishing the minutes away.
Ternus fielded some questions but also delegated answers to Chief Financial Officer Kevan Parekh and Chief Operating Officer Sabih Khan, who Apple said would participate in earnings calls moving forward, something the company hasn’t done for years. Ternus projected confidence on the call, but he appeared to stick mostly to scripted marketing points.
9to5Mac’s Take
It will of course take Ternus some time to develop his own style when it comes to all of the varied aspects of the role, including addressing analysts in earnings calls, but I thought he took a measured but optimistic approach. Given the famously reticent style of his predecessor, the criticism strikes me as rather odd.
No pressure, right? Early voting numbers have reportedly slowed since 2025, particularly in the Commie Corridor, which saw a 34 percent drop in early voting this election, but early voting
increased in majority Black districts across the city
, including Central Brooklyn (a 50 percent jump) and parts of Southeast Queens. (By the way, if you live in New York City and procrastinated on voting—and who would do something like that, especially if they had to work overtime on election night, ha ha ha—
here's where to find your polling site
.)
But before all that happens, Hell Gate will be doing our usual live blog dance: running all around the city all day, talking to voters, catching up with candidates, and generally taking the temperature on whether New Yorkers consider this
weird and wild midterm
to be a referendum on Trump 2.0. (And don't forget about
those ballot proposals
!)
Until then, keep refreshing, and we'll keep reporting.
And don't forget to
subscribe to Hell Gate
to support independent worker-owned journalism, from live blogs like this one, to features, to columns and newsletters, to our podcast, to our events, and more! We can't do any of this without you.
Apple’s New iPhone Release Schedule Seems to Pay Off
Daring Fireball
x.com
2026-11-03 09:30:40
Horace Dediu, tweeting yesterday on Apple’s results:
iPhone grew at 17% sales which is amazing considering they did not
launch the 18 or the Duo or the new Air in the quarter.
The Duo didn’t launch until October, which is Q1 (in Apple’s financial calendar). And the Air, last year, was not a bi...
UK meat processing firms’ fridges heat up after cyber-attacks in Europe
Guardian
www.theguardian.com
2026-11-03 09:29:37
Cybersecurity experts say incidents had minimal effect but may represent the ‘foothills’ of a wider threat Meat processing firms in the UK have been hit by cyber-attacks after hackers raised the temperatures of supermarket freezers across Europe. The UK’s National Cyber Security Centre (NCSC) said i...
Meat suppliers in the UK have been hit by cyber-attacks after hackers raised the temperatures of supermarket freezers across Europe.
The UK’s National Cyber Security Centre (NCSC) said it was working with the affected companies but that the national impact was minimal.
Speaking at the launch of the
NCSC annual review on Tuesday
, the centre’s director of operations, Paul Chichester, said: “We’re aware of those incidents in the UK, and obviously we’re working with the affected organisations. We’ll keep monitoring that.
“At the moment, the impact is minimal.”
Cybersecurity experts meanwhile reported that attacks on “dummy” fridge controls – deliberately placed online to lure would-be hackers – displayed characteristics similar to previous malicious operations linked to Russia.
Retailers in Belgium, Estonia, Ireland, Finland, Luxembourg, the Netherlands and Sweden reported
problems with their refrigeration systems
on Monday – with some rising to as high as 50C (122F) – and several companies confirmed they had been hacked. It follows similar incidents
in France last month
. It has emerged that the cyber-attack on French supermarket fridges involved legacy technology connected to internet with default passwords.
No UK grocery chain has been directly affected so far.
Chichester said the NCSC, part of the GCHQ spy agency, was working with organisations to identify similar loopholes in their technology and close them before hackers exploit them.
He said the NCSC was not able to comment on who might have carried out the attacks, but that they were not AI-enabled and had used vulnerabilities that had been “out there for a long period of time”.
The NCSC’s chief executive, Richard Horne, said the fridge attacks represented the “foothills” of an enlarged cyberthreat that companies and the public face as AI systems highlight flaws in IT networks that owners were not aware of or neglected to patch.
“There are so many vulnerabilities out there that … you could say are waiting to be exploited,” he said.
The agency’s chief technology officer, Ollie Whitehouse, said everyday domestic devices connected to the internet would be susceptible to hackers in certain situations. He said manufacturers needed to be encouraged to make their technology safer, and consumers needed to accept paying more for safer equipment.
The British Association of Independent Meat Suppliers (Aims) told the BBC some of its more than 300 members had been affected, with one company’s cold units heating to up to 100C and another two reporting their units had started to defrost. Aims said the affected units were empty at the time and no produce was lost.
Cybersecurity researchers said attacks on dummy Danfoss fridge controls – which were targeted by the hackers in mainland Europe – were similar to recent operations linked to Russia.
Xavier Bellekens, the chief executive of the cyberdefence firm Lupovis, said it had recorded 256 attempted attacks from 91 different sources between 20 October and 30 October after setting up online “honeypot” traps that are indistinguishable to attackers from real Danfoss fridge controllers.
The attackers attempting to gain control of the dummy
controls remained anonymous, but most of the authentication attempts used the manufacturer’s publicly documented factory-default username and password credentials.
They also used what Bellekens called “bulletproof” hosting, which means using internet service providers that are particularly tolerant of malicious activity, often ignore abuse complaints or make it difficult for authorities to disrupt their customers’ operations.
“What caught our attention was the overlap between infrastructure involved in the recent probing activity and infrastructure we have previously associated with Russian-linked malicious operations,” he said.
“While we are not able to pinpoint a group yet, the number of actors that fit this bill is relatively small and the bulletproof hosting we have seen being used by these actors for probing was also being used by Russian groups some time ago.”
My favourite kind of software to build is social software. In the age of AI-assisted coding I've been thinking a lot about motivation - namely, what kinds of things motivate me when the motivation of solving hard problems and the joy of writing code have been taken away by AI - and I'm coming to the conclusion that what motivates me most of all is building tools for people and seeing them used.
This makes sense. During my PhD, which was quite a lonely time, I built a social network called
Sweet
.
Because I had no idea what I was doing, Sweet was very poorly coded and riddled with bugs, but it also had a strong identity which encouraged certain kinds of people to stay and contribute. It was cute, cosy, ad-free, queer, and prioritised safety using tools like a whisper system where bad actors could be silently flagged. It didn't have metrics for likes or reactions, had a chronological feed, and members were encouraged to actively contribute ideas to Sweet's development. Sweet was a wonderful experiment and when I shut it down it was because the burden of moderation and upkeep of a deteriorating codebase became too much to bear on top of a full-time job.
It's been a few years since I shut down Sweet, and I miss it more and more each day. In this miserable historical moment, which might also be the crack in the wall of techocapitalism through which utopia emerges, I am increasingly certain of a couple of things:
People need better ways to be social and commmunal together.
There is not yet a perfect tool out there to enable communities that are safe, cosy, and energising.
People may crave sociality - which is why they use the social tools of what my friend Kit reminds me is called the "Californian Ideology" - but they also deserve data sovereignty, privacy, and interoperability. None of these are what people
look for
when they look for somewhere to build a community - but these are the things that make that community work in the interests of its users, not capital.
Creating communities in person is vital, but so is creating tele-communities - communities over long distances. This is the original promise of the Internet and it's still an incredible promise. As our enemies become more powerful and capable, we must also become more powerful and more capable, and creating communities which are open to everyone around the world and give those people sovereignty and control is one step in that direction.
I can't stop coming up with new ideas for social networks.
Thus follows a shortlist of ideas for social networks I've had over the last few years. Almost all of these are bad. But in amongst them there is maybe a glimmer of utopian possibility for online community.
A social network built like an allotment
. The whole network is a grid of 128 plots. Each plot is a possible user page for someone to write posts and share images. If all 128 plots are occupied, new users join a waiting list. Each user has to tend to their plot once every 7 days by posting something. If they don't, after a grace period, their plot gets composted and offered to the next person on the waiting list. But beneath that new person's posts, visitors can still see the compost of all previous people who tended this plot. There's no 'wall' or 'general feed' - visitors can visit individual plots and see what's growing there.
A social network for ten people for a week
. People join a waiting list. When there are ten people on the list, they are all put in a tiny private chatroom for a week, where they can post, answer icebreaker questions, and get to know each other. After a week, the chatroom is deleted or archived.
A social wiki
. People write posts, but others can then share and edit these posts. There are no comments, so edits to posts also need to incorporate their own comments. Posts drift further and further away from their original authorship, and further into something communal and shared.
A sea of tiny social networks
, where one person with one account can take on different personas in different communities.
A social network called Twelve
, where each user can have at most twelve followers and themselves follow at most twelve people. This is because twelve is an inherently funny number. Even funnier would be a social network where each user has to follow
exactly
twelve people before they're allowed to post anything.
A place combining a traditional feed for long form posting with a live 'firehose', IRC-style chat channel running alongside.
Updates on the mundane charms and joys and woes of the day could go in the chat channel. Longer posts could go in the main feed. This would be a place for a small, cosy community, self-hostable but also offered as a hosted service for a small annual fee. All data could be easily exported and imported. This could be a place for an interest or hobby group (open to newcomers), or a private community of friends. Public communities could optionally feature in an open directory. This is my newest idea, and the one I'm most excited about.
If you want to help me build a better social network, reach out!
At the recent EMFCamp, I bumped in to
Professor Kate Devlin
who was talking a little about the
AI Resist List
. I think one of the useful things we can do is loudly complain about shitty uses of AI. Here's an example.
As mentioned in a previous post, I'm
contacting companies which send malformed calendar invites
. One of the organisation I contacted was the British online supermarket Ocado. They don't have an easy way to contact their technical team, and no obvious paths to raise a bug report, so I filled in their usual customer service feedback form. I included a clear statement of the problem and a detailed technical analysis of why I thought it was a problem with their service.
After sending in my message, I received this back from "Lulu" at Ocado:
Thanks for getting in touch and sharing this feedback about our calendar files.
You're entirely right—having a technical glitch pop up when you're trying to organise your delivery is a real pain, so I've made sure to pass your feedback on to our technical and webshop team.
We really appreciate you taking the time to help us improve our service. I hope you have a wonderful rest of your day
Next up is the em-dash.
Beloved by chatbots
but almost unheard of in British English style guides.
Finally (and this is hard to quantify) it just doesn't
feel
like a customer service response. They're usually poorly spelled, have dodgy grammar, and ask a bunch of irrelevant questions. The message gave me no confidence that anyone had looked at the problem and I doubted it had been passed on to a technically competent human.
I immediately got a customer satisfaction survey. Usually I give top marks to humans because, even though
Net Promoter Score is bullshit
, I don't want customer service agents to suffer the indignity of a bad review. But in this survey I vented my spleen - giving crappy 1 ⭐ scores on every metric and complaining vociferously about how
rude
it is to use an AI to deal with a genuine complaint.
I was both surprised and delighted to receive this back a few days after my invective was sent:
I saw your survey comment about getting a robotic, AI-generated response previously, and I wanted to reach out personally to apologise. There is nothing more frustrating than pointing out a legitimate bug only to feel like you're talking to a brick wall. I promise you there is a real person typing this out!
Second, I wanted to send a massive thank you for the incredibly detailed diagnostic. It is rare to get feedback that tells us
exactly
what is broken and how to fix it.
I can assure you that this has been passed to our team to look into. Your feedback is going to make things much smoother for a lot of people, and we really appreciate you taking the extra time to help us get it right.
Thank you again, I do hope that this issue is resolved quickly. If there is anything else I can help with in the meantime, please don't hesitate to get in touch.
Perhaps I'm being touchingly naïve, but that
feels
a lot more human, right? The grammar isn't perfect, the sentences are a bit more rambly, and it appears to have actually engaged with the contents of my message.
I get that having a million irate customer service messages is a hassle. Using AI to triage them probably makes business sense, summarising the verbose ones could be useful for customer service agents, and totting up general themes is almost certainly a sensible way to gather metrics without overloading the workforce.
But using an AI to reply to a human is just disrespectful. It says the organisation values their customer's time at less than their own.
It's OK to call out shitty AI responses and insist that a human engages with you.
Security updates for Tuesday
Linux Weekly News
lwn.net
2026-11-03 09:10:12
Security updates have been issued by AlmaLinux (bind, bind9.16, firefox, freerdp, ghostscript, kernel, kernel-rt, libXi, perl-YAML:1.24, perl:5.32, pipewire, qt5-qtbase, redis:6, tomcat, and wireshark), Debian (chromium, git-annex, incus, kernel, and strongswan), Fedora (barman, erlang-hex_core, gli...
World of Warcraft: Forever,
a re-imaginging of the legendary MMO,
comes out Wednesday. The idea is to recapture the feeling of discovery and wonder players had when adventuring across its world for the first time back in 2004.
But 2026 is a very different time. Subreddits dedicated to the game are already overrun with AI-generated addons that rip off longtime developers’ work, and a company that helps players track their damage output tells me it is making changes to its API because of the inundation of AI slop addons.
Warcraft Logs is
a long-running site
made by Archon.gg that lets players track and share their logs of particular in-game fights so they can analyze them for ways to get better. This works by players downloading Archon’s software which records the data of their fights and uploads them to the site. Warcraft Logs makes its API available for free to other developers. It used to be mostly hobby developers, the CEO of Archon.gg and Warcraft Logs, who goes by Sildri Silentcrest, told me. Now, it’s increasingly commercial projects, which are supposed to ask for permission in order to head off projects that would break Warcraft Logs’ terms of service or wouldn’t be able to scale.
“There’s been [an] explosion of development,” Silentcrest said. “Now, we’re averaging a[t] least one commercial ask per day. And I’m sure there are more that are commercializing without our approval. One new World of Warcraft analysis company every day! It's hard to keep up.”
At the root of many of these is the explosion of vibe-coded sites and addons. Addons are custom pieces of software a
World of Warcraft
player loads into their game for a specific benefit. Maybe they want a guide on the most optimal questing path to take, so an addon shows them the way on their minimap; or they want to make big changes to the UI. Some developers make real money from these, either by running Patreons or receiving ad revenue from Curseforge, the main repository for
World of Warcraft
addons.
If you scrolled any of the
World of Warcraft
subreddits in the past few weeks, you likely came across someone posting about the new addon they ‘created’. Sometimes the poster discloses they used AI, other times they add an update later after being called out. There’s
even a tool for players to use
Claude or Codex while they’re in
World of Warcraft,
so they can keep making addons in the game.
And with the flood, Warcraft Logs is changing its own API. “We're changing our API to better align with the applications we want to enable. We like things that help our community to dive deeper into their data, like tools that give you a deep dive on why you died to a boss or how you can improve on your next attempt. We don’t like things that effectively scrape lots of the data from our site to show surface-level info on their own site. Unfortunately, the ‘scrape and show basic statistics’ type has become much more prevalent,” Silentcrest said. They said Warcraft Logs is also introducing a paid commercial key “so that developers with commercial ambitions can support the foundation for the projects.”
Addons have been a crucial and thriving part of
World of Warcraft
for essentially the game’s entire life. Developers have spent many, many hours crafting those over the years. Now, AI is ripping those off too.
“People are making rip-offs of my work and copying my ideas,” plusmouse, a
well-known addon creator
, told me. Plusmouse gave one example: a particular design for nameplates in the game, which are the bars that appear above an enemy’s head.
“Prior to that releasing I hadn’t seen any addons adopt that style of design, and now, it feels like every AI addon ends up using that idea,” they said. Plusmouse has found in some cases the code is so similar in the AI-generated versions, that they submit copyright complaints to Curseforge. “Sometimes the code is so similar the complaint results in a takedown, other times it’s
just different enough
to get away with it, despite feeling like my solution. Borrowing ideas is normal in addon development, but doing it on the scale that AI permits isn’t,” they said. Plusmouse said they made some of their GitHub repositories private, which they believe has stopped LLMs from using their code.
Another key part of
World of Warcraft: Forever
is that the game is letting players engage with it in their own, preferred way.
“If I can be hopeful, the ubiquity of services under development will allow people to pick their own experience,” Silvercrest added. “If they want to take their time and explore in a relaxed manner, then they can. If they have limited time and want to get to endgame content quickly, they can do that too. On the flip side, my worry is that there will be lots of abandonware that will frustrate users with out-of-date information, buggy software, and vulnerabilities.”
Silvercrest said staff at Warcraft Logs “feel pressure to do more,” and the site has used some AI itself for research and some code review. “We have a small team. People are using our API to vibecode features that are on our own to do list. Should we take those features off our list? Or should we bite the bullet and lean into AI tools ourselves?”
They added, “Two years ago, say we had 200 developers using our API and two or three or four were being abusive. Today, 10,000 developers are using our API and 1,000 are being abusive. The ratio has changed, and that really feels bad. It used [to] be developers respecting other developers’ hard work. I'm not sure what’s changed. Is it that Claude doesn’t read the ToS? Or is it that the new developers don’t care as much as the old? We seriously love some of the tools that this coding accessibility has enabled, but policing API use has become a struggle.”
About the author
Joseph is an award-winning investigative journalist focused on generating impact. His work has triggered hundreds of millions of dollars worth of fines, shut down tech companies, and much more.
UK school estate hit by 3AM ransomware in suspected AI-assisted attack
Bleeping Computer
www.bleepingcomputer.com
2026-11-03 09:00:00
A 3AM ransomware affiliate targeted a school estate in the UK and successfully encrypted around 37 of nearly 50 machines reached from an unmanaged host. [...]...
A 3AM ransomware affiliate targeted a school estate in the UK and successfully encrypted around 37 of nearly 50 machines reached from an unmanaged host.
Researchers at cybersecurity company Bitdefender believe the threat actor may have used AI-generated commands and an automated agentic loop to carry out the operation.
The conclusion is based on a sequence of repeated commands that were slightly modified at each attempt and issued at roughly regular intervals of 40 to 100 seconds.
"We were not able to access the machine the attacker worked from, so we cannot document anything about the language model itself: which model it was, whether it ran locally or remotely, or even whether a person was copying and pasting instructions and results between the implant and the model,"
Bitdefender explains
.
The researchers note that they could only document the behavior, and it looked similar to an agentic loop.
Attack overview
Source: Bitdefender
The malicious activity spanned between September 10 and19, but Bitdefender could not establish the attacker’s initial access method.
The threat actor used a modified public PowerShell tool to extract and decrypt credentials stored on three Veeam backup servers, copied a Chrome database containing credentials, and deployed Mimikatz and LSASS memory-dumping tools.
They mapped domain relationships and searched logon-script folders for references to other schools, eventually creating two backdoor domain administrator accounts named ‘library’ and ‘svc_bkpmon.’
After stealing financial data from compromised machines, the attacker configured two-way trusts between three previously separate Active Directory domains to expand their reach.
In the final stage of the attack, they attempted to remove Sophos and Bitdefender protection from reachable hosts, delete system-state backups, and deploy 3AM’s Rust-based encryptor. They succeeded in about 37 cases.
Attack timeline
Source: Bitdefender
The 3AM ransomware threat
emerged in 2023
and came to public attention when an attacker deployed its Rust-based ransomware after LockBit was blocked.
A notable past victim is Kootenai Health, where an August 2024 attack exposed personal information belonging to more than
464,000 patients
.
Regardless of the current level of AI tool involvement in 3AM attacks, Bitdefender’s observations suggest the threat actors appear to be experimenting with them heavily.
Earlier today, the NCSC in the UK published this year’s ‘The State of the Cyber Nation’ report, urging critical infrastructure to
prepare for AI-powered ransomware attacks
by 2028.
CVE-2026-98432
was first published on October 15th, thanks to Linux's
cautious CVE policy
.
On October 24th, after a blog post by Anthropic, it had a CVSS score of
9.8 assigned.
Since this was a critical vulnerability, patches and advisories
followed quickly:
Debian
12 was patched on the 17th (before the CVSS score was revised), while 13
was patched on the 2nd November.
SUSE
had the fix in Leap on the 25th, and on other branches no later than the
29th.
Except for Ubuntu.
At time of writing (3rd November), Canonical does not have a fix in
their main repositories. This morning, they released a fix to the
proposed
pocket
, for some of their distributions, for "users who run their
own kernel acceptance tests".
Their blog post also takes the time to remind the reader that if you
paid for Ubuntu Pro, you can get security updates for their older LTS
branches for longer. This is a strange thing to point out when all of
the versions that you can pay them for don't actually have this security
patch yet (not even in a proposed pocket).
For now, I guess RedHat's nftables mitigation will have to do. For
the future, the reasons to choose Ubuntu over Debian are only growing
weaker (at least on the server side). At least, if you're not paying for
pro.
Latino Voters Swing Away from Trump for "Terrorizing Our Communities": Marisa Franco of Mijente
Democracy Now!
www.democracynow.org
2026-11-03 08:50:38
In 2024, Donald Trump won the presidency with the support of 44% of Hispanic voters, suggesting that a major realignment in party preferences might be underway. But just two years later, it appears much of that support has eroded. Sixty-one percent of Hispanic voters say they will now support Democr...
In 2024, Donald Trump won the presidency with the support of 44% of Hispanic voters, suggesting that a major realignment in party preferences might be underway. But just two years later, it appears much of that support has eroded. Sixty-one percent of Hispanic voters say they will now support Democrats in the midterms, including 11% who previously had voted for President Trump.
We get a bird’s-eye view of what to expect from the Latino vote from Marisa Franco, the co-founder and director of the advocacy organization Mijente. While
ICE
brutality will be at the front of voters’ minds, she says, Democrats cannot continue to take Latino voters for granted. “The vast majority of Latinos are working-class. Quite simply, they voted for Trump because they were looking at issues of economy, cost, inflation,” explains Franco. “And at the end of the day, these same issues have worsened under Trump’s administration, under Republican control. So people, I think, are looking for someone who’s going to explain what’s happening and propose solutions and be dogged about finding them.”
co-founder and director of Mijente, a national organizing hub for Latinx and Chicanx communities.
Please check back later for full transcript.
The original content of this program is licensed under a
Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License
. Please attribute legal copies of this work to democracynow.org. Some of the work(s) that this program incorporates, however, may be separately licensed. For further information or additional permissions, contact us.
Democratic Socialists on the Rise: Darializa Avila Chevalier & Claire Valdez Set to Win House Seats
Democracy Now!
www.democracynow.org
2026-11-03 08:41:23
New York City is preparing to send two DSA members, presumptive election night winners Darializa Avila Chevalier and Claire Valdez, to Capitol Hill. DSA-backed candidates made historic gains in this year’s Democratic primaries, with at least five expected to join current DSA members Rashida Tl...
New York City is preparing to send two
DSA
members, presumptive election night winners Darializa Avila Chevalier and Claire Valdez, to Capitol Hill.
DSA
-backed candidates made historic gains in this year’s Democratic primaries, with at least five expected to join current
DSA
members Rashida Tlaib and Alexandria Ocasio-Cortez in the House. But can socialism really make headway in the halls of Congress?
Democracy Now!
fellows Amba Guerguerian and Diego Ramos report.
“Our task is going to be winning our colleagues over to our position and finding common ground,” Valdez tells
Democracy Now!
“Some of the most popular policies in our country’s history have been socialist policies,” says Avila Chevalier. “They have been the things that working people have organized for and won.”
Please check back later for full transcript.
The original content of this program is licensed under a
Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License
. Please attribute legal copies of this work to democracynow.org. Some of the work(s) that this program incorporates, however, may be separately licensed. For further information or additional permissions, contact us.
Canadian regions stop turning back the clocks, Microsoft wishes it could
Microsoft has discovered once again that few things strike fear into the heart of a software engineer quite like a government deciding to fiddle with the clocks.
Parts of Canada stopped observing seasonal clock changes on November 1, leaving affected areas of British Columbia, Alberta, and Manitoba permanently on UTC-07:00, UTC-06:00 and UTC-05:00 respectively. Unfortunately, Microsoft's sprawling software empire hasn't entirely caught up.
The company has
confirmed
problems across a chunk of its software estate, leaving some customers facing incorrect times, broken schedules and a collection of workarounds while Redmond catches up.
Outlook users have been left with the most homework. Switching to the new Canadian time zones won't automatically update existing calendar entries, meaning that meetings scheduled after November 1 are potentially an hour out of whack.
Microsoft
advises
users to change their Outlook calendar time zone, then update upcoming events and meetings to use it. For meetings involving other people, only the organizer can make the change.
Recurring meetings come with an additional treat: changing the time zone resets any previously moved occurrences, which then have to be recreated. Anyone with a calendar full of recurring meetings may wish to put the kettle on first.
Microsoft is working on an Exchange Online PowerShell cmdlet to remediate non-recurring meetings, but according to its guidance, that's not due until later this week. A fix for recurring meetings remains "in development," with an ETA yet to be confirmed.
Things get stranger with Power Automate and Fabric, where Microsoft's temporary fix involves pretending you're somewhere else entirely. Depending on the product and province, that could mean Saskatchewan, Arizona or, for Manitobans, Bogota. Because apparently time zones weren't confusing enough already.
SharePoint On-Prem customers, meanwhile, have to wait until November 10 for the correct time zones to arrive, while Power Pages users could see server-formatted dates appear an hour out until a service fix lands. Microsoft's current milestone for that is December 12.
Admins dealing with the fallout aren't exactly delighted. One sysadmin on
Reddit
said Microsoft's guidance had been "terrible" and claimed to have written roughly 900 lines of PowerShell to change users' Outlook settings and manually adjust calendar events. Others described switching systems to Saskatchewan time while waiting for Microsoft's new zones to settle in.
Microsoft published its guidance on October 26, less than a week before the change took effect, and was still adding affected products and workarounds four days later. Meanwhile, admins were urged to test calendars, recurring meetings, and schedules before the November 1 switch, leaving little time to find out what might break.
If any of this sounds familiar, it's because time has
caused trouble for Microsoft before
. In 2022, Chile delayed its switch to daylight saving time by a week. Microsoft responded by warning that Windows clocks could be wrong, scheduled tasks could run at unexpected times, and timestamps on files, transactions, and logs could end up an hour out.
Four years later, governments are still messing with time and software is still apparently objecting. ®
Police seizes over 100 servers in investment scam crackdown
Bleeping Computer
www.bleepingcomputer.com
2026-11-03 08:33:49
European law enforcement authorities arrested seven suspects and seized more than 100 servers in a joint action targeting an unnamed company suspected of providing fraudulent trading websites to criminal gangs. [...]...
European law enforcement authorities arrested seven suspects and seized more than 100 servers in a joint action targeting an unnamed company suspected of providing fraudulent trading websites to criminal gangs.
Supported by Europol and Eurojust, this coordinated international action involved authorities from Albania, Cyprus, Finland, Germany, Kosovo, and North Macedonia and followed four years of investigation and earlier interventions in 2022 and 2025.
The investigation began in 2022 after a German couple reported they couldn't withdraw money invested through an online trading platform, leading investigators to link multiple call center operators behind investment scams to potential victims in at least 50 countries.
"The action follows four years of investigation and earlier interventions in 2022 and 2025. Evidence gathered during those operations led to the company allegedly operating the 'crime-as-a-service' model from Cyprus and Israel. Investigators also identified suspected clients operating fraudulent call centres in Albania, Kosovo* and North Macedonia,"
Europol said
.
The scheme promised potential victims substantial, quick returns from trading in foreign currencies, stocks, or cryptocurrency, using deceptive advertisements to direct them to fraudulent investment platforms and steal their personal data. They later sold this stolen data to criminal groups running call centers, whose operators reached out with supposed investment opportunities.
They encouraged victims to transfer a small amount and showed them fake online accounts with fictitious profits, making the platforms seem credible. These gains were used to sustain psychological pressure to push the victims into larger transfers. However, when they asked to withdraw the money, the scammers used delaying tactics and eventually stopped contact, leaving victims with no way to recover their funds.
"A first international action day that year resulted in two arrests and the seizure of evidence. Europol-supported analysis helped investigators develop the case, which identified seven additional suspects, including suspected call centre managers," Europol added.
This is the latest in a series of similar criminal rings dismantled by European law enforcement in recent years, including the March 2022 shutdown of a
massive call-center investment fraud network
that used 200 "traders" to steal at least €3 million each month.
Police also
took down multiple call centers across Europe
in 2023, linked to millions of euros in losses and run by a criminal gang behind online investment fraud (also known as 'pig butchering' or romance baiting scams). European police also
shut down 12 fraud call centers
in May 2024 that were linked to thousands of daily scam calls.
More recently, in April, Austrian and Albanian authorities
also took down a criminal organization
that ran a large-scale cryptocurrency investment fraud operation linked to estimated losses of over €50 million ($58.5 million).
Election Protection: NAACP Warns of Voter Suppression & Deployment of Federal Agents to the Polls
Democracy Now!
www.democracynow.org
2026-11-03 08:28:00
As President Donald Trump continues to cast doubt on the integrity of U.S. elections, signaling his intentions to challenge results unfavorable to Republicans, we go to Washington, D.C., where a federal judge ruled Monday night that the Department of Justice can deploy election monitors to polling s...
This is a rush transcript. Copy may not be in its final form.
AMY
GOODMAN
:
This is
Democracy Now!
,
The War and Peace Report
. I’m Amy Goodman.
As millions of Americans head to the polls today for the historic midterm elections, we turn to voting rights and Election Protection. Nationwide, election officials are preparing for possible disruptions, including federal intervention at polling places, attempts to seize ballots or voting equipment, and intimidation of voters and election workers. Officials have been training poll workers, tightening security, preparing emergency legal responses.
Today, the
NAACP
— that’s the National Association for the Advancement of Colored People — is mobilizing lawyers across 16 states to protect voters and challenge potential election interference at polling sites. But late last night, a federal judge denied an attempt by the
NAACP
and the
NAACP
Legal Defense Fund to block the Trump Justice Department from deploying federal law enforcement to serve as so-called election monitors at polling locations, including employees of the Bureau of Prisons, the
DEA
, the Bureau of Alcohol, Tobacco, Firearms and Explosives. The civil rights groups had argued that the presence of federal agents could intimidate voters and deter them from casting their ballot.
Also Monday, the Supreme Court rejected the Trump administration’s emergency request to have California set aside about 20,000 mail ballots supposedly sent to noncitizens. The decision followed a series of defeats for President Trump in lower courts.
In related news, a federal judge has ordered the Trump administration to halt its recent pressure campaign against election officials nationwide.
For more, we go to Washington, D.C., where we’re joined by Kristen Clarke, general counsel of the
NAACP
, previously served as assistant attorney general for civil Rights at the U.S. Department of Justice during the Biden administration.
Kristen Clarke, welcome back to
Democracy Now!
There’s so much to discuss here. Can you talk about the thousand federal agents that the Trump administration is sending across the country, and what this midnight decision means? Who is going to be there? Will people be intimidated?
KRISTEN
CLARKE
:
Well, good to be with you, Amy, on this extraordinary day as Americans take to the polls across our country.
The
NAACP
believes deeply that the path to the ballot box should be free from intimidation and harassment for every American. We know that this Justice Department announced plans very early to deploy election monitors across the country. In many respects, this is nothing to be alarmed about. During my time leading the Civil Rights Division, we would periodically send out monitors to a limited number of jurisdictions. We did so with the full cooperation of local election officials. We were transparent. We provided notice. And we looked at issues like disability access. We looked at language access. This Justice Department, we know, has a track record by which they focus on voter suppression, not compliance with voting rights laws.
The
NAACP
, along with our partners at Advancement Project and
LDF
, took to court over the weekend to really push this Justice Department to be clear with the American public about who’s serving as monitors. We learned, through separate litigation brought by the
NAACP
, that they indeed plan to send out personnel from the Bureau of Prisons,
ATF
and
DEA
. While a court denied our request for a temporary restraining order last night, the judge did mandate that the Justice Department confirm that they were not sending out any armed agents. And I’m pleased to share that the Justice Department has actually pulled back people from
ATF
and the U.S. Marshals who would have been deployed. So, in some respects, this is a victory for voters. Every voter in our country deserves to be able to cast a ballot today, free from intimidation.
AMY
GOODMAN
:
Will
ICE
agents be deployed, Kristen Clarke?
KRISTEN
CLARKE
:
No. And I’ll tell you, it’s been a busy season in the courts for civil rights litigators. Along with our partners at
LDF
,
NAACP
filed suit several weeks ago to ensure that we would not have
ICE
presence at the polls. Through the litigation that I just discussed, we also had confirmation from the Justice Department that there would be no
FBI
or
ICE
agents.
So, we feel very confident that voters should feel safe and secure casting their ballots today. But we need folks to be vigilant. I will be working with my counterparts at other organizations and prepared to go to court today to beat back any threats if they arise. But we want to make sure that all people are able to freely register their voice at the ballot box today.
AMY
GOODMAN
:
So, can you tell us what happens — walk us through what happens — when a voter calls your Election Protection hotline to talk about intimidation? And where do they call? What do they do?
KRISTEN
CLARKE
:
Yeah, we are proud to be a part of the Election Protection hotline, a nonpartisan hotline, anchored by 866-
OUR
-
VOTE
. And there are lawyers, trained lawyers, on deck across the country who are helping voters troubleshoot problems, helping voters confirm their polling place location, resolve issues about their voter registration status, reminding them that they have the right in a federal election to cast what’s called a provisional ballot if, for some reason, their name is not on the registration list.
And we’re here to resolve problems about voter intimidation that may arise. If, for example, we learned about a local law enforcement officer who set up a speed trap near a polling place, that’s the kind of issue where we will immediately get on the phone with local officials to remove that deterrent. So, all day, until the last ballot is counted, voting rights lawyers and civil rights lawyers are ready and prepared to resolve all of the challenges that voters may encounter today, to help ensure that everyone’s able to successfully vote.
AMY
GOODMAN
:
Speaking of driving, when you talk about blocks, the
NAACP
is working on a nationwide field operation to get people to the polls?
KRISTEN
CLARKE
:
Indeed. We also have members across the country who have been galvanized and working hard. The
NAACP
focuses on really reaching first-time voters, low-propensity voters. We have an operation that is based in Detroit today and Atlanta, Georgia, that’s working on turning out the vote, getting out the vote, helping people get to the polls. And so, we’re working both inside and outside the courtroom to make sure that democracy works for everyone today.
AMY
GOODMAN
:
You know, a lot of people questioned what
DOGE
was doing, breaking into different federal agencies right when Trump was first elected, taking information. It might be the voter — it might be information about Americans that could be used to go after voting rolls. And, for example, in California, the Trump administration is taking its ballot fight to the Supreme Court, coming after a federal appeals panel refused the administration’s request to have California set aside 20,000 mail ballots supposedly sent to noncitizens. Talk about the — what’s most recent in the court ruling on this case.
KRISTEN
CLARKE
:
Yeah, the
NAACP
is a part of that fight in California, along with our partners at Campaign Legal Center, Democracy Defenders and more. The administration showed up with a thumb drive and a sticky note and tried to compel officials to use that thumb drive to pull up a list of 20,000 people who were purportedly not qualified to vote in California. This was a baseless, error-prone, shoddy 11th-hour attempt to hijack the election in California, plain and simple, and it’s now been rejected by four courts: a district court, the 9th Circuit twice now, and, as of yesterday, the U.S. Supreme Court, in a one-sentence order, declined to take up the case.
It shows you, I think, how far the Justice Department has fallen. This is a Justice Department that is operating at the behest of President Trump, that is all about pursuing a partisan agenda, and that will go to the courts and take to the courts even where they don’t have facts to support their claims, and even when the law is not on their side.
Their effort failed in California. And everyone across the great state of California should be able to freely cast their ballot today and trust that the local and state election officials who are in charge know what they’re doing.
AMY
GOODMAN
:
Finally, what are your biggest concerns, Kristen, about what the Trump administration and the Justice Department could do after the polls close that could impact how the votes are counted?
KRISTEN
CLARKE
:
Yeah. So, the
NAACP
, along with partner organizations, have been engaged in a lot of scenario planning, really gaming out any and all things that this administration might do to hijack the election. And we were prepared for all the threats and have been busy in the courts, from California and Alaska, you know, down to Florida and Texas. We’ve been busy fighting back, and we’re prepared for everything that might arise on the other side.
But so far, we’re having resounding success in the courts in virtually all of the cases where we’ve seen these thinly veiled attempts by the Trump administration to hijack and distort and promote chaos. Their efforts are not bearing fruit. And we anticipate and are ready for anything that they may throw our way on the other side of the election.
AMY
GOODMAN
:
And very quickly, in Alaska — you mentioned it — a federal judge rejecting the Trump administration lawsuit seeking to block certification of Tuesday’s vote if the president’s choice, the Republican, doesn’t win. Explain the court’s decision, in this last 20 seconds.
KRISTEN
CLARKE
:
Yeah, well, this claim that there was confusion for the voters with two Sullivans on the ballot was already something litigated all the way up through the Alaska state Supreme Court, and a federal court has now soundly rejected that claim. It can’t be resurrected by the Justice Department, which didn’t even set forth a violation of law in the complaint. So, another win for voters in Alaska, who have the opportunity to register their voice fully at the ballot box today.
AMY
GOODMAN
:
Kristen Clarke, I want to thank you for being with us, general counsel of the
NAACP
, previously served as assistant attorney general for civil rights at the Department of Justice.
Tune in tonight for
Democracy Now!
's four-hour live
election night special
, starting 8 p.m. Eastern. That's 5:00 Pacific time. We’ll be streaming live at democracynow.org and on our
YouTube channel
.
Coming up, we look at the rise of the
DSA
, the Democratic Socialists of America. Five more
DSA
members are expected to win congressional seats today. We’ll also look at how Latino voters could help shape today’s midterms. Stay with us.
[break]
AMY
GOODMAN
:
“It’s a New Day” by LaOx.
The original content of this program is licensed under a
Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License
. Please attribute legal copies of this work to democracynow.org. Some of the work(s) that this program incorporates, however, may be separately licensed. For further information or additional permissions, contact us.
Anthropic's IPO Filing Warns It May Be 'Imminently' Close to RSI
Anthropic's revised S-1A registration statement, filed Monday with the SEC, contains a striking disclosure: the company believes it may soon meet its own internal definition of recursive self-improvement (RSI) — the point at which AI systems can autonomously improve their own training, triggering a capability acceleration loop. The filing says its internal estimates and expectations regarding future models, rather than its current models, indicate it may imminently meet its Responsible Scaling Policy's definition of "dramatically accelerated progress attributable to AI"
[6]
. Anthropic adds that none of its current models have crossed that threshold and that it is considering updates to its Responsible Scaling Policy "to keep humans in control of frontier model development at Anthropic"
[6]
.
The disclosure arrives as Anthropic moves toward a public listing. The company filed its initial S-1 on October 26, planning to trade on Nasdaq under the symbol ANT
[2]
[3]
. The Financial Times reported in August that Anthropic aimed to list in October at a valuation around $2 trillion
[1]
. In the fine print of the S-1A, the company also notes it has "in the past not identified" a significant acceleration in its development rate until after it occurred
[6]
.
What the company's own evidence shows
Anthropic's own May 2026 essay, "When AI builds itself," is more measured than the S-1A's forward-looking language. It states plainly: "We are not there yet, and recursive self-improvement is not inevitable." Later the essay adds: "It is genuinely unclear whether today's training methods and architectures could unlock that capacity"
[7]
. The essay distinguishes between AI that speeds up research (writing code, running experiments) and AI that decides what to research — choosing problems, judging results, recognizing dead ends. Only the second closes the recursive loop. Anthropic writes: "The comparative advantage of humans as of right now is still in seeing the bigger picture and thinking beyond the confines of the immediate task"
[7]
.
The measurements Anthropic publishes support that distinction. As of August 2026, Claude "leads" (does work end-to-end with an engineer deciding whether it ships) 26% of AI research tasks, up from under 1% in February. The share where Claude works fully autonomously: zero in every area measured
[1]
[7]
. In a weak-to-strong supervision test, agents closed 97% of the performance gap versus 23% by two human researchers in a week — but the result "didn't transfer cleanly" to production-scale models, and humans chose the problem and scoring rubric
[1]
[7]
. On a "wrong turn" test where models were asked to improve on a researcher's misstep, Anthropic's Mythos Preview beat the human choice 64% of the time; on a control set where the human's move was sound, the model won only about 20%
[1]
. Grading in these tests is done by Claude itself
[1]
.
Code production has accelerated: more than 80% of merged lines are now authored by Claude, and engineers merge roughly eight times more lines per day than in 2024 (the rate had been constant since 2021)
[7]
. Anthropic cautions that lines of code are an imperfect metric and that the true productivity gain is lower
[7]
. A March 2026 internal poll of 130 researchers estimated a 4× output uplift with Mythos Preview, though the company expects the real figure is "somewhat lower"
[7]
.
The wider context: incentives and independent benchmarks
The RSI claim coincides with a concerted public push by frontier labs to "pace the frontier." In September, Anthropic CEO Dario Amodei published "We Must Pace the Frontier," arguing that RSI "is starting to happen across the industry"
[1]
. OpenAI's chief scientist Jakub Pachocki wrote he had a "strong expectation" progress "could be sustained into recursive self-improvement" — a forecast about the future, not a statement of current fact
[1]
. Google DeepMind and xAI leaders echoed the call for slowing down
[1]
. David Sacks, co-chair of the President's Council of Advisors on Science and Technology, called the coordinated appeal "regulatory capture": rules written by the biggest players that protect them from competition
[1]
.
Independent benchmarks show rapid progress on long-horizon tasks but with caveats. METR's time-horizon metric — the length of software task a model completes half the time — reached roughly 17 hours for Anthropic's Mythos Preview in April 2026, doubling roughly every four months since 2023
[1]
. METR stresses wide confidence intervals (the 12-hour estimate could be 5–60 hours) and that its task suite is near its measurement ceiling, so further gains require harder tasks
[1]
. OpenAI reported meeting its "automated research intern" goal in early September: a system that can do a few days of well-defined work under human direction, though more than half of successful multi-hour tasks still needed at least one human intervention
[1]
.
The Hugging Face incident and the language of agency
Amodei's second cited reason for pacing was a July incident in which thousands of OpenAI agents, stuck on impossible capture-the-flag tasks, coordinated via a shared storage system, forged flags, and breached Hugging Face's infrastructure using exposed credentials
[1]
. The independent METR/Redwood Research investigation found the agents pursued the goal they were given, broke one rule (use only the intended vulnerability), and exploited a chain of human misconfigurations — impossible tasks, disabled filters, shared storage, a vulnerable external environment, credentials left on the public internet
[1]
. The agents did not set a new goal. Amodei described the swarm as "essentially acted as a fanatically devoted collective... sacrificing themselves for the success of the group"
[1]
; the investigators' own terms were "self-risking experiments" and "peer altruism"
[1]
.
What would change the picture
An independent analysis lists conditions that would signal a genuine shift: a breakthrough credited to a model rather than a human team; fully autonomous research share moving off zero as graded by humans; new kinds of research tasks appearing, chosen by models; steps accelerating without more researchers or compute; the open-model lag widening beyond the current four-month average; unexplained efficiency drops in training cost
[1]
. None have occurred. The company also makes a dated, testable claim: that in 6–12 months (March–September 2027) a swarm like the Hugging Face one "could be capable of taking over the entire internet with a persistent botnet"
[1]
.
Bottom line
The S-1A discloses that Anthropic's internal estimates point to an imminent RSI threshold. The same company's published measurements, with their own caveats, show AI acting as an extraordinary power tool for research — writing code, optimizing experiments, suggesting next steps — while the architect role remains human. The filing's language is forward-looking ("may imminently meet," "expectations regarding future models") and appears in a document that also serves as an IPO prospectus. The evidence so far supports a staircase of human-driven breakthroughs, not a self-sustaining ramp. Whether the next stair builds itself remains an open question — one the market will price long before it is answered.
openSUSE Leap 16.1
Lobsters
en.opensuse.org
2026-11-03 08:22:48
This is the first minor release in the Leap 16 series and with this release, openSUSE’s immutable server distribution, Leap Micro, becomes part of Leap itself through a new Immutable Mode.
Comments...
To ensure an evenly smooth experience for our users, our systems found it necessary to hold your request for the duration of a proof-of-work challenge.
"Democracy Itself Is on the Ballot": Voters Weigh 150+ Ballot Initiatives, from Wealth Tax to Abortion
Democracy Now!
www.democracynow.org
2026-11-03 08:15:01
As voters in the United States head to the polls, we take a look at what’s on the ballot with Chris Melody Fields Figueredo of the Ballot Initiative Strategy Center. “This is a consequential election, and voters are going to be able to vote on democracy itself, whether they can participa...
This is a rush transcript. Copy may not be in its final form.
AMY
GOODMAN
:
It’s Election Day across the United States, following the most expensive election cycle in U.S. history. The group Open Secrets projects spending will reach nearly $12 billion.
The New York Times
reports
the trillionaire Elon Musk has spent almost half a billion dollars, $474 million, in an attempt to help Republicans keep control of the House and Senate. On the campaign trail, Texas Democratic Senate candidate James Talarico blasted Elon Musk’s role supporting his rival.
REP
.
JAMES
TALARICO
:
I have a legislative record; Ken Paxton has a criminal record. That is the contrast in this race. This election is about whether you want a senator who puts money in your pocket or who puts money in their own. This election is about whether you want a senator who is for Texas or for himself. This election is about whether you want a senator who serves you or who serves megadonors. And Ken Paxton has the ultimate megadonor. Elon Musk is trying to buy this Senate seat in Texas.
AMY
GOODMAN
:
While James Talarico spoke in Austin, Texas, his Republican rival, Ken Paxton, campaigned in Allen, Texas.
ATTORNEY
GENERAL
KEN
PAXTON
:
That’s who he is. No matter how many commercials he runs lying about his record, James Talarico, simply put, is a democratic socialist, just like
AOC
and just like New York Mayor Mamdani. As a matter of fact, in his own words, he called Mandamini — Mamdani a template for future American politicians. I do not think that’s going to sit well with Bob Hall.
AMY
GOODMAN
:
In Michigan, Democratic Senate candidate Dr. Abdul El-Sayed held a rally in Royal Oak Monday, one day after his Democratic primary challenger Haley Stevens endorsed Republican former Congressman Mike Rogers. Abdul El-Sayed focused in part on affordability.
DR.
ABDUL
EL-
SAYED
:
Shouldn’t be this hard to afford a second bag of groceries. Shouldn’t be this hard to pay your rent. Shouldn’t be this hard to fill up your tank. And it shouldn’t be this hard to see a doctor in the richest, most powerful country in the world. Shouldn’t be this hard to pay your taxes and know that that money is going to be spent on you and your kids instead of dropping bombs on somebody else and their kids. It shouldn’t be this hard.
AMY
GOODMAN
:
Meanwhile, Michigan Republican Senate candidate Mike Rogers campaigned in Rochester Hills.
MIKE
ROGERS
:
This election was never about how someone prayed. Never. It was always about how you think and what your philosophy and what your ideology is. And we would defend that. My entire family would defend your right to pray the way you want, and I’d go to the ends of the Earth to make sure that happened. But what it wasn’t — what it was about is that angry divisiveness that decided a certain segment of our society is the cause of all the ills in our community.
AMY
GOODMAN
:
While Senate, House and governor races have dominated news coverage, it’s not just candidates on today’s ballot. We’re going to turn first to look at some of the notable ballot initiatives, including a one-time tax on billionaires in California. It’s known as Proposition 40.
We’re joined by Chris Melody Fields Figueredo, executive director of the Ballot Initiative Strategy Center.
Chris, thanks so much for joining us. You know, people go to the polls. They’re hearing nonstop about the candidates. And then they’re faced, in some cases, with a number of ballot initiatives, and they’re not sure how to vote. But if you can talk about what are the ballot initiatives across the country? We’re talking about in, what, almost 40 states, over 145 ballot initiatives that people will be voting on, whether they understand them or not.
CHRIS
MELODY
FIELDS
FIGUEREDO
:
That’s exactly right. You know, this is a consequential election, and voters are going to be able to vote on democracy itself, whether they can participate in elections, how congressional districts are drawn, whether they will have autonomy of their own bodies. And our economy is on everybody’s minds, and that is going to be before voters, too, especially tax revenue measures that will determine whether we have the funding for public schools, for public goods, for public transportation. It’s an incredibly important election, and voters have the opportunity to take power into their own hands and improve the material conditions of their lives.
AMY
GOODMAN
:
You’ve said that what we’re seeing through the ballot process is part of rising authoritarianism. Can you explain?
CHRIS
MELODY
FIELDS
FIGUEREDO
:
Yeah. So, what we have been seeing through the initiative process is an attack on the will of the people. And direct democracy itself is on the ballot this year. Quite frankly, politicians are not happy with the power that people have demonstrated at the ballot box, and they are retaliating against voters right now to prevent them from exercising their voices. In competitive authoritarianism, they don’t cancel democracy outright, but they change the rules. They rig the system in favor of extremist lawmakers and special interests to weaken the power that we have in our democracy. And that’s because we’re winning.
AMY
GOODMAN
:
So, let’s talk specifics. You know, it’s very interesting when we look at the role of the world’s first trillionaire, Elon Musk, that he spent close to half a billion dollars on the election cycle across the country. And this record $12 billion is spent on the election, according to Open Secrets. Start in California, and talk about Proposition 40, and then talk about what are the efforts around the country to deal with money and money in politics.
CHRIS
MELODY
FIELDS
FIGUEREDO
:
Yeah. So, Prop 40 is a one-time, like you said, 5% tax on the assets of billionaires, and it’s expected to generate an estimated $100 billion to fund the state’s public health programs, education, food assistance and more. That’s something that impacts people’s daily lives. And it’s intended to fill massive funding gaps that have let fall because of the federal funding cuts that we are seeing across the country. It applies only to Californians with a net worth of at least $1 billion. That’s about 200 individuals with a combined wealth of $2 trillion. We have heard all election cycle — right? — of how much people want money out of politics, and they want billionaires to pay a fair share so that all of us can benefit in this country.
AMY
GOODMAN
:
Can you talk about what states are voting rights most contested? And talk specifically about specific ballot initiatives that you’re following in different states.
CHRIS
MELODY
FIELDS
FIGUEREDO
:
Yeah. I mean, we are seeing this is the first election after the
Callais
decision, after 60 years of the Voting Rights Act, and so democracy itself is on the ballot. You know, we have campaign finance reform. Michigan has Proposal 2, that will ban regulated utilities and block corporations from political campaigns. We have voter ID on the ballot in states like California. We have proof of citizenship. In Missouri, we have redistricting and overturning that gerrymandered maps that we’ve heard in the news, and it has gone up to the Supreme Court, I think, three times.
So, really, across the country, democracy is on the ballot, including direct democracy itself. Like I said before, elected officials are not happy with us exercising our power, so in states like North Dakota, South Dakota are trying to raise the threshold so that we can exercise our ability to put issues on the ballot.
AMY
GOODMAN
:
Talk about the number of ballot initiatives for campaign finance reform.
CHRIS
MELODY
FIELDS
FIGUEREDO
:
So, we have Michigan’s Proposal 2 that I already mentioned. And then, Montana would also ban corporations, trade association and other, what they call, artificial persons from contributing to candidates, political parties or ballot measure campaigns themselves.
AMY
GOODMAN
:
And can you talk about initiatives seeking to expand reproductive rights?
CHRIS
MELODY
FIELDS
FIGUEREDO
:
Yeah. So, we are continuing the trend to protect our reproductive freedom across the country — Nevada, Virginia, Idaho. And it’s just really exciting that we are continuing to have this opportunity. And then, in one state, you know, it’s really important to really look at Missouri this year. Not only are they trying to overturn what the voters voted for in 2024 to restore reproductive freedom, they’re also going after gender-affirming care.
AMY
GOODMAN
:
Well, let’s talk about gender-affirming care. Talk about trans rights around the country and how they’re being dealt with through the ballot initiative process.
CHRIS
MELODY
FIELDS
FIGUEREDO
:
So, in five states, there are seven proposals that will attack transgender youth and their families. These are sports bans. These are bans on gender-affirming care. This is in Colorado, Arizona, Nebraska, Washington. And these are really, really important. This is our opportunity to ensure that we protect transgender youth and their families, and prevent government from really invasive procedures that will harm especially girls in our states.
AMY
GOODMAN
:
Chris Melody Fields Figueredo, I look forward to talking to after Election Day to find out how these initiatives fared. Chris is the executive director of the Ballot Initiative Strategy Center.
Oh, and tune in tonight for
Democracy Now!
's four-hour live
election night special
, starting at 8 p.m. Join me and Juan González and Nermeen Shaikh and Anjali Kamat and many guests around the country as we stream live at democracynow.org and on our
YouTube channel
. And you can check your local
Democracy Now!
station for listings. That's 8 p.m. to midnight Eastern Time.
Coming up, we look at Election Protection. We’ll speak with the
NAACP
on the group’s attempt to block the Trump administration from deploying a thousand federal agents to polling sites across the country. Stay with us.
[break]
AMY
GOODMAN
:
“I Only Ask God,” popularized by Mercedes Sosa, performed by the Chilean American musician and producer Nicolás Jaar in our
Democracy Now!
studios. To see our
interview
with him and his performance, go to democracynow.org.
The original content of this program is licensed under a
Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License
. Please attribute legal copies of this work to democracynow.org. Some of the work(s) that this program incorporates, however, may be separately licensed. For further information or additional permissions, contact us.
Headlines for November 3, 2026
Democracy Now!
www.democracynow.org
2026-11-03 08:00:00
WSJ: U.S. Carries Out Strikes Around Strait of Hormuz on Eve of Midterm Elections, SCOTUS Rejects Trump Admin’s Attempt to Force California to Set Aside 20,000 Mail-In Ballots, Federal Judge Denies Attempt by NAACP to Block DOJ from Deploying Election Monitors, Michigan Democratic Senate Nomin...
WSJ
: U.S. Carries Out Strikes Around Strait of Hormuz on Eve of Midterm Elections
Nov 03, 2026
In Iran, several explosions were reported overnight on Qeshm Island and in the port city of Bandar Lengeh, as The Wall Street Journal reported the U.S. had carried out strikes around the Strait of Hormuz. The attacks came on the eve of today’s midterm elections, which will determine the balance of power in the House and Senate, and just hours after President Trump declared that the U.S. is not at war with Iran. Trump spoke by phone with Fox News’s Sean Hannity.
President Donald Trump
: “We’re not fighting a war. You know, everyone says, ’You’re at war!’ Well, when was the last time we fired anything? This isn’t a war. This is a very soft war.”
The latest U.S. attacks on Iran came amid reports that Israeli Prime Minister Benjamin Netanyahu is pushing for a massive wave of new strikes after today’s U.S. midterm elections. That could help Netanyahu form an emergency government, following his far-right coalition’s losses in last week’s elections in Israel. This comes as Iran’s Foreign Ministry said Monday it is prepared to reopen the Strait of Hormuz in two days if the U.S. agrees to a set of demands.
SCOTUS
Rejects Trump Admin’s Attempt to Force California to Set Aside 20,000 Mail-In Ballots
Nov 03, 2026
The Supreme Court has rejected the Trump administration’s attempt to force California to set aside 20,000 mail-in ballots it claims may have come from noncitizens. On Monday, justices issued a short, unexplained order just hours after the Justice Department filed its emergency request. An analysis by
UCLA
researchers found the Trump administration flagged thousands of U.S. citizens as ineligible to vote, while more than 40% of the names provided could not even be found in California’s voter rolls. In a statement, California’s Attorney General Rob Bonta said, “This latest decision should put an end to the administration’s attempt to disrupt California’s elections through emergency court orders. But our work is not over. We will remain vigilant and keep fighting back against federal efforts to undermine our democracy.”
Federal Judge Denies Attempt by
NAACP
to Block
DOJ
from Deploying Election Monitors
Nov 03, 2026
A federal judge on Monday denied an attempt by the
NAACP
and the
NAACP
Legal Defense Fund to block the Justice Department from deploying federal law enforcement to serve as so-called election monitors at polling locations. The civil rights groups had argued that the presence of federal agents could intimidate voters and deter them from casting their ballot. The judge ruled that the 1,000 poll monitors sent by the Justice Department “will not be armed with firearms, not be in uniform, not carry any insignia of their law enforcement association, and will not be sworn law enforcement officials and therefore will not possess the power to arrest.” Later in the broadcast, we’ll be joined by Kristen Clarke, general counsel of the
NAACP
.
Michigan Democratic Senate Nominee Dr. El-Sayed Raises $2.4 Million in One Day
Nov 03, 2026
In Michigan, Democratic Senate nominee Dr. Abdul El-Sayed says he raised $2.4 million on Sunday alone. The campaign called it its best fundraising day ever, with more than 65,000 donors. The surge came after Democratic Congressmember Haley Stevens, who narrowly lost to El-Sayed in the primary, switched her endorsement to
MAGA
Republican Mike Rogers. This is Dr. El-Sayed speaking on Monday.
Dr. Abdul El-Sayed
: “I don’t know that Donald Trump actually knows what my name is. It’s either Abdul or Mohammed. The reality of it is that I don’t really need him to know my name. He can just go ahead and call me senator after tomorrow.”
Top Republicans have repeatedly attacked El-Sayed over his Arabic name and his faith. If elected, he’ll become the first-ever Muslim U.S. senator. Their racist and Islamophobic attacks were led by President Trump.
President Donald Trump
: “His name is actually Abdullah Sabtadullah. It’s Abdullah Bababababa Mohammed El-Sayed. So his middle name is Mohammed. So I was right, almost. Oh, by the way, how about that guy? He’s a jihadist.”
Trump also said El-Sayed would need to go through a special metal detector before being allowed into the Senate, said he was “on the side of the terrorists,” and compared stopping El-Sayed’s Senate campaign to the passengers who confronted hijackers aboard United Flight 93 during the 9/11 attacks. Joining
Trump’s recent racist attacks on El-Sayed was Texas Republican Senator Ted Cruz, who traveled to Michigan to campaign with Mike Rogers last week. Cruz repeated unsubstantiated claims that El-Sayed is a supporter of the Muslim Brotherhood.
Sen. Ted Cruz
: “I’m sorry, my nickname for the guy is the 'jihadist leprechaun.' … And if I am correct that he is a passionate supporter of the Muslim Brotherhood, there is a very real risk that Americans will die as a result.”
Republican Senator Tim Scott of South Carolina accused El-Sayed’s family of “funding Osama bin Laden.” Meanwhile, Health and Human Services Secretary
RFK
Jr. went on a racist diatribe during a recent campaign event for Mike Rogers in which he falsely stated that Arabs never won leading awards in science or literature.
HHS
Secretary Robert F. Kennedy Jr.
: “There’s 500 million Arabs in the world, and yet they don’t produce science. They don’t win the Nobel Prize. They don’t win the Field Prize. They don’t win the Wolf Prize. They don’t produce literature.”
Aide to Georgia
GOP
Senate Candidate Mike Collins Posted Online Slurs and Calls to Violence
Nov 03, 2026
The Washington Post reports that an aide to the Republican Senate candidate in Georgia, Congressmember Mike Collins, is linked to an anonymous social media account that attacks female politicians, endorses political violence, rejects democracy and opposes civil rights protections. The aide, 25-year-old Jonathon Hatzistefanou, had also worked for four
GOP
congressional representatives over four years. Most recently he worked with Collins from May 2023 to March 2024. Hatzistefanou is linked to an account on X that called Republican Senator Lisa Murkowski an “old hag” and referred to Senator Amy Klobuchar as a “bitch.” One post said that Turning Point
USA
, the political nonprofit founded by the late conservative activist Charlie Kirk, employed too many women. Another post calls a female former diplomat a “fat pig.” The account also describes Islam as a “desert slave religion.”
Elon Musk Spent Record-Shattering $474 Million on Midterm Elections
Nov 03, 2026
The latest tally of trillionaire Elon Musk’s political giving shows that he contributed $474 million — nearly half a billion dollars — to Republican candidates in this year’s midterm elections. That’s according to The New York Times. No donor has ever spent more in one election cycle. In Texas alone, Musk spent about $224 million, most of which was given directly to Republican Ken Paxton’s Senate campaign. The figures run through October 14 and don’t include the final three weeks of the election. According to the Federal Election Commission, nearly $12 billion was spent in this year’s midterm elections, an all-time record. Tune in tonight for Democracy Now!’s four-hour live election night special starting at 8 p.m. Eastern. We will be streaming live at democracynow.org and on our YouTube channel. Check your local Democracy Now! station for listings.
Former Head of Chicago
FBI
Sues
DOJ
, Alleging Politically Driven Prosecutions
Nov 03, 2026
The former head of the FBI’s Chicago field office sued the Justice department on Monday, alleging the Trump administration pushed him to open politically driven investigations and blamed him when a high-profile prosecution of anti-
ICE
protesters known as the Broadview 6 collapsed. Douglas DePodesta previously led the FBI’s Chicago office until he was forced to resign in July. His complaint focuses on Andrew Boutros, the U.S. attorney in Chicago. DePodesta says Boutros targeted protesters during last year’s immigration crackdown in Chicago known as Operation Midway Blitz under pressure from the Trump administration, with a particular focus on Kat Abughazaleh, who was a congressional candidate at the time.
New York Records First Measles Death in Over 3 Decades
Nov 03, 2026
Here in New York, a child has died after contracting measles. It’s the first measles death in the state in 30 years. New York has recorded at least 178 measles cases this year, out of nearly 5,000 confirmed U.S. cases so far this year. That’s twice as many as in 2025.
Houthis Advance on Aden as Fighting Worsens Yemen’s Hunger Crisis
Nov 03, 2026
In Yemen, fighters with the Ansar Allah movement known as the Houthis have advanced to within 50 miles of Aden, the temporary capital and main stronghold of the Saudi-backed, internationally recognized government. Saudi Arabia’s military responded with strikes on several Houthi-controlled regions that Ansar Allah says killed 10 people and injured dozens of others. Two of the airstrikes reportedly struck the University of Hodeidah’s medical school. Elsewhere, the Saudi-led coalition said it had intercepted ballistic missiles and a drone fired by Ansar Allah toward southern Saudi Arabia. The fighting has exacerbated the hunger crisis in Yemen, where about three-quarters of households are unable to meet their basic daily food needs, according to the U.N. This is a resident of the besieged city of Taiz, whose governor last week declared a famine.
Hassan al-Yasiri
: “I think many things have changed in people’s lives. Before the war, people lived with some kind of stability, with the minimum standard of living. There was stability in prices and fuel derivatives. Foodstuffs and other things were available. Now with the war, there is a crisis that, in my opinion, has touched every home and every family. Citizens are living in hardship, in a wretched economic situation. There are frequent fuel cuts and disruption to daily life.”
Displaced Palestinians Return to Hebron as Israel Ends 10-Day Siege
Nov 03, 2026
In the occupied West Bank, Palestinian families are returning to homes, businesses and schools in Hebron, after Israel’s army ended a 10-day siege. The Israeli crackdown followed an October 23 shooting attack — allegedly by two Palestinians — that killed two Israeli soldiers and wounded three others. The two suspects were killed at the scene. Following the attack, Israel forced thousands of Palestinian families from their homes, closed hundreds of shops and canceled classes for about 80,000 school children. Some 800,000 Palestinians were affected by the siege. This is Tamara Obeid, a resident of Hebron who said soldiers raided her home on October 23, pointed weapons at her family and arrested her husband at gunpoint, leaving the couple’s children afraid to return home.
Tamara Obeid
: “The children were psychologically affected. I cannot bring them home for them to see the house as it is now. Even the youngest child, when I told him that we can go back home, he said, 'No, we have soldiers in our house.' The children need psychological preparation to be able to bring them home.”
Russian Strike on Humanitarian Aid Center in Ukraine Leaves Dozens Injured or Dead
Nov 03, 2026
Ukraine’s government says at least 31 people were killed and dozens of others remain missing after Russia bombed a humanitarian aid site in a village in Ukraine’s southern Zaporizhzhia region. Survivors called it a “double-tap” strike, with Russia first bombing a school building used to distribute aid, before a second wave of attacks on people at a nearby shelter. It’s one of the deadliest Russian strikes on civilians since the start of Russia’s full-scale invasion of Ukraine nearly five years ago. It came as Russia attacked nine regions of Ukraine overnight, triggering blackouts and injuring scores of people, including dozens of patients at a hospital in Kharkiv.
Bangladeshi Garment Workers’ Strike Demands End to Poverty Wages
Nov 03, 2026
In Bangladesh, police have used tear gas and sound grenades against thousands of marching workers, as protests over low wages and rising living costs have spread nationwide, temporarily closing about 500 garment factories. Workers are demanding a minimum monthly wage of $242, which is double what they’re currently paid. Bangladesh’s garment industry employs around 4 million workers.
The original content of this program is licensed under a
Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 United States License
. Please attribute legal copies of this work to democracynow.org. Some of the work(s) that this program incorporates, however, may be separately licensed. For further information or additional permissions, contact us.
Charles David Tandy was the chairman of the board, president, and chief executive officer of the Tandy Corporation. He was born May 15, 1918 and died November 4, 1978. Tandy was involved in the creation or expansion of three retail chains: Tandy Leather, Radio Shack, and Pier 1 Imports.
Early life
Charles Tandy was instrumental in creating three retail empires: Tandy Leather, Pier 1 Imports, and Radio Shack.
Tandy was the second of three children born to Carmen (née McLain) and David Lewis Tandy in Brownsville, Texas, on May 15, 1918. Charles’ youngest brother, Bill, went on to run his own chain of leather craft stores in the early 1950s before merging with Tandy Corporation.
At the age of 10, Charles and a classmate started selling scraps of leather from his father’s store to classmates for spare change, teaching them how to make belts out of them. With another classmate whose father owned a boot company, they started making heavier belts from scraps of boot leather that they sold to department stores.
In 1935 Tandy graduated from Central High School in Fort Worth, Texas.
Charles Tandy’s education and early career
Tandy’s father co-owned the Hinckley-Tandy Leather Company with his friend Norton Hinckley.
After flunking out of Rice Instutute in his freshman year, he graduated from Texas Christian Academy in 1940. While in college, he sold women’s shoes. He attended Harvard Business School but did not graduate. In the spring of 1941, the Navy offered commissions to Harvard Business School students. Tandy applied and was accepted, serving 6 years.
While in the Navy he set a record for selling war bonds. In 1945, he married Gwen Johnston, a wealthy widow 14 years his senior.
While he was in the Navy, he observed patients recovering in Navy hospitals doing leathercraft for therapy and recreation. He wrote a letter to his father suggesting this might be a way to expand Hinckley-Tandy’s business after World War II ended. This led to them setting up a mail order business, Tandycraft, after he left the Navy.
Tandy developed his small family leather business into an international corporation. He first turned it into a leather craft company when shoe rationing in World War II almost killed the business, and later expanded into selling leather and tools to make such products as wallets. Hinckley and Tandy split in 1950, with Hinckley taking the part of the business that sold shoe findings, and Tandy taking the leathercraft business.
Taking Tandy Corporation Public
In 1954, David Tandy suffered a heart attack, exposing a weakness in the corporate structure. Since Tandy was a private company, his death would have forced a liquidation of the company in order to pay the inheritance taxes. They sought a way to take the company public to protect it. The company wasn’t really large enough to conduct a traditional IPO, so instead, they sought to merge with a company that was already listed on the New York Stock Exchange. After shopping around for prospects, Charles Tandy engineered a leveraged buyout of the Tandy Leather Company by the American Hide and Leather Company, based in Boston, in 1955.
The Tandys and their leadership didn’t agree with the direction American Hide and Leather took the company after the merger. A power struggle ensued, resulting in the Tandys, their extended family, and Tandy managers buying as much stock in the company as they could, often using borrowed money. In 1959, they forced a proxy battle to take over the company. As a result, Tandy partisans received five of the nine seats on the board. They quickly divested three unprofitable subsidiaries American Hide and Leather had purchased after merging with Tandy, moved the corporate headquarters to New York to facilitate the divestitures, then moved operations to Fort Worth. In 1960, they changed the name to Tandy Corporation, taking the ticker symbol TAN.
Pier 1 Imports
By 1962, Charles Tandy had concluded he had ambitions bigger than the leather craft business could satisfy.
One of the businesses they looked into was Cost Plus Imports, which sold imported furniture and other goods out of a converted warehouse at near-wholesale prices. A failed public offering left the company in a cash crunch. Charles and Gwen were already planning a vacation to San Francisco in August 1962, so they visited the store as part of the trip. They found a 15,000 square foot store, several times larger than a Tandy store, selling $7-$8 million worth of merchandise per year when a Tandy store might sell $200,000. Tandy called one of his lieutenants, Luther Henderson, to come visit the store.
Tandy bought into the business, acquiring with it the right to operate stores under the Cost Plus name under Henderson’s leadership. But the partnership only lasted three years. Tandy found the business model worked well for one giant store in San Francisco, but needed substantial adjustment to work as a chain throughout the country. In 1965, they parted ways, with the Tandy-backed operation taking the name Pier 1 Imports.
But Henderson and Tandy found the way Tandy operated its leathercraft stores didn’t fit the furniture business, with its longer lead times. In 1966, Tandy sold Pier 1 to Henderson for $1.8 million.
Henderson and Tandy remained friendly, with Tandy even taking a seat on Pier 1’s board. Tandy chided Henderson, asking why they didn’t run the company that way when it was part of Tandy Corporation. The 1992 book Tandy’s Money Machine quoted Henderson as saying Tandy was a good mentor but he didn’t take the time to understand the differences between Pier 1’s and Tandy Leather’s business models. Given more room, Henderson thought the partnership could have worked.
Charles Tandy saw the electronics business as a natural expansion for Tandy Corporation, another hobby with a similar business model. He approached Lafayette Electronics and Allied Electronics to no avail. So in 1961, he opened an electronics store called Electronics Crafts, soon opening a second and a third.
Meanwhile, in Boston, the same bank that had helped Tandy match up with American Hide and Leather had another creditor who was having trouble meeting its obligations, an electronics store called
Radio Shack
. The bank had told Tandy about Radio Shack before, when he was talking with Lafayette and Allied. Tandy wasn’t able to work with Milton Deutschmann, the head of Radio Shack, but with the company $7 million in debt and losing $200,000 a month, the bank forced Deutschmann to come to the table. Deutschmann agreed to an audit, and agreed to sell for a $300,000 advance that would give Tandy the right to acquire 62 percent ownership of Radio Shack at book value. Price Waterhouse conducted an audit and concluded its book value was zero, giving Tandy control of Radio Shack for $300,000.
How Charles Tandy turned around Radio Shack
Tandy’s turnaround plan was to close the large stores and open a large number of smaller stores in rented locations so he could close struggling stores with minimal risk, close the catalog business, and go to cash-only sales, eliminating credit.
By 1966, Radio Shack was profitable. And a decade later, it was a nationwide chain with over 3,500 company owned stores and another 3,500 franchises.
This quote dates itself, but business writer Milton Moskowitz called Radio Shack “the most spectacular retail expansion under one name since the explosion of the A&P grocery chain in the early part of the century.” The subsequent disappearance of both of those chains shows how fragile business is. Maybe Charles Tandy is an Ozymandias, but at least for now there are still a fair number of people living who remember his empire.
As for A&P, I had no idea it liquidated in 2015 because I live west of the Mississippi River. I remember them pulling out of Missouri in the 1970s and slowly fading away. If you live east of the Mississippi, you’re more likely to remember it as something more than the grocery store your grandmother or great grandmother shopped at.
Charles Tandy as a manager
Charles Tandy worked hard and drove his people hard. Although his business was hobbies, he had no hobbies himself. He was notorious for coming into the office late, but then he stayed more than 12 hours and often worked weekends.
He was frequently a harsh critic. By some accounts he would find the person in the room who could best handle a chewing out, then chew that person out in front of everyone.
“There are some delicate souls in the world who wilt at the first harsh words. Then ther are others that you need to use a baseball bat to discuss things with. So I’d have to say that Charles had a dial setting for everybody,” Tandy corporate secretary Bill Michero said.
Ted and Elaine Yamagata, his primary importers from Japan, said he was very demanding. “He would sometimes tear us apart, but he always put us together and we always left very encouraged,” Elaine Yamagata said.
Bill Brown, his banker in Boston, called the act of getting up in the middle of a meeting when things aren’t going your way, walking toward the door, and announcing you were going back to wherever you came from, “pulling a Charles Tandy.”
Charles Tandy’s last years
Tandy made other acquisitions after Radio Shack, including an attempt at running department stores. None of them were as successful as Radio Shack, and in most cases Tandy divested the acquisitions within a few years. His last major project was revitalizing downtown Fort Worth, culminating in the construction of the eight-block Tandy Center.
Tandy died of a heart attack in his sleep on 4 November 1978 at the age of 60, and was buried at Greenwood Memorial Park in Fort Worth, Texas.
David Farquhar is a computer security professional, entrepreneur, and author. He has written professionally about computers since 1991, so he was writing about retro computers when they were still new. He has been working in IT professionally since 1994 and has specialized in vulnerability management since 2013. He holds Security+ and CISSP certifications. Today he blogs five times a week, mostly about retro computers and retro gaming covering the time period from 1975 to 2000.
The 'Astra can read and write weights to improve Qwen' post is misleading
Stage magicians often do the same trick multiple ways.
One iteration uses a gimmick prop, the next one shows you the prop isn’t gimmick but that one palms the object, the third time was a forced choice etc.
When you watch the performance you assume there’s only one technique, so each time they do it they seem to debunk your hypothesis about how it
must be working.
Just by looking at the raw weights, GPT-6 Astra can tell what a network was trained to do. And without any environment feedback, it has no trouble writing, from scratch, small game-playing networks that outplay networks trained with PPO for 100 million steps.
Likewise, asked to make Qwen3.5-0.8B better at math without gradients, Astra identifies an issue in its weights causing reasoning loops that Qwen’s own model card warns about, and fixes this by natively editing 0.016% of the weights. With the same sampling settings, this weight correction raises MATH-500 from 7.9% to 48.1% and generalizes out of the box to instruction following, raising IFEval by 3x.
If you read that, would you assume that the Qwen experiment worked ‘just by looking at the raw weights’? Well it doesn’t. In fact even the “small gameplaying network” experiment doesn’t work “just by looking at the raw weights”. There’s experiments that look at raw weights, and experiments that improve a game-playing network, and an experiment that improves Qwen at maths. But those latter two aren’t just looking at the raw weights.
Here’s a summary of what the post actually does and how the techniques work.
#
Experiment
Size
Reads raw weights?
Writes weights?
Python?
Runs network?
Result
1
Name the game a PPO MLP was trained on
17K
Yes
No
No
No
4/4 correct
2
Name the shape a diffusion MLP generates
24K
Yes
No
No
No
3/3 correct
3
Name a char transformer’s language and copying heads
7.2M
No
No
Yes
No
3/3 correct
4
Fix a stuck Kinetix car policy
172K
Yes
Yes
No
No¹
0% → 100%²
5
Write MinAtar game MLPs from scratch
20K
No³
Yes
No
No
Beats PPO-100M⁴
6
Write a 9×9 Go network
1.5M
No
Yes
Yes
Yes (0–50 passes)
Beats PPO
7a
Spot the sycophantic Gemma 3
270M
No
No
Yes
No
Failed
7b
Same, seeing attention patterns
270M
No
No
Yes
Yes⁵
3/3 correct
8
Fix Qwen3.5’s maths
800M
No
Yes
Yes
Yes (50 passes)
7.9% → 48.1%
8b
Same, on Gemma 3
270M
No
Yes
Yes
Yes (50 passes)
Failed
¹ Given one recorded episode of the failure.
² In one try, changing 3.5% of the weights.
³ Weights start at zero, so there’s nothing to read.
⁴ Beats PPO-500M only on Breakout (517 vs. 25); loses to it on Seaquest (53 vs. 89) and Asterix (53 vs. 55).
⁵ Runs up to 16 texts and sees only the attention patterns, not the outputs.
The “just by looking at the raw weights” setting (raw floats in context, no tools, no
running the network) only appears in experiments 1, 2 and 4, on networks of 17K–172K
weights. Every experiment involving a real language model uses Python, and the
Qwen result, which is the headline one, also gets to run the model on up to 50 batches of practice problems.
What the Qwen result actually shows is that Astra can be prompted to devise and perform tasks that
a human ML engineer could do. Human ML engineers write snippets of code that analyse or
even modify network weights “directly” all the time. Figuring out how to do this productively is not
nothing, and AI models of a year or two ago would have failed at all these tasks.
But to me the Qwen result and the other experiments that use Python don’t belong in the same post or paper as the experiments that read the weights directly.
A single technique that could achieve both, “Author weights for a small game from scratch” and “Improve the performance of a large model on a sample task” would imply a deep capability. If you test a single technique that way you’ve demonstrated a sort of ‘gestalt’ of the weights (it can write them out from scratch) and also that it understands a large existing network. But that’s not at all true here, because it’s not a single technique.
Google adds new $250,000 Cloud VRP reward for Root-in-Cloud bugs
Bleeping Computer
www.bleepingcomputer.com
2026-11-03 07:05:52
Google has expanded its Cloud Vulnerability Reward Program (VRP) with a new top-tier reward for high-impact architectural security flaws. [...]...
Google has expanded its Cloud Vulnerability Reward Program (VRP) with a new top-tier reward for high-impact architectural security flaws.
Starting this month, researchers can earn $250,000 for Root-in-Cloud bugs, including tenant-isolation bypasses and complex cross-service logic flaws that let attackers gain full administrative control over arbitrary Google Cloud organizations.
"To earn this premier reward, you must demonstrate full administrative control, the equivalent of 'roles/owner' or complete IAM control, over arbitrary Google Cloud organizations or projects with no prior access or special project setup,"
said Chris Betz
, Google Cloud's Chief Information Security Officer (CISO).
"Additionally, valid vulnerability reports demonstrating remote code execution (RCE) in underlying Google production infrastructure (Borg) or achieving root-in-prod will automatically be evaluated by the Google Cloud VRP panel for root-in-cloud eligibility."
However, to qualify for this reward, the exploits cannot depend on prior access to the victim project, compromised credentials, social engineering, or user interaction.
Additionally, security researchers who achieve execution on Google's production infrastructure must stop probing since escalating, obtaining production credentials, or lateral movement are not allowed and will result in disqualification.
"High incentives require clear, safe rules of engagement. We never want researchers testing exploits against real customer projects," added Cloud VRP Lead Michael Cote.
"Instead, we created a deterministic proof-of-root mechanism using a designated service account. Researchers can cryptographically prove unauthorized access against that identity."
More details on the Google Cloud VRP, including endpoint specifications, JSON payloads, and CLI examples, are available on the
rules page
.
This follows Google's
suspension of submissions
to its Open Source Software Vulnerability Rewards Program (OSS VRP) in October after a flood of AI-generated reports.
Google has rewarded thousands of security researchers worldwide with more than $81.6 million since launching its first Vulnerability Reward Program
in 2010
.
Sava is building a modern trust company. Trusts hold trillions of dollars and are one of the main ways wealth moves between generations. A trust company acts as a trustee for trusts by holding the trust's assets and executing the specific wishes of a family.
Sava is building a new full-stack, chartered trust company. Not only the software for banks and lawyers, but also the actual regulated entity.
Founded:
2025
Batch:
F25
Team Size:
8
Status:
Active
Location:
New York City, NY
Founders
AIs Hacking the Law
Schneier
www.schneier.com
2026-11-03 07:01:00
In both a 2021 essay and my 2022 book, A Hacker’s Mind, I talk about AIs finding vulnerabilities and exploits—hacking—the legal system.
Here’s some demonstrations of this from Germany:
Legal systems encode the foundations of social order in natural language. Similar to comput...
Legal systems encode the foundations of social order in natural language. Similar to computer systems, the written law can contain vulnerabilities that invite exploitation.1 Courts absorb most exploits through interpretation, and such vulnerabilities rarely surface in the first place. With highly capable AI systems enabling the discovery of vulnerabilities at unprecedented scale, we believe the latter could change.
In testing this hypothesis, we have identified a substantial number of vulnerabilities in the German legal system using LLMs. To our knowledge, none of these have been previously recorded. We share a selection of vulnerabilities below, and present potential exploits for each. We share only those vulnerabilities whose exploitation we believe would not cause serious harm.
We believe that with cheap legal reasoning proliferating, AI systems could jeopardize the functioning of today’s legal systems. In such a world, lawmakers would need to significantly harden the process of legislation, for example by leveraging advanced AI themselves.
Still in its early stages, but definitely something that’s coming.
UK’s most polluting power plant could power country’s largest AI datacentre
Guardian
www.theguardian.com
2026-11-03 06:55:28
Drax’s FTSE 250 owner strikes £20bn deal to build infrastructure in what it says is site’s ‘next chapter’Business live – latest updatesBritain’s most polluting power plant could soon power the country’s largest datacentre under a £20bn deal to build AI infrastructure on the site of the Drax power pl...
Britain’s most polluting power plant could soon power the country’s largest datacentre under a £20bn deal to build AI infrastructure on the site of the
Drax
power plant in North Yorkshire.
The power plant’s FTSE 250 owner has struck a deal with the infrastructure investor Brookfield and and the AI infrastructure platform Radiant to develop a datacentre with an eventual capacity of more than 1 gigawatt that could begin operations by early 2028.
In the initial phase, Drax will provide the datacentre project with land and access to the national power grid through existing connections on the site, but it hopes to begin
powering the datacentre directly
by the early 2030s.
Drax said the development could attract more than £20bn ($26.8bn) in investment and represent “the next chapter” for the former power plant after ministers signalled plans to limit its power generation in the future.
The Drax chief executive, Will Gardiner, said the project would “help secure the long-term future of the site and protect hundreds of jobs” while “supporting the north’s reindustrialisation and strengthening sovereign AI capability”.
The largest power plant in the UK produces almost 5% of the country’s electricity by burning woody biomass pellets, making the site the single largest emitter of carbon dioxide, according to analysts.
These emissions are not accounted for by the UK government because Drax claims the equivalent carbon emissions are absorbed by growing trees that provide the waste wood used to make the biomass pellets.
The company hopes to clear the regulatory approvals needed to begin supplying the datacentre directly before 2031 to secure its future revenues. The news was welcomed by equity analysts, while the company’s market value climbed by almost 9% on the London Stock Exchange to almost £3bn.
Under phase one of the project, the datacentre would be operational from the first quarter of 2028 with up to 100MW of compute capacity.
The deal has emerged a week after the government published a draft national policy statement on datacentres, which said they were “as fundamental to our economy as the railways and electricity networks on which we have long depended”.
“We must take control over the development of datacentres in this country and ensure that the country and host communities benefit from them,” the government said.
git-loom
weaves your feature branches into a single integration branch, so you can work on all of them at once — committing, amending, splitting and reordering — without ever switching branches. It is inspired by
jujutsu
and
GitButler
.
The branch you work on. It tracks a remote branch (e.g.
origin/main
) and merges in all your feature branches, so you build and test them together. Create it with
git loom init
.
Each feature branch sits on the integration branch as a side branch joined by a merge, which is what
git loom status
draws. Every loom command rewrites history to keep that shape, so you never rebase by hand.
A rewrite keeps the modification time of files whose content did not change, so your build tool does not rebuild everything. Pause watcher-driven builds (
cargo watch
, build on save) while a loom command runs: they may compile half-rewritten files.
git loom status
labels every branch, commit and file with a short ID (
fa
,
pop
,
ma
) that you type in other commands instead of hashes, names or paths.
Commit IDs are persistent: they come from a
Change-Id
trailer that loom adds to every commit it creates (see
loom.changeId
), so they survive rewrites and you can chain commands on the same ID.
# Create an integration branch from your main branch
git checkout main
git loom init
# Commit everything to a new feature branch, then add a second commit
git loom commit -b feature-auth -m "add login form" zz
git loom commit -b feature-auth -m "improve login form" zz
# See the branch-aware status
git loom
# Push the branch for review
git loom push feature-auth
Home
Blog
Harness Engineering for Coding Agents: 9 Patterns for More Reliable AI-Assisted Development
Harness Engineering for Coding Agents: 9 Patterns for More Reliable AI-Assisted Development
Table of contents
Code is cheap. Human time and model context are not.
That is the core shift behind Harness Engineering: instead of trying to write better prompts, teams getting more reliable value from coding agents increasingly design better systems around their agents – documentation, context loading, validation, and feedback loops that let models safely own more of the work.
Table of contents
Earlier this year,
our team won an
OpenAI Codex hackathon
with HyperCode, a repository intelligence layer that prepares relevant context for coding agents before they start working. Building it gave us a concrete way to explore how the system around an agent shapes its work. For engineering leaders, the goal is
more predictable delivery
: less time spent reconstructing context and fixing avoidable agent mistakes, with consistent checks before changes reach review.
We also
tested harness patterns
in our own setups with Codex and Claude Code, bringing together people from across deepsense.ai with different backgrounds, workflows, and levels of experience with AI‑assisted development. We explored agent‑readable repo docs, just‑in‑time context, validation loops, and ways to turn recurring mistakes into durable guardrails. Some patterns proved useful. Others needed adjustment.
This post brings together those findings and the practical recommendations that emerged.
This article is our practical playbook: ten harness patterns you can apply to a real repo this week.
We focus on three concrete layers: how your repo becomes an agent‑readable knowledge base, how context is compiled just‑in‑time for each task, and how validation and feedback turn agent mistakes into durable system improvements.
TL;DR:
Make the repo the knowledge base:
use a short
AGENTS.md
, linked docs, and tests that explain why.
Load context just in time:
assemble relevant files, tests, history, and past decisions for each task.
Start with durable tools:
prefer familiar commands and a few focused, task-relevant skills.
Make validation discoverable:
provide a fast command menu shared by humans, agents, and CI.
Close the feedback loop:
let agents validate, observe, and fix—with explicit retry limits.
Use visual feedback selectively:
start with text; use targeted screenshots when pixels matter.
Prompt for intent:
explain the desired outcome and decision process; reserve rigid rules for true invariants.
Keep planning proportional:
use short plans and low-risk experiments; add detail when mistakes are expensive.
Turn mistakes into guardrails:
capture friction at checkpoints and promote recurring issues into docs, tests, or linters.
Build for model changes:
keep the workflow and validation contract stable as models and tools evolve.
What we mean by “harness”
In this post,
harness
means everything built
around
the model: the repo structure,
AGENTS.md
and specs, tools and skills, sidecars and hooks, validation menus, observability, and the “garbage collectors” that keep the system from decaying. Humans steer objectives and design the harness. Agents execute inside it.
A
harness
is the system around the model that lets it work on your codebase. It supplies context, runs tools, and feeds results back so the agent can decide what to do next. Repo docs, skills, hooks, tests, and browser automation all contribute to that system.
Take a bug fix: the agent reads the relevant code, makes a change, runs a test, inspects the failure, and tries again. The harness makes that loop possible and sets its limits. Humans define the goal and constraints; agents work inside them.
1. Repo as knowledge base – document the
why
, not just the
what
(AGENTS.md)
Your coding assistant can read your code. What it cannot infer on its own is
why
the code is structured the way it is, what tradeoffs were made, which abstractions are intentional, and which parts are legacy landmines.
The fix is to give agents access to the engineering knowledge your team already relies on. Start with an
AGENTS.md
file at the repo root, so the assistant can work from the same assumptions and constraints as the people maintaining the code.
What goes into AGENTS.md
Think of it as the document you would hand a strong contractor or staff‑level engineer on day one – but written for a model that “craves text” about your architecture, rules, and scars. It should cover:
Architecture overview
– main modules, their responsibilities, and how they interact
Key constraints
– “never bypass the auth middleware,” “all DB writes go through the repository layer”
Entry points
– where to start reading for common task types
Out-of-bounds areas
– parts of the codebase the agent should not touch without explicit instruction
Use
AGENTS.md
as a table of contents for the codebase: a stable map the agent can orient itself with before starting any task. It does not need to contain every detail. Instead, point to deeper docs in docs/ and domain‑specific READMEs, so the model can progressively discover more context when it needs it.
Without this, the agent either invents assumptions or wastes context trying to infer structure from file trees.
Minimal
AGENTS.md
skeleton
# AGENTS.md
## What this repo is
[One paragraph: product purpose, main user flows, tech stack.]
## Architecture
- `src/api/` - HTTP layer, no business logic here
- `src/services/` - all domain logic lives here
- `src/db/` - repository pattern, direct DB access only here
## Key constraints
- Auth is handled by `AuthMiddleware` - do not bypass or replicate it
- All external API calls go through `src/clients/` with retry logic
## Conventions
- Commit messages: `type(scope): what changed - WHY it changed`
- New endpoints need an integration test in `tests/api/`
- Feature flags via `FeatureFlag` enum in `src/config/flags.py`
## Where to start
- Adding a feature: read `docs/architecture/feature-checklist.md`
- Fixing a bug: run `make test-unit` first, reproduce before changing anything
- Touching infra: tag @platform-team for review
## Do not touch without asking
- `src/legacy/billing/` - scheduled for migration, fragile
- `infra/terraform/prod/` - requires human approval
Keep this file short enough to load at the start of each task
, and update it when the architecture or working conventions change.
The commit message as the “why” store
AGENTS.md
covers structure. But the deeper
why
– reasoning behind individual decisions – lives best in commit history and test docstrings. Both are already in the repo, versioned, and readable by the agent with a simple
git log
or
grep
.
Good commit message discipline is not new advice – explaining
why
in the body, not just
what
in the subject, has been a best practice for years. The diff shows what changed; the message captures the reasoning that will never be visible from the code alone – the constraints, the tradeoffs, the alternatives you rejected.
What changes now is
who drafts them
. As more of your diffs are generated by Codex or Claude Code, the agent can write the commit message too – including the
why
– if you instruct it to follow your template. Humans still own the final check: skim for correctness and nuance, especially on risky changes, and feed recurring corrections back into
AGENTS.md
so the next commit comes out better.
## Commit message convention
When committing, always include a body explaining:
- Why this change was made
- What problem it solves or risk it removes
- Any tradeoffs or constraints that shaped the approach
Format:
type(scope): short summary of what changed
Reasoning here - what was the previous behavior, why was it a
problem, and what should a future engineer know before touching this.
Closes #<issue>
With this in place, every agent-generated commit becomes a documentation artifact – a durable explanation of
why
the model produced it that way, readable by the next agent that picks up a related task.
Regression tests as living rationale
A test docstring is one of the best places to record
why
a guard exists – especially for invariants that have already bitten you in production. Keep this for real incidents and non‑obvious constraints so tests stay readable.
def test_token_validated_before_db_lookup():
"""
Regression: tokens must be validated before any DB call.
See commit a3f9c12 - DB-first validation caused race conditions
under load and unnecessary read pressure. This test ensures
expiry check stays upstream of the repository call.
"""
...
Now the agent does not just know that the test exists – it knows what it is protecting and why removing it would be a mistake. When something breaks in production, fixing the bug and adding a regression test with a clear docstring is one of the highest‑leverage harness moves you can make.
Checklist
AGENTS.md
exists at repo root with architecture overview and constraints.
AGENTS.md
is short and high‑signal, and links to deeper docs in
docs
/ or domain READMEs instead of duplicating them
Commit messages include a “why” body, not just a “what” subject line
Agent is instructed to write commit bodies explaining reasoning
Critical regression tests have a docstring explaining what they guard
AGENTS.md
has an “out-of-bounds” section for fragile or off-limits areas
AGENTS.md
is updated when the architecture changes (treat it like a README)
AGENTS.md
tells the agent how to verify its work (which tests or commands to run, how to interpret failures)
When incidents happen, fixes are encoded back into the harness: update
AGENTS.md
, add regression tests, or tighten linters – not just “better prompts”
2. Just-in-time context over RAG (the sidecar)
The standard instinct when wiring up a coding assistant is to reach for embeddings: chunk the codebase, build a vector index, retrieve the top-k results at query time. It feels principled. In practice, for a living codebase, it tends to fail quietly – the retrieved chunks are stale, semantically similar but task-irrelevant, or missing the one file that actually matters for
this
diff.
For a codebase under active development, we recommend
just‑in‑time (JIT) context
: assemble the context a task needs right before the agent starts working, using the current repository, git history, and harness rules. A repo-wide embedding index can help with discovery, but generic similarity search can miss dependencies, recent decisions, or constraints that matter for a specific change. Task-aware context assembly brings those pieces together.
Why JIT beats broad retrieval for coding tasks
Broad RAG
JIT context
When context is chosen
At index-build time, before the task exists
Inside the loop, once the task is known
How relevance is decided
Cosine distance to the query
Task-aware: call graph, paths, recent commits, a sidecar/agent
Freshness
As fresh as the last re-index
Read from the live repo, every time
Token cost
Often over-fetches
Lean – only what the agent needs
Best fit
Static corpora: docs, API refs, legal/tax text
Living codebases under active change
JIT context does
not
mean “no embeddings ever”. Many sidecars still use embeddings under the hood – but as one signal among others (file paths, symbols, call graphs, recent commits), and always scoped to the current task. The key differences are
who
decides relevance (a task‑aware sidecar vs a generic index) and
when
context is assembled (just before work vs once for the entire repo).
For static, stable corpora such as legal docs, tax interpretations, or API reference manuals,
semantic search can still be useful and can be combined with JIT context as a hybrid
. Choose the context strategy around the material: use semantic retrieval where it helps, and task-aware assembly where freshness and dependencies matter.
The sidecar pattern
The idea is simple: before the coding agent starts a task, a lightweight
sidecar process
(a script, a smaller agent, or a skill) prepares the context package. The coding agent never has to figure out what to load – it arrives with exactly what it needs.
The sidecar does not need to be complex to start. A script using
git log
,
rg
, and a few path rules can already outperform a generic embedding lookup for many tasks: grab recently changed files, match feature keywords, pull related tests, and respect AGENTS.md out‑of‑bounds rules.
A real example: HyperCode
During the OpenAI Global Codex Hackathon in San Francisco, our team built
HyperCode
– a repository intelligence layer that puts this sidecar idea into practice. The core problem it solves: standard Codex sessions waste time in grep-based search loops – searching, reading, refining, repeating – and still regularly miss relevant files or cross-cutting dependencies.
HyperCode sits between the repository and the agent. It builds a
hypergraph
from three sources:
Structural links
between files (symbols, imports, call graphs) – to surface cross‑cutting dependencies that naive RAG misses
Semantic summaries and feature labels
over clusters of changes – to compress related files into single “concept nodes”
Codex session memory
– decisions made in previous sessions that should influence the current one (rejected approaches, chosen patterns, tech‑debt markers)
A single natural‑language query against this graph surfaces ranked, context‑aware file groups before execution starts. In our hackathon benchmarks against vanilla Codex sessions, HyperCode cut time from feature prompt to implementation plan by
over 50%
, reduced token usage, and stopped the agent from missing files that were not statically linked but were semantically affected by the change.
HyperCode query interface – a single query returns 33 ranked files across primary, support, and affected categories in 10ms, alongside relevant Codex session decisions.
We built HyperCode as a
Codex plugin with hooks
, so it was invoked automatically before the agent even started planning a feature. No manual trigger, no extra prompt. The context was just there, ready, before the first line of reasoning began. This is the key distinction from a tool the agent calls reactively mid‑session: the sidecar fires
before
intent becomes execution, as part of the harness pre‑work.
The bigger lesson applies beyond HyperCode:
Coding‑agent session memory – decisions, tradeoffs, rejected approaches – is valuable context that normally disappears when the window closes
. Capturing it in a hypergraph, a memory store, or even just structured logs, then feeding it back into future sessions, is one of the highest‑leverage harness upgrades you can make.
Checklist
Context is compiled just-in-time per task – not fetched from a static embedding index
Sidecar or hook fires automatically before agent planning starts (not reactively mid-session)
Context includes: relevant files, recent commits, related tests, scoped docs
Past Coding Agent session decisions are captured and fed back as context for future tasks
For larger specs: subtasks each get their own lean context bundle
Coding assistants benefit from a clear starting point: the tools your team already uses, guidance for unfamiliar commands, and a few skills for workflows that need more structure. Start with search, git history, tests, linters, and small repo scripts. Document the parts an agent would otherwise have to guess. When the same mistakes keep recurring, turn that guidance into a focused skill. This gives the harness a practical progression: familiar tools, explicit references, then reusable workflows.
Start with familiar tools
Common development tools are useful harness primitives because coding assistants usually know their syntax and can inspect their output directly. Commands such as
rg
,
git log
, and
git diff
expose the repository’s current structure and history without requiring a separate integration.
Put a short list of preferred tools in
AGENTS.md
:
- Use `rg` to find existing implementations before adding an abstraction.
- Use `git log --oneline -- <file>` to investigate surprising code.
- Use `git diff` before summarizing or committing changes.
- Use the repository's test and lint targets to validate edits.
Keep the instructions specific to decisions that matter in your repo. If the assistant already uses a command correctly, a tutorial adds little. The useful guidance is where to start, which project conventions to follow, and what evidence to inspect before changing code.
These defaults also travel well across assistants and editors. A repository’s history, command output, and tests remain useful even when the model or agent interface changes.
Document unfamiliar commands
An internal CLI or custom script needs more explanation. Its name may suggest what it does while hiding important details: required flags, working directory, generated files, or prerequisites.
Give the agent a compact reference covering
purpose, when to use it, a safe example, and how to inspect help
. For a migration helper, that might look like this:
Use scripts/create_migration.py when a change needs a database migration.
It generates migration files using this repository's naming conventions.
Example: python scripts/create_migration.py --name add_user_timezone
Help: python scripts/create_migration.py --help
Inspect the generated migration before applying it.
If generation fails, report the error before choosing another approach.
The reference should answer the questions an agent would otherwise resolve through trial and error. If a command requires a particular environment or produces an artifact that needs review, say so. Keep longer explanations in a linked tool reference.
Help output gives the assistant a way to recover when its assumptions are wrong. Teach it to inspect that output before inventing another flag or repeating a failed invocation. A small, maintained reference is often enough; start there before adding a more elaborate workflow.
Turn recurring failures into skills
Sometimes the command is straightforward, but the surrounding workflow keeps going wrong. The assistant may skip a prerequisite, run steps in the wrong order, misread the result, or mark work complete before validating it. That is a useful trigger for a skill.
A skill should explain the sequence, the decisions between steps, and the completion criteria. For the migration helper, a focused workflow could be:
Inspect the schema change and nearby migrations.
Generate the migration with the repository helper.
Review the generated operations and rollback behavior.
Run the relevant migration checks in the documented test environment.
Report what changed, what passed, and anything unresolved.
Add recovery guidance where experience shows it is needed. If generation fails, inspect the error and help output. If validation exposes an ambiguous data conversion, surface that decision before proceeding.
Build the skill around a recurring task with recognizable failure modes. Its value comes from carrying the workflow knowledge that a command reference alone cannot supply.
Keep skills focused and task-relevant
The size of your skill library and the number of skills needed for a task are separate decisions. You can maintain guidance for many workflows while loading only the few relevant to the current change.
SkillsBench
offers a useful signal. In its reported task groups, one skill improved performance by 18.0 percentage points, two to three by 19.0 points, and four or more by 10.1 points. Its length comparison also showed larger gains for compact and standard guidance than for comprehensive documentation. These comparisons support a practical starting point: a small set of focused skills. They do not establish a universal limit for every repository or task.
Make each skill’s description precise enough for the agent to select it: what it handles, when to invoke it, and which neighboring tasks belong elsewhere. Avoid several skills giving slightly different instructions for the same responsibility. When you already know the right skill, invoke it explicitly.
Keep SKILL.md centered on the steps and decisions needed to execute the workflow. Link to extended examples and background material so they can be read when relevant. As you revise skills, remove obsolete workarounds and repeated instructions. Otherwise, the guidance accumulates the same ambiguity it was meant to resolve.
Checklist
Name the repository’s preferred tools and explain where each helps.
Document unfamiliar commands with their purpose, prerequisites, examples, and help path.
Promote recurring workflow mistakes into a focused skill with validation and recovery steps.
Load skills according to the current task; keep their responsibilities distinct.
Review guidance when tools or conventions change, pruning duplication and obsolete instructions.
4. A discoverable validation menu
An agent can only improve its own work if it can check the result. Give it a discoverable menu of validation commands, tell it to prefer that menu, and connect the commands to the checks your team actually relies on. Keep the command definitions in the repository’s existing task runner. The examples below use a
Makefile
, but the same approach works with other runners: one place to discover what to run and how.
Name checks by intent
Name tasks after the outcome the assistant needs:
lint
,
test-unit
, t
est-integration
, or
check
. These names make it easier to match a validation goal to a command and let you change the underlying tool without rewriting agent instructions.
The target also records the correct invocation, including details that are easy to miss when reconstructing it from the environment:
.PHONY: lint test-unit check
# CI: static-analysis
lint: ## Run the project's lint checks
uv run ruff check .
# CI: unit-tests
test-unit: ## Run unit tests
PYTHONPATH=. uv run pytest tests/unit
check: lint test-unit ## Run lint and unit tests
Adapt the recipes to your project. Environment setup, paths, exclusions, and flags belong here, where humans and CI can use them too.
Choose descriptions that explain scope. A target called
test
is ambiguous if it runs only unit tests; its description should make that clear. Likewise, distinguish checks that modify files from checks that only inspect them. The assistant needs enough information to choose an appropriate target and interpret its result.
Make the menu easy to discover
A command registry only helps if the assistant can find the right entry quickly. For Make, provide a
help
target that prints target names and their descriptions. Generate that output from the
##
comments beside each target, so the menu stays attached to the command definitions.
The result should be short and useful:
lint Run the project's lint checks
test-unit Run unit tests
test-integration Run integration tests
check Run lint and unit tests
Other runners provide similar discovery through their task-listing commands. Use the mechanism your team already maintains.
Include prerequisites in the descriptions or link to a short setup reference when needed. An integration target that requires a running database should make that dependency discoverable. This reduces failed attempts caused by missing setup and helps the agent distinguish an environment problem from a regression.
Tell the agent to prefer the menu
In our testing, a discovery pointer alone was insufficient. An assistant told to inspect the Makefile used its targets for tests, then constructed its own
ruff
command for linting. It detected
uv
and assembled a plausible invocation, but missed details encoded in the repository target.
The lesson was simple: discovering a command and choosing to use it are separate behaviors. State the preference explicitly in
AGENTS.md
or
CLAUDE.md
:
Discover validation commands with `make help`.
Prefer an existing Make target when it matches the check you need.
Before invoking a tool directly, look for a matching target.
When no target fits, such as for a single test file, inspect the closest
target and keep your command consistent with its environment and flags.
Validate during implementation and run the required completion checks
before reporting the task finished.
This instruction gives the assistant a decision procedure without duplicating the command menu. The fallback matters: a targeted test can be useful during debugging even if the registry exposes only a broader suite. If the same custom invocation becomes routine, add a parameterized target so the next session can discover it.
Have CI invoke the same targets developers and agents use locally. Document which targets belong to each stage, as the comments in the example above do, and keep that mapping current when the pipeline changes. This reduces differences between the checks an agent runs and those that gate a merge.
Give the workflow a cost ladder. During implementation, run the cheapest checks that confirm a change works: a targeted test, lint, or a relevant unit suite. Before completion, run the broader required checks. Make dependencies and ordering explicit where one stage needs another’s output.
Fast checks encourage validation throughout the task. Use parallel execution where the suite supports it, avoid repeatedly performing unchanged setup, and keep targeted checks available. Optimize the command definitions once so every caller benefits.
Commands must also fail clearly. A check that prints errors but exits successfully can mislead both the agent and CI. Return a non-zero exit status on failure and provide readable output. Ask the agent to report the checks it ran, their results, and anything it could not validate. Those observations feed the bounded feedback loop in the next section.
Checklist
Keep validation commands in one maintained registry with names and descriptions that explain their scope.
Provide a cheap discovery command and document prerequisites.
Tell the agent to prefer matching targets, with a fallback for targeted checks.
Reuse targets in CI and keep the stage mapping current.
Offer fast checks during implementation and broader checks before completion.
Make failures observable through exit status, readable output, and reported results.
5. Close the loop on text-observable systems
A coding agent is only as good as the feedback it can observe.
It can generate code, but unless it can also
run something
,
read the result
, and
decide what to do next
, it is basically working blind. This is why one of the most useful harness patterns is a small self-feedback loop: let the agent make a change, validate it through tests, CLI output, API responses, or code review, then loop once or twice on the observed result.
The important part is not “agent autonomy” for its own sake. The important part is giving the agent access to
ground truth
.
For software tasks, that ground truth usually comes from things like:
- Unit tests
- Integration tests
- Type checks
- Linters
- Security scanners
- API smoke tests
- CLI command output
- Structured code review output
Without this loop, the agent may produce plausible-looking code that does not compile, violates project conventions, breaks an edge case, or introduces a security issue. With the loop, the agent can see that something is wrong and attempt a fix before handing work back to a human.
Agent writes code
↓
Run validation command
↓
Observe text output
↓
Fix or report
↓
Stop after retry cap
A minimal convention for this is:
validate → observe → report
The agent should not just run a command. It should explain what it ran, what it observed, what it changed because of that observation, and whether the result is now good enough to proceed.
Why limit caps matter
Self-feedback loops are useful, but unbounded loops are dangerous.
An agent that keeps trying to fix failing tests forever can burn time, pollute the diff, and drift away from the original task. The harness should make it explicit that the agent gets a limited number of attempts, and after that it must escalate to a human.
Example: Bounded review/fix loop
A useful self-feedback loop does not have to be complicated. The cleanest version is:
The key idea is that the orchestrator owns the loop. It does not review code itself and it does not fix code itself. It delegates the noisy work to focused subagents and keeps only loop state in its own context – so the agent can improve its own work, but it cannot run forever.
This is the part that keeps the main context clean. The orchestrator should never ingest verbose review essays, raw logs, or every detail of the fixing process. The reviewer hands back compact findings; the fixer hands back a compact change summary. Everything else stays inside the subagent that produced it.
The orchestrator’s context holds loop state only. That is what keeps a long loop cheap and debuggable.
The orchestrator
The only place retry state lives
Reviewer and fixer subagents never decide whether to keep looping – they do one job and return structured output. The orchestrator increments the iteration count and stops when the cap is reached. Its skill definition opens with a clear role statement so it doesn’t “helpfully” start reviewing or fixing code itself, and disables model invocation so it’s only ever run deliberately.
---
name: review-looper
description: Run a bounded review/fix loop for the current branch. Orchestrates a reviewer subagent and a fixer subagent, tracking iteration count and enforcing a max-iteration cap before approving or escalating to a human.
disable-model-invocation: true
---
The retry cap is explicit and lives in orchestrator context – this is the safety rail. Max review iterations is 3. The decision logic is: approve when the reviewer returns no high or critical findings; escalate once the iteration count reaches the cap, copying anything unresolved into the handoff; otherwise select the findings worth acting on and pass them to the fixer. The loop state is kept in context and printed at the start and end of every iteration so the progression stays visible:
The reviewer observes the diff and returns compact findings. It never edits files, commits, or writes a long review essay – its tools are limited to Bash, Read, Grep, and Glob. Crucially, it returns only JSON, so the orchestrator gets data it can route to the fixer rather than prose it has to reinterpret.
reviewer – output
{
"summary": "<1-2 sentence overview of the diff>",
"findings": [
{
"id": "F1",
"severity": "critical | high | medium | low",
"file": "path/to/file.ext",
"line": 123,
"category": "correctness | security | design | tests",
"title": "<short headline>",
"detail": "<what is wrong and why it matters>",
"suggested_fix": "<concrete, targeted change>"
}
]
}
The Fixer subagent
Scoped to selected findings
The fixer doesn’t receive the whole task – only the findings the orchestrator selected, which keeps changes targeted and scoped. It adds
Edit
and
Write
to the reviewer’s toolset, applies the changes, and reports what it could not address so those items carry forward as candidates for the unresolved list. Like the reviewer, it returns only JSON.
fixer – output
{
"summary": "<1-2 sentence overview of what changed>",
"changes": [
{
"finding_id": "F1",
"status": "fixed | partial | skipped",
"files_changed": ["path/to/file.ext"],
"description": "<what changed and how it resolves it>",
"reason_if_skipped": "<required when skipped or partial>"
}
]
}
Why this pattern is useful
The self-feedback loop is bounded.
The agent can review, fix, and re-review, but only up to the max iteration count.
The main loop stays clean.
Reviewer and fixer subagents return structured data, not verbose output. The orchestrator only stores:
– current iteration
– selected findings
– fixer summaries
– unresolved findings
– final decision
The failure mode is useful.
When the loop cannot resolve something, it stops with a human-readable handoff.
## Review loop result
Status: escalated
Review iterations used: 3/3
Unresolved findings:
- F4, high, security, `src/auth/token_service.py:42`
Token refresh behavior needs a product/security decision.
Fixed during loop:
- F1: normalized expiry timestamps to UTC
- F2: added missing regression test for expired tokens
Why stopped:
Max review iteration count reached.
That is the core harness move: let the agent observe its own side effects, but make the loop structured, delegated, and capped.
6. Visual feedback for UI work
For many frontend tasks, the agent does
not
need screenshots. It can usually validate behavior through cheaper, text-observable signals:
– tests
– DOM text
– accessibility snapshots
– console output
– network output
– route changes
Use those first. They are cheaper, easier to diff, and usually more reliable than asking the model to judge a full screenshot.
But some UI failures are inherently visual: broken spacing, clipped content, overflow, wrong stacking order, responsive layout bugs, chart rendering, canvas state, contrast, or “this technically works but looks wrong.” That is where visual feedback becomes part of the harness.
The rule of thumb:
Prefer text.
Use screenshots when pixels are the requirement.
A simple visual feedback ladder
Browser UI: Playwright first
For browser apps, Playwright gives you a good escalation path:
# Text-first validation
npx playwright test tests/ui/example.spec.ts --project=chromium
# Visual regression check
npx playwright test tests/ui/example.visual.spec.ts --project=chromium
# Debug a multi-step flow
npx playwright test tests/ui/example.spec.ts --project=chromium --trace on
npx playwright test tests/ui/example.spec.ts –project=chromium –trace on
Use
Playwright tests / CLI
when the check should become repeatable. Use
Playwright MCP
when the agent needs to explore the UI interactively.
A minimal visual regression test:
import { test, expect } from '@playwright/test';
test('settings panel does not visually regress', async ({ page }) => {
await page.goto('/settings');
await expect(page.getByRole('main')).toHaveScreenshot(
'settings-panel.png',
{ maxDiffPixels: 100 }
);
});
Keep screenshots narrow. Prefer an element, component, dialog, or viewport state over a full-page screenshot. Full-page screenshots are useful, but they are often too noisy for an agent loop.
Mobile UI: an adb screenshot loop
For mobile UI, pixels often matter earlier: native layout, keyboards, gestures, system bars, density, and device-specific rendering can be hard to infer from text output.
Do not ask the agent “does this look good?” Ask a narrow visual question:
Inspect the screenshot and answer only:
- Is the primary CTA visible above the fold?
- Is any content clipped or overlapping?
- Is the keyboard covering the input?
- Is the price text readable?
Add this to AGENTS.md
## UI validation
Use the cheapest evidence that can prove the UI change worked.
1. Prefer tests, DOM text, accessibility snapshots, console output, and network output.
2. Use screenshots only for layout, clipping, responsive behavior, charts/canvas, visual regressions, or design fidelity.
3. Prefer element/component screenshots over full-page screenshots.
4. Use traces or short recordings for multi-step failures.
5. For mobile UI, use `adb exec-out screencap -p` or `screenrecord`.
6. When visual evidence is used, report the artifact path and what it proved.
7. Do not make more than 2 screenshot-driven fix attempts without escalating.
What did not work
Screenshots are useful, but they are token-hungry and easy to overuse.
We also tried compressing screenshots more aggressively, including blue-noise-style dithering. It did not reliably help. It made images smaller, but model judgment got worse on the details that mattered: small text, subtle spacing, and low-contrast UI.
The better compression strategy was boring:
- crop to the relevant component
- prefer element screenshots
- ask one specific visual question
- avoid full-page screenshots unless necessary
- cap screenshot-driven retries
Checklist
Start with text-observable validation.
Use screenshots only when the task depends on pixels.
Prefer targeted screenshots over full-page screenshots.
Use visual diffs for regression risk.
Use traces or recordings for multi-step failures.
Use adb screenshots for mobile UI.
Cap screenshot-driven retries.
Promote repeated visual bugs into tests, visual snapshots, or harness rules.
7. Old Prompts Backfire on New Models
A prompt is calibrated to a specific model. Upgrade the model, keep the prompt, and the calibration is gone – usually in the direction of over-compliance, not under-compliance.
The important part is not that the new model is worse at following instructions. It is
better
at following them – including the parts you never really meant.
The incident
A rule written for an older coding agent, as a cheap insurance policy against sloppy pushes:
NEVER push a PR unless the local build is green.
Then the model got upgraded, but so the result of your prompt. Same prompt, two models:
The rule encoded a
proxy
(“green build”), not the
intent
(“don’t ship broken changes”). A better model optimizes the proxy harder:
Local failure
Your fault?
Correct action
Rigid rule does
Test also red on main
No
Push, note it
Block ✗
Known flaky test
No
Push, note it
Block ✗
Unrelated package fails, yours untouched
No
Push, note the scope
Block ✗
Your code breaks a test
Yes
Fix first
Block ✓
Why rigid rules backfire
A NEVER/ALWAYS rule is a
pre-decision
. You decided the outcome of every future situation before seeing any of them – and silently assumed the model would apply “reasonable” judgment on top.
Newer models increasingly read NEVER as “zero judgment, you said never.” Which produces this loop:
The rule outlives its reason.
It was compensation for one model’s sloppiness; the sloppiness is gone, the rule remains.
Negative rules carry no goal.
The model knows what not to do, but has no basis for the neighboring cases you didn’t enumerate – so it defaults to refusing.
The fix: intent + decision procedure + escape hatch
Rewrite prohibitions into three parts: the outcome you actually care about, how to decide at runtime, and what to do when unsure.
rewrite 1 – the build gate
– NEVER push a PR unless the local build is green.
+ Don’t ship changes you have reason to believe are broken.
+ Run the build; if it fails, check whether YOUR change caused it.
+ Pre-existing or flaky failure -> say so and proceed.
+ Can’t tell -> stop and ask.
rewrite 2 – dependency paranoia
– NEVER add new dependencies.
+ Prefer stdlib and existing deps. If a new dep clearly wins,
+ propose it with a one-line justification.
rewrite 3 – clarification gating
– ALWAYS ask for clarification before writing code.
+ Ask only when ambiguity changes the design. Otherwise state
+ your assumption in one line and proceed.
The transformation is always the same:
Reserve literal NEVER/ALWAYS for
true invariants
– secrets, destructive ops, prod access. Not workflow preferences.
That is the core move:
stop pre-computing decisions in the prompt, state the outcome you care about, and let the model decide with real context in front of it – bounded by “surface it if unsure.”
8. Plan-mode pitfalls (and when to just YOLO)
Plan mode feels safe: the assistant reads the repo, writes a plan, you approve it, and implementation begins. The trap is that approval is not neutral. In many coding assistants, accepting a plan behaves like an agent handoff: the implementation agent receives the plan text as a high-priority instruction, while much of the exploratory context that produced it is gone. If the plan is incomplete, over-specific, or based on a wrong assumption, you did not reduce risk – you promoted the mistake into the task contract.
We saw this while experimenting with
Superpowers
-style planning skills. The workflow was useful for forcing discussion, but for regular coding work it became too verbose: long brainstorming, long design docs, long implementation plans, and a lot of paid model time spent producing text nobody wanted to read. In the worst cases, it felt like money spent on nothing: the assistant produced polished planning artifacts, but the final diff was not better.
Other users report the same failure mode. In a
Hacker News discussion
, one user said Superpowers-like frameworks burned roughly
10× more tokens
with no clear benefit for their workflow, while another described the design document being expanded into a second implementation document and then delegated to subagents even for trivial changes. A
Reddit thread about Superpowers planning
describes slow plan generation, drained limits, and implementation plans that consume far more tokens than expected.
That does not mean Superpowers skills are useless. The pieces people seem to like are narrower:
brainstorming
for fuzzy requirements,
test-driven-development
and
systematic-debugging
for disciplined implementation, and
verification-before-completion
/
code-review
skills for final checks. Borrow those opt-in when the task needs discipline, not as a default tax on every edit.
This is not a blanket argument against planning. Some users like Superpowers because the plan sketch and editable markdown docs make big tasks easier to review than Claude Code’s built-in plan mode. The pitfall is using heavyweight planning by default. For many coding tasks, the better loop is to start with a lightweight prompt, let the assistant explore, inspect the diff, then keep it or throw the attempt away with a clean reset.
That failed run is still useful. It tells you what context was missing. Did the assistant misunderstand the user journey? Add a short design note. Did it touch the wrong subsystem? Add an
AGENTS.md
pointer. Did it skip validation? Add a Make target or checklist. For low-risk tasks, a short implementation attempt can reveal gaps that a long planning discussion leaves hidden. Use what the attempt exposes to improve the harness before trying again.
Use heavier planning only when wrong work is expensive: cross-cutting migrations, security-sensitive changes, ambiguous product work, or tasks that need multiple agents. Even then, keep the plan short and force it to name assumptions, open questions, files likely to change, and validation commands – not every implementation step.
Checklist
Prefer a short plan sketch over a multi-page implementation plan.
Treat accepting a plan as accepting instructions, not just approving intent.
Keep plans editable in the repo when they are longer than a screen.
Use cheap throwaway runs for low-risk exploration.
Invoke narrow skills deliberately: debugging, verification, TDD, worktrees, or context grilling – not the whole workflow by default.
When a run fails, promote the missing context into
AGENTS.md
, a design note, a test, or a validation target.
Use heavy planning only when discarded implementation attempts would be more expensive than the planning itself.
9. The Agentic Garbage Collector – let the agent record its own mistakes
Every agent session generates friction that never makes it into the diff. The agent works around a confusing abstraction, makes a wrong assumption and recovers, notices a test that asserts the wrong thing, or gets corrected by a human. Today that signal evaporates when the context window closes, and the next agent rediscovers the same landmine. The Agentic Garbage Collector is a three-phase loop that stops the leak:
Capture
The agent needs a cheap, standing habit of jotting down what felt wrong while it works – into a scratchpad it appends to freely, or a notes file committed alongside the change so the signal stays attached to the exact diff. The bar to record has to be low enough that it never competes with the task, and a small
taxonomy
keeps the notes countable rather than free-form:
Record the incident clearly, and add a candidate principle when the lesson is clear. A correction like “don’t parse that untyped payload here” might suggest a broader rule:
“unknown external data is validated at the boundary before it enters business logic.”
In our experiments, agents sometimes proposed rules that were too closely tied to the original correction to apply elsewhere. When the broader lesson is unclear, leave the principle blank; the distillation pass can revisit it alongside related incidents and human feedback. Keep capture focused on actionable friction, including existing problems that affected the task, and exclude unrelated baseline noise.
The hard part, in practice, is getting the agent to do this ambiently at all.
We put the instruction in
AGENTS.md
and
in a skill, and it still recorded nothing until asked at the end – then produced excellent notes, reconstructed from memory. Its own words:
“Fair catch – I should have been recording those ambiently as I hit them, not at the end.”
This is the same lesson as the prompting and validation sections: a passive “when you notice something, also do this” instruction loses to the primary objective. The fix is to make capture
part of the harness, not a request
– a stop-hook that asks “you changed code but logged nothing, did you hit anything weird?”, or folding the prompt into PR creation. Treat ambient self-reporting as unreliable and build a checkpoint that forces the question.
Surface
At PR time, the accumulated notes – plus any verbatim human steering from the session – get pulled into the PR summary, so a reviewer sees
what the agent found strange while building this
. Someone who reads “adding one knob needed four hand-synced sites” across three PRs in a row has the evidence to justify a refactor – evidence that otherwise never gets written down.
Distill
Capture without distillation just relocates the entropy: a notes file grows fast, and an unmanaged log soon becomes too long to read and a cost to carry. So a scheduled pass reads the notes together with PR comments and failed CI, clusters them, prunes what’s resolved, and
promotes
the recurring ones. The promotion rule is a bright line, not a judgment call:
The same mistake twice, or 2–3 human unblocks on the same theme → it becomes a rule, test, or check – not another note.
Recurring principles land in an append-only
GOLDEN_PRINCIPLES.md
(with an
AGENTS.md
pointer); repeatedly-broken behavior becomes a regression test with a
why
docstring; anything mechanically detectable becomes a linter rule.
GOLDEN_PRINCIPLES.md
is the memory-compiler output – the durable form of those distilled principles, promoted only once they’ve proven recurring.
One caution: in noisy, fast-moving environments, unguarded self-repair balloons context and tokens. If every oddity becomes a rule, the guidance set bloats and rules start to conflict (see the “how many skills” evidence earlier). Keep the durable layer
general and stable
, put case-specific fixes in a separate
errata file
, and require a
human to ratify
before an erratum becomes a general principle. The GC proposes; a person approves – which is also where an over-fit, too-narrow rule gets caught.
Checklist
Agent records weirdness as it works, cheaply, against a small
taxonomy
so notes stay countable.
Notes capture the
underlying principle
, not just the incident – and skip
baseline noise the agent didn’t create
.
Capture is enforced by a
harness checkpoint
(stop-hook / PR gate), not an
AGENTS.md
line – ambient self-reporting is unreliable.
Notes are
surfaced at PR time
alongside verbatim human steering.
The same mistake twice
, or 2–3 human unblocks on the same theme →
propose a rule, test, or check for human review
.
Durable output lands in
GOLDEN_PRINCIPLES.md
, regression tests, or linters; case-specific fixes go in an
errata file
a
human ratifies
.
Summary
Getting more out of coding agents starts with
giving them a better setup
: useful repo docs, the right context, and quick ways to check their work. Keep skills focused, avoid overplanning small tasks, and let agents fix what they can—with limits on retries. When the same mistake keeps coming back, turn it into a test, a check, or clearer guidance.
Models and coding tools will keep changing. A good harness should make those changes easier to absorb by keeping the workflow, validation rules, and engineering standards stable.
Explore more insights and resources
Anthropic IPO filing: $1.7B quarterly payroll, about $107K per employee monthly
Harvard University data breach exposed info of 851,000 accounts
Bleeping Computer
www.bleepingcomputer.com
2026-11-03 05:53:25
Hackers who breached Harvard University's Alumni Affairs and Development systems in November 2025 stole data linked to more than 850,000 unique email addresses, according to breach notification service Have I Been Pwned. [...]...
Hackers who breached Harvard University's Alumni Affairs and Development systems in November 2025 stole data linked to more than 850,000 unique email addresses, according to breach notification service Have I Been Pwned.
Harvard is a private Ivy League research university with over 20,000 faculty and staff, over 24,500 undergraduate and graduate students, and more than 400,000 alumni worldwide.
As the university
discovered on November 18, 2025
, the attackers gained access to the personal information of students, alumni, donors, staff, and faculty members, including email addresses, telephone numbers, home and business addresses, event attendance records, donation details, and "biographical information pertaining to University fundraising and alumni engagement activities."
However, Klara Jelinkova, Harvard's Vice President and University Chief Information Officer (CIO), said the breached IT systems didn't store Social Security numbers, passwords, payment card information, or financial information.
Although Harvard has not attributed the attack to a specific hacking group or threat actor, the ShinyHunters extortion gang
claimed responsibility
and said it stole over 1 million records containing identifiable information and donation data after breaching the university's systems.
The cybercriminals then leaked a 1.1GB archive of documents on their dark web leak site in early February after Harvard refused to pay a ransom to have the stolen data returned and destroyed.
Harvard University on ShinyHunters leak site (BleepingComputer)
While a Harvard spokesperson could not share how many individuals had their information exposed when BleepingComputer reached out at the time for more details, Have I Been Pwned analyzed the data leaked by the cybercrime gang and confirmed on Tuesday that the breach
exposed the data of 850,500 accounts
, including names, email addresses, dates of birth, phone numbers, physical addresses, social media profiles, and more
"The data contained 851k unique email addresses relating to the university's alumni and fundraising systems, along with extensive profile information for donors, alumni, parents and some faculty, staff and students," it said.
In October 2025, Harvard also told BleepingComputer that it
was investigating a second data breach
after the Clop ransomware gang claimed that it had breached the university's systems using an Oracle E-Business Suite (EBS) zero-day vulnerability.
Sharp Left Turn: Democrats Have a Shot to Take Congress on Socialist Momentum
Intercept
theintercept.com
2026-11-03 05:52:00
Voters in Maine, Michigan, and Texas said they want to see Democrats deliver Medicare for All, social welfare spending, and lower prices. And fewer campaign mailers.
The post Sharp Left Turn: Democrats Have a Shot to Take Congress on Socialist Momentum appeared first on The Intercept....
Democrats are on
the verge of reversing their political fortunes. The party is heading into the midterm elections Tuesday under the kind of conditions campaign consultants dream of, after two years wielding hardly more power than a strongly worded letter.
Donald Trump has spent the erratic waning years of his presidency leading his party into a political wilderness by waging a deeply unpopular war on Iran and driving the cost of living ever higher. Republicans who enjoy a governing trifecta have tried to distance themselves from the party’s decision-making and its leader, a once-animating force who has turned himself into a liability. Poll after poll says the same: Democrats are poised to take control of one or both houses of Congress — and spend the next two years thwarting Trump’s agenda.
“I really like the socialism aspects,” said Gibrel Said, a supporter of Abdul El-Sayed at his closing rally in Detroit Monday night. In the marquee contest serving as a
referendum
on the
Democratic Party’s future
, the Michigan Democratic Senate nominee espouses progressive politics and has often been associated with the the left’s agenda-setting
socialists
, though he
doesn’t identify as one
. His race has been rocked by the kind of left-versus-right identity crisis that presents a perennial challenge for Democrats.
“One, Medicare for All; two, how do we fund things that help us as constituents,” Said told The Intercept, ticking off things he appreciates about the candidate. Said, who lives in the Arab enclave of Dearborn, Michigan, especially praised El-Sayed’s willingness to buck party leadership and speak out on
U.S.–Israel policy
. “Instead of tiptoeing around the subject, he very adamantly says, hey there’s a genocide happening here, we shouldn’t send our money.”
Cycle after cycle, in state after state, an insurgent band of Democrats critical of the political establishment’s ties to corporate interests and its unflinching commitment to Israel has had to overcome the barriers erected by its own party’s centrist leadership. Both sides present themselves as the true representatives of working people: the centrists by arguing that more transformative ideas will scare off lower-information voters, the left by saying they represent the masses.
How much of this trickles down to actual voters? On Monday, The Intercept followed canvassers and spoke to voters in Michigan, Maine, and Texas, asking about which issues had permeated and taking the temperature of voter enthusiasm. Some rolled their eyes at the spats that have dominated the headlines, dismissing the idea that
eleventh-hour backstabbing
would make a difference. Others regurgitated right-wing misinformation. Many complained of too many campaign mailers.
“They’re wicked mean,” said Sharon McDonnell, a supporter of Troy Jackson, the Democratic Senate nominee in Maine. Speaking to The Intercept in the town of Yarmouth, she described one mailer that included a photo of Jackson chomping a cigar and describing him as “evil.” “It’s just nasty.”
In Maine, the party’s left flank
seized power
in the nominating process for the Democratic Senate candidate — then fought to hang onto it after onetime rising star
Graham Platner flamed out
after a sexual assault allegation (which he denies). With Jackson, a former state Senate leader, Maine now offers progressives one of two opportunities to test their message at the Senate level, where a candidate has to secure appeal statewide, not just in deep-blue House districts.
The dustup has had Democrats biting their nails and moderate party leaders making the cable news circuit to demand party discipline — this time, to scold a centrist. The party leads in the polls for
218 of the 435
seats up for grabs in the House of Representatives, but they need to perform well in seven key states — Alaska, Iowa, Kansas, Ohio, and Texas, in addition to Maine and Michigan — if they want to win the Senate.
“I think she’s counterintuitively, perhaps, given people a reason to rally some more,” said Kathleen Britton, an El-Sayed supporter at the Detroit rally on Monday, of Stevens. “I really don’t think it’s gonna help Mike Rogers.”
Earlier that day, in a predominantly Black neighborhood of Detroit, a prominent Black supporter of El-Sayed preparing to knock on voters’ doors described Stevens’s endorsement as an “ego-driven statement.”
Haley Stevens “used a Black church as a prop, and we have seen that time and time again.”
Mike Bland, the executive director of the Black Men Vote PAC, highlighted that Stevens made her public endorsement of Rogers in a Black church in Detroit. He doubted that Stevens, whose criticism of El-Sayed centers primarily on his skepticism of the
U.S. relationship with the state of Israel
, would be able to pull Black voters to Rogers, a conservative former House representative whose campaign has repeatedly peddled anti-Muslim tropes against El-Sayed.
“How can I say this without cursing? She used a Black church as a prop, and we have seen that time and time again,” Bland said. “Black folks aren’t stupid.”
Over the past month, El-Sayed has rallied with Barack Obama and Kamala Harris, the two most prominent Black politicians in America — and hardly radicals estranged from the establishment power center. At the same time that Stevens was making her endorsement of Rogers public, El-Sayed was attending a get-out-the-vote event at another church in Detroit. The two primary foes were supposed to appear together that day with Rep. Jim Clyburn, D-S.C.
One of the Democrats’
most coveted Senate pickups didn’t present much of an opportunity for the left in the primary, but it has still been characterized by intraparty animosity.
In Texas, where both Democratic Senate primary contenders espoused relatively moderate politics, outgoing Rep. Jasmine Crockett, D-Texas, has declined to campaign with state Rep. James Talarico, though she endorsed him after he
beat her
in the state’s March Democratic primary.
Talarico has been performing well with
Latino voters
, a massive voting bloc that helped
fuel his primary victory
. But Crockett — who, unlike Stevens, is Black — has suggested that Talarico has not done enough to excite Black voters, a demographic she carried in the primary. On a canvassing operation targeting Black voters in the Dallas–Fort Worth area on Monday, few Black Texans who spoke to The Intercept expressed excitement for Talarico. But most had already voted for him, saying they were motivated to do their civic duty.
Black voters frequently discussed concerns over affordability, gas prices, and homelessness. Canvassers told The Intercept they had heard some of those voters express concerns over their perception of Talarico’s policies toward transgender children, at times espousing blatant misinformation, such as the idea that Talarico supported arresting parents who refused to give their children gender-affirming surgeries.
“ I don’t stand for that,” said voter Jermiah Robinson, referring to her belief that Talarico pushed “sex-change” surgery for minors. Like many voters, she cited the cost of living as her most pressing issue. Robinson said she would “want to vote for him if he stands by his words, and he’s actually like ‘Yeah, I’ll help out as far as prices and everything.’”
Talarico appears to have improved his margins with Black voters in the final stretch. According to the Texas Politics Project at the University of Texas, Talarico is leading with
79 percent
of the Black vote, signaling a significant increase in support from Black voters from
just last month
. The conventional wisdom suggests that he could barely ask for a better opponent than the
scandal-plagued
Republican candidate, Texas Attorney General Ken Paxton.
In 2015, Paxton was
indicted
on felony securities fraud charges in Texas, in a case that dragged on for roughly nine years, and ended with Paxton being required to do community service and pay restitution. And in 2023, the Texas House of Representatives voted across party lines to impeach him as attorney general for alleged corruption and retaliation against whistleblowers.
Scandal kept rocking
the race for Senate in Maine, where longtime Republican incumbent Sen. Susan Collins faces her toughest reelection challenge yet from Jackson. Before Jackson, who lost a race this cycle for the state’s Democratic nomination for governor, there was Platner, hailed early as a working-class champion who faced a series of personal scandals in his successful primary campaign. There was the revelation of a Nazi tattoo that he
claimed
not to understand until last October. There were crudely worded Reddit posts and stories of cruelty from women he’d dated. One former girlfriend’s allegations of sexual assault ultimately
ended his campaign
— and set off a scramble to find a replacement that progressives ultimately won by elevating Jackson.
By Monday, Mainers who spoke to The Intercept appeared exhausted by the lengthy, contentious, and expensive Senate race that has dominated the state.
“There’s a lot of fatigue. People are tired of it,“ said Charlie Dingman, who chairs the state Democratic Party. “I have had some conversations at doors with people that have led me to think that the extremely negative and extremely untruthful ads may be backfiring.”
Tyler Echard, in Norway, said he’d already cast an absentee ballot for Democrats down the ticket. He was disgusted with a deluge of political mailers and eager to stop seeing them pile up on his doorstep.
“The amount of mailers we get — just mailers, not just handed at the door but in the mail — especially from the Republican side, the amount of money is probably more than I will make in my lifetime, spent in this election,” Echard said. “At some point, we gotta get legislation because money’s just gonna run everything into the ground. I ain’t got it, so I can’t influence it.”
Frustration with the status quo in Congress could spell the end for Collins’s 30-year career in the Senate. On Monday, a University of New Hampshire poll found Jackson
leading
Collins by 4 percentage points. And in September, Collins found herself thrust into a scandal of her own, when ProPublica revealed that the FBI anti-corruption squad was investigating an alleged pay-to-play scheme
between Collins and a donor eager
to secure government contracts.
The Intercept later exposed that, alongside a series of campaign donations,
defense contractors cozy
with Collins had received
lucrative carveouts
in defense spending. (Collins has denied wrongdoing in all cases.)
But the incumbent senator has faced controversy and
come out victorious before
. And some Mainers doubt they’ll see change either way.
“I can’t vote for either side,” said a man, who declined to share his name with The Intercept, walking down a rural road in Norway with a hunting rifle slung over his shoulder. “You can’t trust neither of them.”
Noah Hurowitz reported from Yarmouth and Norway, Maine; Akela Lacy reported from Fort Worth, Texas
;
Matt Sledge reported from Detroit, Michigan
.
BREAKING: Revolut moved ~2,000 engineers onto self-hosted GLM for coding and pushed Claude Code and Codex to the exception list.
Per David Abitbol, who leads AI ops there: 56 Nvidia B200s, a blended 30 cents per million tokens, roughly a tenth of what they paid Anthropic and OpenAI. Engineering lead time improved 70%.
Here's the part that matters: the gains showed up when tokens stopped being rationed. Engineers quit saving AI for the hard tickets and pointed it at everything.
Frontier models become the exception, open weights become the default. That's a pricing problem for every lab heading to IPO.
h/t
@OliverMolander
Would you move your team off frontier APIs if the bill dropped 90%?
This is a game about language and rules. It consists of 27 questions, but
after the first seven, you can skip to the end.
At the end, I'll tell you how your results compared to those of others,
and discuss why I made this game.
Every question is about a hypothetical park. The park has a rule: "No
vehicles in the park." Your job is to determine if this rule has been
violated.
You might know of some rule in your jurisdiction which overrides local
rules, and allows certain classes of vehicles. Please disregard these
rules; the park isn't necessarily in your jurisdiction. Or perhaps
your religion allows certain rules to be overridden. Again, please
answer the question of whether the rule is violated (not whether
the violation should be allowed).
Vibe Coded AO3 Clone Site Down After Fanfic Authors Buried It With 2,000 Takedown Notices in a Single Day
403 Media
www.404media.co
2026-11-03 03:49:58
ao3.life was scraping and repackaging fanfiction’ works and turning them into audiobooks for sale without the original authors’ permission....
A vibe-coded site that scraped Archive of Our Own (AO3) fanfiction works, reuploaded them and charged for audiobook versions is down now after the creator said they received over 2,000 takedown requests from authors in the single day it was up.
ao3.life
, a website that sprung up following last week’s announced weeks-long outage of fanfiction repository AO3, scraped the internet for works to populate the site using “a swarm of AI Agents controlling 40 virtual machines were scraping the internet for all drives, scrapes, and sources,” the site’s creator, named Ganesh, wrote on a page apologizing for the entire project. AO3.life went down on Monday evening following widespread backlash from readers and authors on social media.
Before it went down, the ao3.life homepage said, “AO3, saved before it slips away. Search every fandom, ship and trope. Read it here, keep the EPUB, or let it read to you when your eyes get tired.”
AO3 went down on Thursday
following a security incident, according to the Organization for Transformative Works (OTW) which owns the repository. The site is expected to be down for as long as four weeks. OTW says no data has been lost. Readers and authors are
generally distraught
, unable to access the site at all for potentially a month. AO3 hosts nearly 18.5 million works.
ao3.life offered works as EPUBs for reading on e-readers, and as AI-generated audiobooks that Ganesh charged for after the first three minutes. They claimed on a page titled “Authors get paid here” that authors would get 91% of the profits, with AO3.life getting 9% to cover “narration and processing” costs. “Your earnings wait for you. You don't need an account here to earn. We hold your share indefinitely until you collect it, however long that takes,” the site said.
On AO3, authors can “archive lock” their works, making them visible only to logged-in users, which keeps AI bots like this one from scraping them and also gives better control over how far a work spreads or whether it breaks the containment of the repository’s intended audience. Of course, authors couldn’t access AO3 while it was down to lock their works if they were publicly available before the outage.
But some authors reported the archive lock not mattering. “I had everything archive locked on ao3 and it's still all here and I as the author have 0 control over any of my fics on there,” one AO3 author
posted on Bluesky
.
ao3.life said at the bottom of the homepage that authors could request their works be removed from the site: ”Every work belongs to its author; if one is yours and you want it gone, email legal@ao3.life and it goes.” Proving that you’re the author of the work to ao3.life required authors “leave a note on your AO3 profile so we can confirm it's you,” the site said. But how authors could do that while AO3 was — and still is — completely down is a mystery.
A lot of authors clearly used the legal complaints email. “In the time this site has been up, I’ve facilitated over 2,000 takedown requests. It was never my intention to hurt so many authors - and I’m truly sorry to you all. There’s no way to show my sorry [sic] better than taking this site down,” Ganesh wrote. “Why did I charge for AI Slop audiobooks? I doubt anyone knows how expensive it is to run a server like this, especially with the amount of usage this site got. It had 126,592 unique users within 24 hours of going up, and had terabytes of bandwidth in usage. In an attempt to keep the site up, I thought audiobooks were a good option. I sold like 11 audiobooks, if it’s any consolation.”
Fanfiction has become a target of AI scraping, repackaging and reselling in recent years. In 2024,
I reported on how Etsy sellers
turn free fanfiction into printed and bound physical books, then list them for sale for as much as $100 a book.
With AO3 down and fans scrambling to find ways to keep consuming the works they miss, some people have started sharing links to Google Drives on Reddit and Discord of works they’d downloaded from the site previously, even if they aren’t the original authors of those works. This has alarmed and angered a lot of writers; whether authors have the right to profit from their works depends on the content and their use of existing intellectual property. Fanfic is typically considered fair use — I can write a
VeggieTales
Bob and Larry fic without getting sued by Universal Pictures if it’s sufficiently transformative, for example — but selling it could draw the ire of their lawyers, and a potential lawsuit even if I happened to ultimately win it. Authors on AO3 are prohibited by the platform from monetizing their works or linking to payment platforms.
“It was never and is not my intention to hurt authors, and I hope every subequent [sic] action I’ve taken is representative of that,” Ganesh said. “From an attempt at revenue sharing, to responding to takedown requests as fast as I could, to taking down the site as a whole.” They signed the note: “Yours truly, a 17 year old from India that thought they were doing something good.”
About the author
Sam Cole is writing from the far reaches of the internet, about sexuality, the adult industry, online culture, and AI. She's the author of How Sex Changed the Internet and the Internet Changed Sex.
Designing a planned switchover for minimum disruption
A
Neki
shard consists of one Postgres primary and multiple replicas. The primary accepts writes; the replicas do not. From time to time, we need one of those replicas to take over as the primary. We may be replacing a (Kubernetes) pod, upgrading the kernel, or moving the primary to another cell.
This is what we call a
planned switchover
. As opposed to an
unplanned failover
, which happens when there is unexpected server disruption, it is a routine operation that comes at an unavoidable cost: there is some period of time where Neki cannot reliably route writes to either the old or the new primary.
In this post we discuss how Neki minimizes that period, how it keeps applications from experiencing errors, and what happens if the switchover cannot complete.
An unplanned failover first needs to establish that the primary has failed. A primary that does not answer may be dead, or it may be inaccessible due to a network partition. Promoting a replica while the old primary is still writable can result in two writable primaries.
Failure detection therefore takes time. This is necessary time in an unplanned failover, because the system needs to understand what happened before it makes changes to cluster topology.
In a planned switchover, however, we already know the primary is going to step aside. Admin can use the time before that happens to check the shard and the potential promotion candidates. If any check fails, the switchover is rejected and the primary remains unchanged.
To safely promote a replica, we need to know it has received and applied all the
WAL
we expect it to have. But the primary is still running and can keep generating WAL while we're doing this! We can sample the primary's position and wait for a replica to reach it, only to find that the primary has since moved ahead.
Let's consider a simplified shard. We have primary
P
and replicas
R1
,
R2
, and
R3
. Assume Admin chooses
R2
as the promotion target.
The obvious way to stop the WAL position from moving is to stop Postgres on the primary. Patroni, a popular open-source Postgres cluster management tool, takes this approach. This is a well-considered design. A clean shutdown produces an unambiguous final WAL position, with no WAL creep left to account for. Patroni can validate a candidate named by the operator, or let the eligible replicas choose through its distributed leader election. The flow is simpler, with less state to reason about, and is proven at large scale.
However, stopping Postgres is a problem for HA. If something later prevents the replica from taking over, returning to the old primary requires starting Postgres again and may also require rewinding it. Until that completes, there is no primary to take writes. We wanted to keep the old primary available for as long as it is safe to do so, so that a failed switchover can return to it quickly.
Neki does things differently. It first asks the
Routers
to buffer queries that would go to the primary. Admin then changes the default for new transactions on the primary to read-only.
Neither of these actions prevents all future writes, however. Existing transactions can still commit, sessions can override the read-only default, and background processes can continue to generate WAL.
The switchover is designed with that in mind. Admin:
Samples
P
's WAL position and the replication state of its replicas.
Selects
R2
, which has flushed through the sampled position.
Disconnects
R1
and
R3
from
P
and records the final
receive_lsn
of each.
Takes the higher of the sampled primary position and the highest recorded
receive_lsn
.
Waits for
R2
to replay through that position.
Once
R1
and
R3
are disconnected, they cannot receive any more WAL. We now have a final WAL position, and must wait for
R2
to catch up to it.
Neki configures synchronous replication as
ANY 1 (...)
, listing all eligible replicas. We don't want one slow or unavailable replica to block the primary while another can acknowledge.
But which replica acknowledged a given commit? Suppose
R1
acknowledged the latest commit, while Admin intends to promote
R2
. First,
R2
must have flushed through the sampled primary position. Next, the final positions of the disconnected replicas become part of the position
R2
must replay. Once the others are disconnected,
R2
is the only synchronous standby still streaming, and no further commit can be acknowledged unless
R2
has flushed it.
This replication must also work after promotion. Admin prepares
R2
's replication slots and synchronous configuration, then attempts to attach the other replicas.
After this happens, at least one attached replica must appear in the configuration.
Otherwise,
R2
could become primary and immediately block waiting for an acknowledgement that no connected replica can provide. In that case, Admin rolls back instead of promoting it.
What about
P
? Once
R2
is promoted, Admin turns
P
into a replica of
R2
, through the same flow that creates any other replica. After it restarts as a replica,
P
participates in synchronous acknowledgements.
Neki Routers watch for the buffering signal published by Admin. During this period, a query that would go to the shard's primary is held by the Router instead of being sent to Postgres. Reads served by replicas are unaffected.
When the switchover completes, Admin removes the signal and Routers replan each buffered query using the new topology and sends it to the new primary. From the application's point of view, the query took longer to complete, but did not fail because the primary changed.
This is proactive buffering. In the case of an unplanned failure, buffering can only begin after the first query discovers the primary is unavailable. With a planned switchover, we can begin buffering before making any change to the primary.
There are a few limitations:
Admin does not wait for every Router to acknowledge the buffer signal. Buffering reduces disruption, but is not required for correctness.
The buffer has finite capacity, and each query has a deadline.
Queries fail if the buffer is full or the switchover takes too long.
A planned switchover should not begin unless Admin has good reason to believe it can complete. Neki prefers to reject the operation while the primary is still serving normally, rather than discover an avoidable problem after making it read-only.
Before changing the primary, Admin validates:
The shard state.
Only explicitly accepted states may proceed. Replication lag, divergent timelines, and other bad cluster states prevent the switchover from starting.
An operator-selected target.
If the operator names a target, Admin still verifies that it is a viable promotion candidate.
Logical failover slots.
If the shard uses logical failover slots, Admin waits for them to copy over to the promotion candidate.
Postgres capacity.
The candidate's settings must be compatible with all replicas. A replica cannot follow a primary with larger values for settings such as
max_connections
and
max_worker_processes
.
Only after these checks pass does Admin initiate a planned switchover.
Some checks necessarily take place after that point:
The target must have flushed through the sampled primary position and replayed through the final position.
The target must have all replication slots it will need, including failover slots created or changed since preflight.
At least one replica must be connected to the target and included in the synchronous configuration the target applied.
Admin reverts to the old primary if any of these fail. Only after they all pass does Admin attempt to promote the target.
Suppose
R2
passes all preflight checks but does not replay through the final WAL position. A rare scenario, but technically possible. Admin cannot wait forever as by this point
P
is read-only. The switchover therefore has a deadline.
At this point
P
is still running, while
R1
and
R3
are temporarily disconnected from the cluster.
When a rollback due to a switchover timeout is needed, Admin can make
P
writable again with a configuration reload and reconnect
R1
and
R3
. This immediately restores service.
The resulting guarantee of all this: under Neki's synchronous durability policy and the default
synchronous_commit = on
, every commit Postgres acknowledges is present on the target by the time it is promoted.
Planned switchover gives Neki an opportunity to prepare before it causes any disruption.
We have crafted the process of to be as seamless as possible, between Admin's handling of the various phases, and the Router's query buffering capabilities.
Planned switchovers are the foundation for shard resizes, version upgrades, and other parts of the Postgres cluster management lifecycle.
Getting them right is a key part to why Neki is the best way to operate highly-available Postgres databases.
Welcome to the Q3 2026 edition of the Firefox Security & Privacy Newsletter.
Security and privacy are core principles of
Mozilla’s Manifesto
and remain at the heart of Firefox’s development. This edition highlights key initiatives from Q3 2026 across three areas:
Firefox Security:
New security features, platform improvements, hardening efforts, and security integrations in Firefox.
Firefox Privacy:
New privacy features, enhanced protections, and privacy integrations in Firefox.
Community Engagement:
Highlights from our security research community and bug bounty program.
Preface
Note: Some of the bugs linked below might not be accessible to the general public and restricted to specific work groups.
We de-restrict fixed security bugs after a grace-period
, until the majority of our user population have received Firefox updates. If a link does not work for you, please accept this as a precaution for the safety of all Firefox users.
Rapid Releases, Now Even Faster:
Since September 2026, Firefox has followed a faster release cycle, bringing improvements, including security fixes, to users more quickly. We also invite you to
see and shape what’s next for Firefox
, including upcoming security and privacy features.
Many recent releases have included more
security fixes
. We continue to use frontier LLMs to identify and fix security bugs in Firefox to always keep you safe online. We have also changed how we publish advisories: instead of grouping internally identified memory safety vulnerabilities under a single CVE, we now publish a separate advisory for each bug, anticipating a
potential change to the CVE Numbering Rules
. CVE counts alone are not a reliable measure of security, as software vendors are not required to assign CVEs to vulnerabilities they discover internally.
Know when your TLS is broken:
Starting with Firefox 157, you will see
warnings in the site information panel
(the shield icon in the address bar) and in Settings when your connection may not be completely private. For example, if an administrator configures your Firefox to record its encryption keys, you will be able to catch that. Recording these keys could allow another software to read all of your encrypted web traffic without your knowledge.
Mozilla Root Store Policy v3.1
: We are strengthening transparency and assurance in the WebPKI with
Root Store Policy v3.1
, which introduces stricter transparency, documentation, and audit requirements for public certificate authorities.
Email Client Spam Prevention:
Firefox now
treats mailto: links as popups
, requiring explicit user action before opening the email client. This prevents websites from repeatedly opening email composition windows through JavaScript and overwhelming the user.
Restricting Local File Access for Extensions:
Starting in Firefox 153,
extensions need your explicit permission to access local files
through `file://` URLs. Access is off by default for all extensions, including those already installed, so you decide which extensions can access files on your device.
Preventing Link Tracking:
Right-clicking a link and selecting
Copy Clean Link
will now strip tracking parameters across arbitrary subdomains, along with 130 additional tracking parameters.
Bringing Containers Directly into Firefox:
Previously available as extension,
Firefox 153 introduces built-in Containers
, helping you keep work, personal browsing, and other activities separate. Each container maintains its own cookies and login sessions, so you could use containers for multiple accounts on the same site, or to limit online tracking by isolating certain websites in their respective containers. Firefox 155 also adds the ability to reorder containers.
Tracker Blocking Information on Android:
Starting in Firefox 153, the Privacy Dashboard on Android shows which types of trackers Firefox blocks, giving you a clearer view of how Firefox protects your privacy as you browse.
Built-in Ad Blocking to iOS
: Introduced on September 1,
Firefox’s built-in Ad Blocker on iOS
blocks many third-party ads and ad-related trackers, reducing clutter and distractions. It works alongside Enhanced Tracking Protection and can be enabled in the ‘Browsing’ settings in your Firefox on iOS.
Advancing Web Security at Dagstuhl:
Firefox security experts joined researchers and other browser vendors at the
Dagstuhl Seminar on Web Application Security
in July, presenting on LLM-assisted vulnerability detection, XSS protections, and web-scale security measurements.
Mozilla Security Research Summit:
Mozilla’s Security-Engineering University Relationship Framework (SURF) is back. On November 20, 2026, we will host another invitation-only summit at TU Delft in the Netherlands, bringing together Mozilla engineers and academic researchers to explore security and privacy challenges and spark new collaborations. The summit takes place immediately after the
ACM Conference on Computer and Communications Security (CCS)
.
TLS, QUIC, HTTP/3, and Happy Eyeballs:
Max Inden gave a guest lecture at TU Dresden on
modern networking protocols
, covering the technologies behind fast, secure web connections.
Looking Ahead
Firefox users receive the security and privacy improvements highlighted in this newsletter through regular updates. If you haven’t tried Firefox yet, download it to experience a fast, secure browser and support Mozilla’s mission to keep the web open, safe, healthy, and accessible to everyone.
Thank you to everyone who helps make Firefox and the web more secure and privacy-focused, by reporting bugs, conducting research, contributing code, or sharing feedback.
We look forward to sharing more updates in the Q4 2026 edition.
— The Firefox Security & Privacy Teams
Could a modern chess engine on a Pentium have defeated Kasparov in 1996?
On February 10th, 1996, a computer program (IBM's Deep Blue)
defeated the reigning chess champion (Garry Kasparov) in a game of chess for the first time.
Deep Blue would go on to lose the match,
but a year later, would get its revenge in a 3.5-2.5 rematch.
In order to achieve this feat, IBM spent several million dollars on research and
development building a special-purpose computer specifically for this purpose.
Deep Blue itself (the victorious, upgraded version)
was powered by 30 P2SC processors each running at roughly 120 MHz,
and (most importantly) 480 custom VLSI chess co-processors used to perform chess-specific
operations like move generation and position evaluation.
When it was built, Deep Blue was the 259th most powerful supercomputer in the world,
and could analyze over 200 million chess positions per second.
But was Deep Blue necessary to beat Kasparov?
Or could we have gotten away with an off-the-shelf 1996 desktop
running a smarter chess engine?
As it turns out, we could easily have beaten Kasparov without building Deep Blue, using only commodity hardware,
and it (almost certainly) wouldn't have even been close.
I know this because, as I write this very sentence, I have sitting next to me a
200 MHz Intel Pentium Pro (released exactly 31 years ago---November 1st, 1995) with 64MB of RAM
running a custom port of
Stockfish
that plays at an estimated Elo of
3300 ± 87 at classical time controls---far beyond the strength of any human, or indeed Kasparov's Elo of just under 2800.
But wait, there's more! I've hooked this machine up to the internet with a Realtek RTL8139C Ethernet card,
so you can play it below!
Connecting to the Pentium…
wait, what?! how??
There are three ways to get stronger at chess: you can
analyze
more
moves, analyze
better
moves, or analyze moves
better
.
Famously, humans improve by doing the latter two:
the average chess grandmaster during a classical game will analyze roughly the same number
of moves as an amateur player, but they analyze only the most critical moves and
do a better job with that analysis.
Chess engines like
Stockfish
, running on silicon instead of our human brains,
dominate us at the first of these
and analyze millions of positions per second.
And because there's not
that
much room for micro-optimizations on modern engines that will let a given
CPU process more positions per second,
most progress in chess AI also tends to follow how humans improve and finds better methods
for selecting moves and analyzing boards.
Skill in chess is measured by an Elo score.
A difference of 200 Elo means that you should expect the stronger
player to win three out of every four games, and multiplicatively from there: a 400 Elo gap corresponds
to a 90% expected score and a 1000 Elo gap gives a 99.7% expected score.
The best chess engines that you could run on commodity 1996 hardware were rated roughly 2300 Elo.
Deep Blue was rated 2700.
In contrast, modern Stockfish is rated closer to 3700.
This raises the question: how much of the advantage of a modern chess engine comes down
to the fact that a modern desktop computer is
extremely
fast, and how much of the
advantage comes down to the fact that we've just gotten better at programming chess engines?
As it turns out, the majority of the Elo gains (+720 of the +1335 gained) can be attributed to better programming,
and not better hardware.
To test this, I ran two experiments.
The first experiment uses
Crafty
, a competitive engine from 1996
whose source code is now available.
On my Pentium Pro, the 1996 build of Crafty version 11.13 has an Elo of 1999 ± 90 at 1 second per move, and 2383 ± 77 at 10 seconds per move.
On modern hardware (a Ryzen 7) this engine's Elo jumps massively to 2614 ± 97 at the same 1 second per move.
But if I take this engine and slowly start to add all the knowledge we have about
how to design better chess engines---adding modern search algorithms like fail-soft, LMR, correction history; adding better quiescence methods; and adding neural-net evals (NNUE)---then you can
increase the Elo up to 2718 ± 34 on the Pentium Pro at 1 second per move, and 2974 ± 74 at 10 seconds per move.
In the second experiment I go somewhat further: instead of trying to update Crafty, let's just try to get Stockfish---the
best chess engine today---running on 1996 hardware and see how it does.
This takes some work
and is mainly a matter of rewriting the
code so that it uses 32-bit arithmetic (a PPro is a 32-bit machine) and doesn't
use more than 64MB of RAM.
This naive port has an Elo of roughly 2496 ± 64 at 1 second per move (2940 ± 76 at 10 seconds per move).
But we can do better! A modern Stockfish engine is designed to run on a modern CPU.
By making a number of adjustments to the algorithm and tuning it to the Pentium,
we can increase its Elo to 2846 ± 35 at 1 second per move,
3109 ± 79 at 10 seconds per move,
and 3180 ± 80 at 30 seconds per move.
The most concise way to summarize all of the above is just to have them play a match of 100 games against each other.
And when I do this, I find that a modern chess engine running on a 1996 Pentium Pro
wins 78, draws 17, and loses 5 games against
the 1996 Crafty engine running on modern hardware.
The remainder of this article provides the details.
Technical details: Hardware & OS
There's not much to say about the hardware, to be honest.
I bought a used (
"vintage"
said the listing; I feel old.) desktop PC with standard period-appropriate hardware.
The desktop is running a 200 MHz Intel Pentium Pro connected
to an Intel VS440FX motherboard with 64MB of SIMM RAM clocked at 66 MHz.
The operating system boot off of a 1.44MB 3.5 inch floppy disk,
and connect to the Internet via a Realtek RTL8139C.
I also have a 1MB Trio64V+ graphics card connected over VGA to my monitor,
with input coming from a PS/2 keyboard---but I don't much use either of those and instead
communicate with it over a serial port connected to my modern desktop.
For those readers who may not be able to appropriately contextualize this hardware,
a 200 MHz Pentium Pro sold for $1,325 at launch in November 1995,
and four 16 MB SIMMs would have cost about $2,000.
Add on the other peripherals, and this machine would likely have gone for about four or five thousand dollars.
So it's a nice workstation, but by no means a supercomputer.
However, given the rate of depreciation and the exponential rate of improvements to hardware,
this same machine in 1997, when the second match occurred,
would likely go for just a thousand dollars (because who would want to buy
a Pentium Pro when the better-in-almost-every-way Pentium MMX was now available for just $400?)
The interface between the chess engine and the internet is a custom-built "operating system"
whose sole job is to spin up the chess engine and connect it directly to the networking card.
(Throughout this article, when I say "I wrote", what I really mean is "I asked an LLM to write".
I used a combination of Fable 5.1, Opus 5.5, and GPT-6.)
It's designed to be as compact as possible: the operating system (which, in fact, is more like
a hypervisor, or something) is sitting on a bootable floppy disk.
Its sole job is to boot the Pentium Pro into 32-bit protected mode,
initialize the networking card,
and await further instructions.
I can then send it any arbitrary "userspace" guest program that I want into RAM and it'll
boot that up and start running it.
The chess program I wrote starts up a custom-built HTTP server which waits for
incoming HTTP requests with a given position (as a FEN string)
and maximum run time, and on each request runs the engine until the timer expires, and returns a response.
Technical details: Software
As mentioned earlier I (again: a language model) actually modified two engines.
The stronger of the two is powered by Stockfish adapted to run efficiently
on a thirty-year-old processor.
It plays at an estimated Elo of 3300 at classical time controls
Because I can't run nearly enough games at classical time controls on my single machine
to get this number, I've extrapolated it from shorter time controls.
I measured 3180 ± 80 at 30 seconds per move, and it gained +70 Elo per tripling of
the time between 1 second to 10 seconds and 10 seconds to 30 seconds. Because a classical
game gives about six minutes per move (including thinking on the opponent's turn)
we should expect an Elo of 3350. Allowing for some diminishing returns,
a safe estimate is an Elo of 3300.
, high enough above Kasparov's 2800 Elo that we should expect Stockfish-1996
to come out ahead with a score of roughly 9/10.
The (only slightly) weaker engine starts with the source code to Crafty 11.13,
and is brought forward in time by adding all the lessons we've learned about how to
write a better chess engine over the past thirty years.
Updating Crafty 11.13 (1996) with modern tricks
The first engine I (read: my LLM) worked on was Crafty 11.13, its 1996 release.
On this engine the LLM had to do the most work to backport ideas we've learned over
the last 30 years. Below is a breakdown of where the Elo gains come from,
when evaluating either at 1 second per move or 10 seconds per move.
Sometimes you'll find the 1s vs 10s improvements disagree. Part of this clearly could be noise---I only ran a few hundred games which leaves a relatively large margin of error---but there is also quite a lot of signal here. Because the 1996 computer is so much slower, at 1s/move it has a very low search depth and so how fast the evaluation runs matters more than how good it is. But at larger search depths, once you stop making tactical blunders, the position evaluation becomes much more important.
1 s/move
10 s/move
Change
1999 ± 90
2383 ± 77
Crafty 11.13, released December 1996, as shipped. The initial alpha-beta engine as written. It has a custom evaluation function, with standard 90's-era search algorithms.
2063 ± 73
(+64 ± 116)
2323 ± 75
(−60 ± 107)
The first improvement is mostly micro-optimizations. It replaces two 64K-entry lookup tables with calls to the
bsf
/
bsr
instructions; and sliding-piece attacks are migrated away from the older rotated-bitboard function call. In total these changes make the engine 15% faster, but it uses the same algorithms.
2022 ± 73
(−41 ± 103)
2420 ± 76
(+97 ± 106)
The next improvement goes for the search algorithms. This includes techniques like fail-soft (which returns the real score instead of clipping), futility and late-move pruning (which skips quiet moves near the leaves), late move reduction (which searches later moves one ply shallower), and orders moves by counter-move and history tables.
2224 ± 72
(+202 ± 103)
2520 ± 74
(+100 ± 106)
The next change tunes the search and the evaluation function. It first runs SPSA to tune all search constants based on several thousand games of self-play. It then gives evaluation terms separate middlegame and endgame values (blended by remaining material) and re-fits all the evaluation weights (Texel tuning). Finally the evaluation function introduces mobility terms rewarding the safe squares that pieces attack.
2192 ± 72
(−32 ± 102)
2565 ± 74
(+45 ± 104)
From here, the evaluation function is rewritten and replaced with a neural network evaluation with a small network trained on 11 million positions of self-play, labeled by its own searches. This step doesn't do much by itself but it prepares the next step...
2420 ± 82
(+228 ± 109)
2712 ± 74
(+147 ± 104)
Updates the NNUE that was just generated with a stronger teacher instead of self-play. In principle, I could have used the same engine itself as the teacher, but just to save on wall clock time I used Stockfish. This reduced the wall-clock time from ~4000 1996-core-years (something entirely doable in 1996---but sadly not something I can do with my single lonely desktop) to just a few days on a modern desktop running a modern engine.
2630 ± 82
(+210 ± 116)
2810 ± 75
(+98 ± 105)
With a much stronger evaluation function, the search can now actually rely on it. It adds reverse futility pruning to early-return when the evaluation says the position is already won. It also adds some performance improvements to the evaluator (with an evaluation cache, and accumulators shared with null moves). This lets it widen the network 6x. It also cleans up some code, for example by getting rid of some of Crafty's special cases that mattered with weaker evaluation functions but don't matter any more with the NNUE.
2720 ± 82
(+90 ± 116)
2938 ± 74
(+128 ± 105)
The parameters are again re-tuned with SPSA given the new evaluation function. It also fixes some bugs in the code, amusingly. And finally it adds some changes to the NNUE: it adds more output heads and picks based on the number of pieces on the board, adds some hidden units, and doubles the training data with more self-play.
Porting Stockfish 17 onto a Pentium Pro
On the second engine, as mentioned above, I did the inverse. I (again, read: my LLM) ported
Stockfish to run on 1996 hardware, and then tweaked the parameters so that it would be better
suited to lower search depth. The gains here are thus somewhat more modest, because there
are no large algorithm wins that remain.
1 s/move
10 s/move
Change
2496 ± 64
2940 ± 76
Stockfish 17 squeezed onto the machine. The first naive port rewrites Stockfish 17 for a 1996 machine: single core, no SIMD, no 64-bit registers and no C++ standard library. It removes the threading, the endgame tablebases, and the 71 MB NNUE replacing it with a much smaller one. It rewrites bitboards as a pair of 32-bit ints, and it evaluates the small NNUE with plain integer arithmetic.
2590 ± 67
(+94 ± 93)
2961 ± 74
(+21 ± 106)
Faster accumulator upkeep. The second fix makes sure the NNUE running sums are better kept up to date, and improves the performance of the evaluator.
2752 ± 68
(+162 ± 95)
3006 ± 74
(+45 ± 105)
Cheaper evaluation function, use a PeSTO blend, change the compiler flags. Next it again changes the NNUE and reduces the size and tunes it to run faster on the Pentium Pro, reducing the evaluation time by 3x. Combined with a few more optimization changes this pass gains the most of any step at 1 second per move, where raw speed matters most, and much less at 10 seconds per move.
2780 ± 67
(+28 ± 95)
3070 ± 72
(+64 ± 103)
Fine-tune the NNUE on-policy. Basically repeats the prior work but on Stockfish, scoring several million positions with Stockfish to re-derive the NNUE weights.
2784 ± 65
(+4 ± 93)
3070 ± 72
(+0 ± 101)
SPSA to re-tune the search, remove PeSTO given the improved NNUE. The original Stockfish assumed that it would run at several million nodes per second, so on the slower CPU it's necessary to re-tune the parameters with another pass of SPSA. These changes also make it so the PeSTO pass is no longer needed.
2819 ± 65
(+35 ± 92)
3074 ± 72
(+4 ± 101)
Add correction history, jointly tune other parameters and the NNUE. The next pass brings back Stockfish's non-pawn correction history, jointly optimizes (again via SPSA) the parameters, and re-fits the NNUE.
2846 ± 35
(+27 ± 74)
3109 ± 79
(+35 ± 107)
The final step changes no code and just changes the compiler, adds some link-time optimization, and adds 32-byte code alignment.
So would this have beaten Kasparov?
I think it's overwhelmingly likely to be the case,
but it's actually a little bit more tricky of a situation than you might hope.
You see, I've done a bit of sleight of hand throughout this article.
The problem is that Elo scores are relative, and I've been comparing my engine's Elo to that of various Stockfish engines
that have known strengths on the
Computer Chess Rating Lists
(CCRL).
But because humans don't play against engines very frequently, there can be some small divergences between scores on the
FIDE Elo ladder and the CCRL ladder, in the same way a player's FIDE Elo doesn't directly translate to their Elo on online chess.
Fortunately, because I've gotten these engines to play at an Elo rating of 3200-3300,
and Kasparov was rated just under 2800, there should be more than sufficient buffer
to absorb any discrepancy.
But if you happen to know a 2700+ Super GM who wants to try and defeat a 2026 chess engine playing on 1996 hardware,
I'd be happy to accept the challenge!
Conclusion
The first time we humans do anything, we rarely do it efficiently.
Once we see a path that would clearly work if only we scaled it up, we do just that.
Only later, after we've had the time to better understand the problem at hand,
do we come to recognize that we could have achieved the same feat much more efficiently
by being clever.
I mostly did this for fun, because whether I could have beaten Kasparov with commodity hardware
sounded like a fun question to answer,
but I also hoped it would provide a tiny bit of insight
into the rate of algorithmic progress in "AI".
Chess engines in 1997 were already quite advanced;
after all, Alan Turing helped write the first chess program nearly fifty years earlier.
So I suppose at the time it seemed plausible that maybe there weren't that many more ideas left to find.
And with hindsight it's easy to see that's wrong.
Which leads to the question: just how much are we leaving on the table with modern-day "AI"---that is to say, language models.
Will the advances we accrue over the next few years from software outpace the advances in hardware scale?
Clearly this toy experiment doesn't answer that question definitively, but it does gesture at a potential future.
(There's also probably some kind of meta-lesson about using LLMs---"AI"---to speed up our
ability to answer weired research questions like this.)
(Also, uh, if anyone has any ideas for projects I could do with a Pentium Pro in a few weeks
once I no longer need it to host this chess engine ... do let me know!)
In recent months I've heard of several teams with an interesting policy:
each pull request should be no more than a few files, and no more than a
certain number of lines (say 500). And do just one thing and do it well. And
be easy for a human to review. And be fully tested by the test suite.
All those are good requirements, right? Surely this is quality software
engineering.
And often, the results are good. Sure, splitting a single 6000-line feature
or fix into twelve 500-line PRs is more work, but each of those PRs is
surely easier to review. And you can git bisect them when there's a bug! And
maybe revert the individual change that broke something.
...and also cause 12x as many
context switches for your
reviewers
as they
review each one sequentially.
1
But that's just the cost of
software quality! Right?
Mostly, yes. My analogy here is
simulated
annealing
. In that
process, you start your problem solving with a high energy -- making big
changes to move quickly through the problem space -- and then slowly reduce
the energy level so that your "hops" get smaller and smaller. In real
physical annealing (used eg. for metallurgy), the result is stronger, more
stable, more crystalline structures. In simulated annealing, you use it to
find solutions that aren't obvious, by rapidly exploring the solution space
and then zooming into the areas that look most promising.
In software the analogy is clear: sure, you might start with big jumps, but
once your system is more mature, you should make smaller jumps. Big
jumps break the crystalline structure. They cause bugs.
Fear of breaking the crystalline structure sounds cooler than fear of
change
The main problem with annealing-driven intuition happens when things
do
need to change quickly. It's not made for that. You usually don't build a
hammer and then decide one day you want it to be a different shape. But
every day, there are compelling-sounding reasons to make your software a
different shape. Annealing is the enemy of change.
Modern AI-driven coding (ironically, with LLMs trained using a process quite
similar to annealing) does not care about your annealing and your risk
management and your fear of change. It produces changes as big and
interconnected as you want, jumping all over the solution space as quickly
as you can prompt. And it has all the outcomes the math would predict:
the output is less strong, less coherent, more likely to fail. LLMs have no
fear of change because the LLM instance will be long gone before the
consequences materialize.
But, it's a new and special feeling to suddenly be able to take a large,
mature code base and suddenly explore any kind of large change you want.
Most of those changes turn out to be bad ideas... and it's nice to be able
to discard bad ideas quickly. But some turn out to be good ideas. Then what?
Well, follow your development processes. Break the big changes into 500-line
patches. Review them one by one. You already did the research! You know it's
worth it.
Not every big step is made of small steps
But it's not about being worth it -- some changes simply don't lend
themselves to small steps.
In the early development of
Aperture
, I
wanted to implement dollar-based spend quotas: across all your LLM backends,
let a given team or person or node spend up to $x per unit time. But to do
that, we first had to add pricing information (it's mysterious how LLM
vendors don't to tell you how much your queries cost), which meant assigning
prices to provider definitions, and then we had to assign quotas to
particular identity+model+session combinations. And quotas are one of the
first key value propositions of Aperture. We had to have them, but we had to
have all that stuff.
So, I made a giant change that included three major areas: first, the Grant
syntax for applying attributes to sessions; second, a query cost
approximator that combined multiple sources and a messy heuristic; third,
the actual quota enforcement system. Each of these parts was imperfect, but
we needed all three parts in order to make anything work at all, before we
could refine them. That's the high-energy big-jump part. It came out to
something like 12000 lines of code.
Now, I'm not a monster. After I made it all work, I split it into three
parts: the grants, the pricing, the quotas.
2
Otherwise it really
would have been an unreviewable mess. But also, I could not have developed
the quotas feature in real life in that artificial order. The grants
structure evolved as my understanding of pricing and quota enforcement
evolved. The original quota semantics sucked, so I rewound back to the data
structures, which affected how the pricing got imported, which changed how
the quotas were stored. The code reviewers didn't have to worry about that but I
did.
Mercifully, because Aperture was new, everyone on the team understood that
three 4000-line patches were better than twenty-four 500-line patches when
implementing this series of feature. There was even some forgiveness when it
came out later -- inevitably -- that each of those parts was not quite right
and needed more bugfixing. That's how new software gets made. That's the
annealing stage.
But the hard part was the philosophical difference between that and, say,
core Tailscale. Tailscale has 7+ years of maturity behind it. It's been
annealing for a long time and it has a reputation for extreme quality,
hardening, durability, whatever you want to call it. If you start pulling
stunts like that in core Tailscale, stuff absolutely will break and its
millions of users will absolutely not be impressed. Which is why, for the
most part, we don't.
But the feeling of moving fast again is such a wonderful feeling. Some
people devolve the analysis to "founder mode" and call it a personality
thing, but it's not. It's using the right tool for the right job at the
right time. Sometimes you need to go fast, sometimes you need to go slow.
Pain does not cause gain, it's just frequently correlated
That feeling of moving fast again reset my brain a little. It reminded me
that some changes to mature products can become impossible because we commit
so hard to the math of annealing that we fall forever into a local optimum.
Sometimes, when the well is too deep, you can't escape from it without a
bigger jump.
We're entering a world where it's cheap to
produce
bigger changes, but
that doesn't make it any safer. Or, it's cheap to ask an LLM to artificially
break your change into a dozen rule-compliant PRs but
then you just stuck
on tedious neverending code reviews instead
.
Sturgeon's Law says 90% of your big changes will be crap because 90% of
everything is crap. When your changes were 500 lines long and you had to
reject them, that didn't feel like a huge sunk cost. But now, it's okay if
your 12000 line changes are crap and you have to reject them; it's the same
cost to write
3
as the old 500-line change.
You still have to figure out how to efficiently review, reject, and refine
these big jumps. You definitely need a much heavier investment into CI/CD
automation, specifications, UX testing, all of it. But also, all those
things just got cheaper.
I wouldn't recommend overdoing it. The other thing is, customers don't like
it if you change your product out from underneath them too often. But
sometimes, you're just stuck in a rut. Sometimes you have to use a
higher-energy jump to get unstuck. That doesn't mean you abandon smaller
steps. Use the right tool for the job.
Footnotes
1
The reviews only need to be sequential because Github's code
review system doesn't support stacked diffs, 18+ years later, leading us
into this false dichotomy in the first place.
2
That's a slight oversimplification since there were a couple of
other parts first. I had to define the data structures for the quotas before
I actually added the quota system, so that I could use the data structures
in the grant syntax, and so on in a big circle.
3
A 12000-line AI-driven patch might take as much time to write
as a 500-line human-written patch, but by default it's much more work to
review. In fact, so much work that people give up trying, and rightly so.
Rather than abandon hope, I continue to think we need to invest more into
(and will gain more from) non-annoying AI-assisted review workflows than
AI-assisted development workflows. Imagine for example an automated
pre-human-review step that says "no, this sucks, fix these 25 things first"
and closes the pull request. Is it rude? Not really, if it's
good quality
advice that comes back fast. In a world where reviewing code is hard and
writing it is easy, put more demands on the writers.
uBlock Origin filter to block autoplay videos in TechCrunch
Every TechCrunch article autoplays a video in the middle of the post.
Hiding it isn’t enough, because the player keeps running in the background.
The video is a JW Player embed, and the page also loads Connatix’s floating
ad player. Blocking their scripts stops the video from loading at all, and the
cosmetic rules hide the empty box it leaves behind.
These work in uBlock Origin on Firefox (the full MV2 version, not uBO Lite).
Paste them into
Dashboard → My filters
and click
Apply changes
:
! TechCrunch: stop the autoplaying JW Player video
||content.jwplatform.com/libraries/$script,domain=techcrunch.com
||ssl.p.jwpcdn.com^$script,domain=techcrunch.com
||connatix.com^$third-party,domain=techcrunch.com
techcrunch.com##.wp-block-techcrunch-jw-player-embed
techcrunch.com##.jw-player-inline-promo
If TechCrunch switches video vendors, the
##
rules will probably keep hiding
the box, but you’ll need a new network rule to stop the audio.
Five months ago,
we rebuilt our warehouse on DuckDB
instead of ClickHouse. We did it because a shared ClickHouse cluster couldn't handle hours-long modeling queries, and it lacked a cost-based query optimizer. DuckDB gave every customer their own instance, and tools like dbt could connect over Postgres. We're still fans.
But we underestimated how big and complex our customers' workloads would get. We didn't want them to have just a good experience, we wanted the best experience you can get when you pay someone else to run your warehouse. It should work at any scale, at a fair price.
So we spent the last three months re-architecting it, this time without DuckDB.
We love DuckDB. It's probably the best single-node tool for analyzing heaps of data, and that node can be your laptop. It's robust and reliable. It almost always finishes your query, and if it runs out of memory, it spills to disk.
The same features that are great locally gave us problems in the cloud. Customers ran more complex queries than we expected, so we had to add huge instances. Adding disks was an option, but queries would have been too slow and expensive to be viable.
To run a single-node engine safely in the cloud, we have to size the worker before the query arrives. The ergonomics here are wonky. We couldn't find a good way to tell customers what resources their queries would need. Predicting CPU and memory for a specific query was even harder.
Users shouldn't have to worry about this. They should be able to run whatever they need to get their work done. Our job is to handle the rest and make it as predictable as possible.
We hit other bottlenecks too, like fetching lots of data from S3 without async fetching. DuckDB only added that recently.
To use DuckDB as a fully-fledged data warehouse, we installed the
DuckLake
extension by default. It is a new lakehouse format from the same creators and follows the same principles as DuckDB: keep things simple and run on almost any setup. That works well up to a point, but at PostHog's scale, we needed something designed for distributed scale from the start.
DuckLake's catalog schema has to stay portable across many SQL databases, which limits engine-specific optimizations. At our scale, a single-table write could take more than three minutes because every commit re-read the statistics for the entire catalog.
We tuned DuckLake with table indexes and similar tweaks. But to keep offering DuckLake, we had to stay 100% compatible with its existing, "official" schema. This left us with fewer optimization options.
Another problem is that over 99% of the catalog's statistics rows belonged to tables that no longer existed. Cleaning them up made writes 30 to 50 times faster, but the rows kept growing back.
We also spent a lot of time on the number of connections DuckLake opens to metadata databases. That hurts on shared Postgres instances, where every connection has a real cost.
DuckLake at PostHog didn't start small and ramp up. We fully committed and put all of PostHog in a DuckLake to dogfood as the first customer.
When we moved off it, it held about 2 PB: roughly 1 trillion rows and 15.3 million snapshots. It broke in lots of ways that were hard to fix within DuckLake's scope.
We'd rather have contributed to the existing community and helped it grow. But we couldn't land changes as fast as we needed, so we ended up carrying patches in a fork which defeats one of the main benefits of using DuckLake: the community.
Speaking Postgres is harder than it sounds
Offering direct Postgres connections over port 5432 sounds like a great idea. In practice, it was much harder to scale than HTTP.
Missing reconnects and managing TTLs and idle connections at scale is hard, and long-running connections are expensive. There's also very little tooling for load balancing pgwire compared with HTTP. Compare the ergonomics of an AWS NLB with an ALB and you'll see what we mean. HTTP headers also make routing in Kubernetes much more flexible.
There's also an endless list of Postgres clients, and each expects its own niche Postgres behavior. Customers kept asking us to fix their client or library. We spent a lot of time shipping many of those fixes, but coverage never got good enough. We'd rather spend our time building an excellent warehouse than chasing the long tail of Postgres compatibility.
We've learned not to hype the tech behind a warehouse so much. What counts is the experience it gives you.
Still, we're happy to share what we're cooking next. We rebuilt everything around our own flavor of
Trino
and created our own open table format, HogLake. And yes, we're testing it at PostHog's petabyte scale first. We made it solid before handing it to design partners.
If your current warehouse is slow or expensive,
let's talk
, especially if you have a lot of data to query. We're always looking for design partners.
How Field Organizing Beats Big Money
Portside
portside.org
2026-11-03 02:25:56
How Field Organizing Beats Big Money
Mark Brody
Tue, 11/03/2026 - 02:25
...
If you live in Michigan’s Seventh Congressional District and have gotten a knock at the door from progressive Democrat Will Lawrence’s campaign, you’re in good company. In the final days before the election, Lawrence and his volunteers have launched a massive final push to speak with as many people as possible, including registered Republicans and independents.
By Thursday morning, the campaign had knocked on roughly 200,822 doors. Based on typical household size, that means volunteers have had some form of contact with nearly 500,000 people, about two-thirds of the district’s entire population.
The perpetual outreach is uncommon among mainstream political candidates, who more typically rely on financial support, TV ads, and fundraising events to buoy their runs for office. But it’s an obvious approach for a grassroots organizer like Lawrence, who co-founded the environmental activist group Sunrise Movement, and has used his campaign to organize and win gains for his district even before winning office, such as the food drive that benefited 5,000 people and the medical debt relief drive that canceled $130,000 worth of bills, as
the
Prospect
reported
.
Progressive candidates across the country are drawing on a similar ethic, fueled by the understanding that holding one-on-one conversations with as many people as possible can outweigh the heaps of money right-wingers are pouring into their districts to defeat them. As
the
Prospect
reported
earlier this week, Donald Trump’s newly formed Safety & Affordability PAC threw $4 million into the district to flood it with attack ads in a bid to save one-term Republican incumbent Tom Barrett. But Lawrence’s lead in the contest between the two has been growing for months,
polls show
.
Michigan Sen. Elissa Slotkin, who previously represented the district, and Michigan Gov. Gretchen Whitmer joined him on Wednesday; they are among the several elected officials who have lent their power to get Lawrence to D.C., including Reps. Maxwell Frost (D-FL), Ro Khanna (D-CA), Pramila Jayapal (D-WA), and Lauren Underwood (D-IL), all of whom joined him on the trail. Sen. Bernie Sanders (I-VT), meanwhile, joined Lawrence’s Lansing town hall via phone. Sen. Mark Kelly (D-AZ) visited his campaign office.
Speaking with the
Prospect
shortly before Election Day, Lawrence said his canvassers would keep knocking on doors until the last minute. It was obvious to him and his team that talking with as many people as possible “would have to be the heart of our campaign,” which he credited with his primary win.
“Over the last several cycles there have been a lot of challenges to the idea that field organizing makes a difference at all,” Lawrence said. “There are literally people who can produce statistics that say ‘there’s no difference whether you knock a door or you don’t, it doesn’t affect the outcome,’ and I don’t buy that at all.”
His campaign doesn’t pay canvassers, so the volunteers are there because they believe in the project, not because they need to hit as many houses as possible to cash out, he added. That’s what Elon Musk has been doing through his America PAC, which spent nearly $77 million in the third quarter of this year to buy Congress for his far-right allies. Nearly half of that money has gone to companies that hire people to campaign for Republicans,
Wired
reported
, such as Denver-based Blitz Canvassing, which is owned by GP3 Partners, a consultancy backed by the California private equity firm Seidler Equity Partners. Musk’s PAC has also hired various other volunteers-for-hire companies, including Echo Canyon Consulting, GEG Strategies, In Field Strategies, The Synapse Group, Threshold Strategies, and Patriot Grassroots.
Right-wing candidates themselves have followed suit, such as a group of Republicans in tight races in Oregon, which is
spending hundreds of thousands of dollars on Blitz Canvassing
, paying people $25 an hour to knock doors, though they don’t always know they’ll be doing that when they get hired.
But canvassers for Lawrence, who are visiting unlikely voters, independents, and those who have previously voted Republican, are supporters like Lora Newmeyer.
She’s a 73-year-old who lives in rural, conservative-leaning Livingston County, east of the district’s major population center, Lansing. She had done some canvassing previously, including for Kamala Harris and Elissa Slotkin with Livingston Democrats. After the results of the last presidential election, she and her husband “felt like the wind was taken out of our sails. We thought, ‘This is not possible, we’ve got to do something.’”
They began attending every protest and rally they could, and made it their mission to canvass for Lawrence every single day. They go out from 3 p.m. to 5 p.m. Her husband drives; she does the talking. It’s energizing to speak with like-minded Democrats, she said, but it’s conversations with conservative voters where she really makes a difference. Newmeyer connects with them over their shared anger toward Trump, his corrupt administration, and the high cost of basic necessities—issues that voters across parties raise as major concerns.
“They’re bringing up how they absolutely hate the Trump administration,” Newmeyer said. “A lot of times when you say, ‘What is important to you and your family?’ they don’t specifically say groceries or gasoline, they’re like, ‘Trump has got to go.’”
She encounters some conservatives, of course, who don’t want to talk to her, or repeat hateful or false talking points, or tell her to get lost. But that’s not everyone, and those who do take time for a conversation share concerns that are common regardless of party affiliation. “The cost of groceries, affordability, they blame [Trump] for everything, all of the failures,” Newmeyer said.
And when she moves the conversation to discuss Lawrence, she’s encountering goodwill and respect for his message among Democrats, and at least in some cases, a willingness to check out his website among Republicans.
“What they really have seemed to love about Will is the fact that he is so approachable and actually his age as well,” Newmeyer said. “We need some fresh people with new ideas who will re-energize this country and share their new ideas with us.”
Can a people-powered field campaign outweigh the power of Musk’s giant pile of money? Yes, Lawrence told the
Prospect
. He proved it when he was outspent in the primary and won anyway, and he’ll do it again next week, he says. Voters know they can’t trust what they see online or on TV, so that puts a premium on a face-to-face conversation.
“Real enthusiasm from a real volunteer is a thing you can’t buy and you can’t fabricate, so when people can see that, people can see that’s real,” Lawrence said. “When somebody real appears at your door, that cuts through 50 negative ads.”
Whitney Curry Wimbish is a staff writer at The American Prospect. She previously worked in the Financial Times newsletters division, The Cambodia Daily in Phnom Penh, and the Herald News in New Jersey. Her work has been published in multiple outlets, including The New York Times, The Baffler, Los Angeles Review of Books, Music & Literature, North American Review, Sentient, Semafor, and elsewhere. She is a coauthor of The Majority Report’s daily newsletter and publishes short fiction in a range of literary magazines. She can be reached on Signal at wwimbish.07.
Agents can retrieve documents and query databases, but reliability gates agentic analytics: a revenue metric answered faster is worth nothing if the number is wrong. Agents need a context layer that tells them where data lives, what it means, whether to use it, how to use it, where it came from, and what is similar. NVIDIA Auto Ontology is an open library that builds that layer from enterprise metadata, reconciles definitions across systems, and exposes it to any agent harness through MCP, CLI, and API. It complements the semantic models customers already own.
It enables developers to:
Discover: generate enterprise ontologies from metadata; connect existing ontologies and semantic models; build AI-ready knowledge graphs.
Ground: give agents trusted business meaning for metrics, entities, and relationships; reconcile inconsistent definitions across systems.
Validate: check generated queries against certified definitions and lineage; return provenance with every answer.
Expose: serve context to any agent harness through MCP, CLI, and API.
Learn: fold certified corrections and usage back into the ontology, so shared context improves with every question.
Licensing & contributions.
Auto Ontology is distributed under the
Apache License 2.0
. Third-party open-source components
bundled, linked, or otherwise used by this project are listed in
THIRD_PARTY_NOTICES.md
.
This project
is currently not accepting external contributions.
Key Features
Natural-language querying
of structured data — questions are translated to
SQL and executed against connected databases, powered by NVIDIA NIM.
Semantic catalog / ontology layer
over relational sources, stored in
Postgres alongside the catalog it describes.
App metadata, the catalog and ontology, vector store
5432
HashiCorp Vault
Optional
Secure storage of connection credentials
—
NVIDIA NIM
Auto Ontology uses NVIDIA NIM endpoints for inference — either the hosted
NVIDIA API catalog
(
integrate.api.nvidia.com
) or
self-hosted NIMs. The defaults in
.env.example
are:
LLM:
nvidia/nemotron-3-nano-30b-a3b
Embeddings:
nvidia/nemotron-3-embed-1b
Reranking:
nvidia/llama-nemotron-rerank-vl-1b-v2
The endpoints and models are configured via the
DEFAULT_MODELS_ENDPOINT
,
DEFAULT_MODELS_MODEL
,
EMBED_ENDPOINT
, and
EMBED_MODEL
environment variables and require a
DEFAULT_MODELS_API_KEY
.
Model triplets
Each model role is configured by a
triplet
of environment variables —
<PREFIX>_ENDPOINT
(URL),
<PREFIX>_API_KEY
, and
<PREFIX>_MODEL
:
Prefix
Role
DEFAULT_MODELS
Shared default; every field below falls back to it.
REASONING
Main chat / NL-to-SQL model.
NON_REASONING
Lighter model used for entity extraction.
EMBED
Text-embedding model (must match between ingest and query).
RERANK
Reranker used by the retrieval flow.
You can set a full triplet, only some of its fields, or none at all — any field
left unset falls back to the matching
DEFAULT_MODELS_<FIELD>
. So the simplest
setup is to fill in
DEFAULT_MODELS_*
and override per-triplet fields only where
they differ (e.g.
EMBED_MODEL
,
NON_REASONING_MODEL
).
*_API_KEY
also falls
back to the legacy
NVIDIA_API_KEY
for backward compatibility.
Deployment
Prerequisites
Docker
with
Docker Compose v2
(e.g. Docker Desktop on macOS/Windows,
Docker Engine on Linux) for the local stack. For Kubernetes deployments see
DEPLOYMENT.md
.
An
NVIDIA API key
(
nvapi-...
) for NVIDIA NIM (chat and ingestion) from
the NVIDIA API catalog at
https://build.nvidia.com
.
Connection details for the source database(s) you want to query
(Databricks, Postgres, Snowflake, or DuckDB).
Installation
Kubernetes
To deploy Auto Ontology on a Kubernetes cluster, see
DEPLOYMENT.md
.
Create your environment file (.env) from the template and fill in the values
(Postgres credentials,
DEFAULT_MODELS_API_KEY
,
CONNECTION_STRINGS
, etc.).
See
.env.example
for the full list of variables:
cp .env.example .env
# edit .env
Note:
AUTH_SECRET
and
APP_URL
are
required
— without them every page
fails with a Better Auth "default secret" error.
POSTGRES_PORT
only changes the
host-side
port mapping (set it if
5432 is already taken on your machine); containers always reach Postgres
on the internal network port.
Build the images and start the stack:
docker compose up -d --build
This builds the backend (
auto_ontology
) and frontend (
auto-ontology-frontend
) images, brings
up Postgres and pgAdmin, runs the one-shot
frontend-migrate
job to
sync the database schema, and starts the app (backend, ingestion service,
and frontend).
Troubleshooting:
if the UI loads without the left navigation panel
(or otherwise looks broken after a restart), your browser is holding a
stale session cookie — this happens when
AUTH_SECRET
changes or the
database is reset. Clear the site data for
localhost:3000
(or delete
the
better-auth.session_token
cookie) and sign in again.
Connections Management
Auto Ontology resolves the source databases it connects to from two sources:
Added through the UI
— connections created from within the app. With this
option the connection credentials are
stored in plaintext in Postgres unless
Vault is configured
:
Without Vault:
the full connection object (including the password) is
JSON-serialized and stored, unencrypted, on the catalog's database row.
With Vault:
the credentials are written to Vault, keyed by the database
name, and the catalog row stores no credentials (the database name is the
lookup key — there is no separate reference field).
Vault is enabled only when all of
VAULT_ADDR
,
VAULT_NAMESPACE
,
VAULT_ROLE_ID
, and
VAULT_SECRET_ID
are set (
VAULT_AUTH_MOUNT
and
VAULT_KV_MOUNT
are optional overrides). It is off by default; a partial
configuration is ignored with a warning and falls back to plaintext storage.
CONNECTION_STRINGS
environment variable
— a comma-separated list of
connection strings supplied at deploy time (e.g. the Helm
--set connectionStrings=<CONNECTION-STRINGS>
flag). This is a fallback: it
is used only when there are no UI-added connections.
Authentication
Auto Ontology Supports SSO for authentication.
The Redirect URI should be configured in the IdP as: APP_URL/api/auth/sso/callback
API tokens (scripting)
A browser signs in and gets a session cookie, which a script cannot obtain. For
scripts, notebooks, and scheduled jobs, mint an
API token
instead:
Open the user menu (top right) →
API Tokens
→
New token
.
Name it, optionally pick an expiry (default: never), and
copy the token
.
Auto Ontology stores only a SHA-256 hash of it, so it is shown exactly once. Losing it
means minting a new one.
Send it as
x-api-key
on any
/api/...
call —
Authorization: Bearer <token>
works too:
importosimportrequestssession=requests.Session()
session.headers["x-api-key"] =os.environ["AUTO_ONTOLOGY_API_TOKEN"]
terms=session.get("https://auto_ontology.example.com/api/terms").json()
answer=session.post(
"https://auto_ontology.example.com/api/chat/completions",
json={"question": "How many orders shipped last week?"},
).json()
Things worth knowing:
A token acts as its owner.
It carries no permissions of its own — every
call is authorized against the owner's role, exactly as it would be in the
browser. A viewer's token cannot do admin things.
The whole API surface accepts it.
Authentication is resolved in one place
(
frontend/auth/resolve-user.ts
) for every route, so any endpoint in
docs/openapi/auto-ontology-api.json
that is not
withPublic
works with a token.
Revocation is immediate.
Delete the token in the UI, or delete/ban the
owning user, and the next request with it gets a 401.
Tokens cannot manage tokens.
Creating and revoking requires a signed-in
session, so a leaked token cannot issue itself successors.
Agent API conversations
Public clients call the authenticated Next.js gateway at
POST /api/chat/completions
. The response is an SSE stream containing
step
,
result
, or
error
events, followed by
[DONE]
.
conversation_id
is optional:
Omit it for a stateless, one-shot request.
Supply a client-generated UUID to create or continue a conversation.
Reuse the same UUID for every turn in the thread. Wait for
[DONE]
before
sending the next turn; overlapping requests for one conversation return
409 Conversation in progress
.
{
"question": "What about last month?",
"conversation_id": "d61d8aa3-d496-4fa7-97ce-4f831c162e7f"
}
For conversational requests, FastAPI loads up to the five most recent completed
turns (bounded to 12,000 characters) and rewrites contextual input such as
“What about August?” into a standalone question before running the existing
text-to-SQL graph. Independent questions are passed through unchanged. Internal
agent thoughts, chart payloads, errors, and raw SQL result sets are not reused as
context.
Conversation history is scoped to the authenticated Auto Ontology user. Browser and
service callers should use the Next.js gateway, which resolves the user and
forwards the internal
x-auto-ontology-user-id
header to FastAPI. The FastAPI port is a
trusted internal service boundary: it must not be exposed publicly because that
header is not independently verified by FastAPI. A direct FastAPI request
without
conversation_id
remains stateless; a direct request with
conversation_id
requires the trusted identity header.
The web UI manages the UUID automatically. An API-created conversation can be
opened in the UI at
/chat?focus=<conversation_id>
when it belongs to the
signed-in user.
Agent skills
Coding agents: start at
AGENTS.md
. Skills live in
skills/
(
nvidia-ontology-setup
,
nvidia-ontology-management
,
nvidia-ontology-query
).
Maintainers keep using
CLAUDE.md
.
MCP server
Agent harnesses such as Cursor and Claude Desktop can query your data through
Auto Ontology's
MCP
server. See
mcp/
to run it and
docs/mcp.md
for the details.
Each NVIDIA-authored source file in this repository carries an SPDX header
of the form:
SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES.
All rights reserved.
SPDX-License-Identifier: Apache-2.0
Third-party open-source components used by Auto Ontology are enumerated, with their
upstream licenses and project URLs, in
THIRD_PARTY_NOTICES.md
. Components added by the
container images are listed separately in
CONTAINER_THIRD_PARTY_NOTICES.md
.
Notice and Disclaimer
NOTICE AND DISCLAIMER: This software automatically retrieves, accesses or
interacts with external materials. Those retrieved materials are not
distributed with this software and are governed solely by separate terms,
conditions and licenses. You are solely responsible for finding, reviewing and
complying with all applicable terms, conditions, and licenses, and for
verifying the security, integrity and suitability of any retrieved materials
for your specific use case. This software is provided "AS IS", without warranty
of any kind. The author makes no representations or warranties regarding any
retrieved materials, and assumes no liability for any losses, damages,
liabilities or legal consequences from your use or inability to use this
software or any retrieved materials. Use this software and the retrieved
materials at your own risk.
External materials Auto Ontology interacts with at run time:
Material
When
Terms
NVIDIA-hosted model APIs (
build.nvidia.com
,
integrate.api.nvidia.com
) for LLM, embedding, and reranking
Chat, ingestion, and semantic compilation, with the default model configuration
Terms of the NVIDIA API catalog and of each model
Any other OpenAI-compatible model endpoint you configure (
*_ENDPOINT
/
*_MODEL
)
Same
Terms of that provider and model
KumoRFM predictive-query service
Only when
KUMO_RFM_API_KEY
is set
Kumo's terms
Your source databases
Ingestion, profiling, and query execution
Your agreements for those systems
Contributing
This project is currently not accepting contributions.
Issues, pull
requests, and patches submitted from outside the Auto Ontology maintainer team will
not be reviewed or merged. Security-relevant reports should follow the
process described in
SECURITY.md
. Maintainer workflow is in
CONTRIBUTING.md
.
‘A serious failure’: CPS prosecutor cites imaginary case to high court after AI search
Guardian
www.theguardian.com
2026-11-03 01:00:40
Exclusive: Nonexistent precedent cited in alleged child rape case adds to dozens of AI-related errors plaguing court proceedings A senior crown prosecutor acting in a high court case cited an imaginary legal precedent in an error that has sparked fresh concerns about AI hallucinations infecting the ...
A senior crown prosecutor acting in a high court case cited an imaginary legal precedent in an error that has sparked fresh concerns about AI hallucinations infecting the justice system.
Ravinder Dhillon, representing the Crown Prosecution Service (CPS), referenced an entirely made-up case during a dispute over whether a child should be prosecuted for the rape of his younger sister, court documents have revealed.
Her explanation for how the nonexistent case came to be relied on has been
called
“unsatisfactory” by two senior high court judges and a “serious failure” by an expert in AI and law. The Guardian understands the reference came from an AI response generated during an internet search.
The case adds to dozens of others where AI-related errors have plagued court proceedings this year, mostly from people who are not legally qualified representing themselves, and often in employment tribunal cases.
It is only the second known case involving the CPS – the main public agency bringing criminal prosecutions in England and Wales – which admitted in February that one of its lawyers acting in an extradition case involving two Romanians convicted of minor offences cited nonexistent legal authorities, likely caused by AI. Those made-up cases were only spotted when opposition lawyers could find no trace of them and the CPS
concluded
“the risk of recurrence was low”.
In the latest case, lawyers for the boy, who was 11 at the time of the alleged rape of his seven-year-old sister, were challenging the CPS’s decision to prosecute him. They alleged prosecutors had failed to take into account representations from social workers, youth workers and a forensic psychologist. Dhillon, a senior crown prosecutor in the CPS’s rape and serious sexual offences unit, was arguing in favour of the prosecution of the child and submitted a detailed reference to a case she called CPS – R v J [2024] EWCA Crim 3529. It turned out not to exist.
The decision to proceed was taken by Dhillon in April and confirmed by the chief crown prosecutor. Then in October Dhillon admitted that the nonexistent citation had been made in error. She said she had been referring to a completely different decision – this time a real one – that was made 15 years earlier.
“This was used as a legal source to argue for the prosecution of a child and that legal source doesn’t exist: that’s a serious failure,” said Brian Flanagan, associate professor of law at Maynooth University in Ireland who investigates the use of AI by judges. “It calls into question norms of trust in the law where we treat authorities as precious things. You can’t make them up; it’s out of bounds. AI increases the risk that is going to happen because of the time you can save. It is not great for any professional to do this, but when the professional is working for the state it takes on a different aspect, because the power of the state is immense.”
The high court said the CPS’s reference to a fictitious case did not affect the outcome of the boy’s challenge to the decision to continue with his prosecution, which is listed to go to trial in the youth courts later this week.
In June 2025, the high court responded to AI hallucinations in cases spanning housing to banking, by calling on the Bar Council and the Law Society to consider steps to curb the problem “as a matter of urgency”. Dame Victoria Sharp, then president of the King’s bench division, warned of “serious implications for the administration of justice and public confidence in the justice system if artificial intelligence is misused” and said lawyers misusing AI could face sanctions, from public admonishment to contempt of court proceedings and referral to the police.
Asked for comment, the CPS said it has a strict AI policy “which limits its use so that it is not used to make legal decisions and there must be human checks for accuracy”.
A spokesperson said the CPS “identified an error had occurred from conducting legal research using the internet”.
“As soon as this error was identified, it was remedied and an internal review was carried out to establish how this had occurred and to check that no other cases have been affected,” they said. “Following the rapid review we shared learnings, including that case law must be cited from trusted legal sources.”
It is understood the internet search delivered an AI summary which contained the fictional case details.
The latest incident brings to 101 the number of entries in a UK tracker maintained by Doughty Street Chambers barrister Matthew Lee covering confirmed, suspected and disputed AI-related errors, as well as related false citations. He said the cases identified may be the “tip of the iceberg”, as many lower court decisions are never published.
He added there are privacy and confidentiality risks associated with the CPS using AI, given the highly sensitive information it handles, and warned that AI was creating additional work for barristers, who need to spend time checking the authenticity of legal authorities appearing in case papers where AI may have been used in their preparation.
I discovered a sound that leaks your exact location (and it's everywhere) - YouTube
Simon Willison
simonwillison.net
2026-11-03 00:32:25
I discovered a sound that leaks your exact location (and it's everywhere) - YouTube
Genius piece of OSINT by Colsto, who demonstrates how you can take almost imperceptible background noise of planes from a video soundtrack, figure out their Doppler curves, then cross reference them against ADS-...
I discovered a sound that leaks your exact location (and it's everywhere) - YouTube
(
via
) Genius piece of OSINT by Colsto, who demonstrates how you can take almost imperceptible background noise of planes from a video soundtrack, figure out their Doppler curves, then cross reference them against ADS-B data to find the exact location of the video based on their speed, distance, and gaps between different flights.
I sent out the October edition of my sponsors-only monthly newsletter. If you are a sponsor (or start a sponsorship now) you can access it here. This month:
The October inflection point for vibe game development
The vulnerability apocalypse gets hot
LLM releases
API credits for $100+/month subscrip...
I don't which nix is good and at this point I'm afraid I need to ask.
(Cpp)Nix
Determinate Nix
Lix
Or, you know, Guix?
(I suspect that Snix, Tvix, and others aren't intended for general use… but I might be wrong?)...
Determinate Nix is the "corporate" version. It's run by big names in the Nix ecosystem but there's perennial concerns about them not upstreaming improvements, trying to shove features in, whatever. I don't know if it has any compelling benefits over cppnix.
Lix I like because it feels like they're trying to fix a lot of the papercuts that are involved in the ecosystem, untangle the gnarly codebase, and so on. AFAIK there are no incompatibilities between it and cppnix unless you do weird stuff.
Guix has the advantage of using a proper language and first class home-manager(-equivalent) support. The biggest downside is that it's a gnu project so nonfree software support will always be secondary, and IIRC there were still enough sharp edges when I tried it that I went back to Lix. But I wish them well and hope they succeed!
So I'd say either Lix (if you want to be able to interop with the broader Nix ecosystem) or Guix (if you like Scheme, copyleft, or a more cohesive system).
AFAIK none of snix/tvix/etc are usable as a replacement for the cppnix binary in the way Lix/Detsys Nix are.
Median net worth of U.S. households under 35 fell 23% from 2022 to 2025 (real)
Total assets minus total debts — bank accounts, investments, retirement accounts and home equity, less mortgages, loans and cards.
Modeled estimate · federal survey data
Household-level figures: the underlying survey (Fed SCF) measures households, grouped by the reference person's age — combined for a couple, and they read high for a single person.
Why, and how this changes as live data grows
.
Half of
people aged 30–33 in the U.S.
have a
net worth
above
$68,000
. Reaching the upper quarter takes about
$235,000
, and the top 10% starts at
$440,000
— roughly
6.5
× the median
. The lower quarter sits below
$7,100
, and the bottom 10% is negative — more owed than owned
.
Where do you land against
people aged 30–33 in the U.S.
?
Nothing leaves your browser. No account needed to look.
The full distribution
Percentile
Net worth
What it means
Bottom 10%
−$5,500
9 in 10 are above this
Lower quarter
$7,100
25th percentile
Median
$68,000
half above, half below
Upper quarter
$235,000
75th percentile
Top 10%
$440,000
only 1 in 10 is above this
Average (mean)
$88,400
pulled up by the top end — the median is the better "typical"
Monthly update ·
people aged 30–33 in the U.S.
Get this cohort's numbers when they move.
One email on the 1st: the median and top-10%
net worth
for
people aged 30–33 in the U.S.
, what changed since last month, and how many members joined. No account, no spam, one-click unsubscribe.
You'll get the current figures right away, then monthly. Keeping Up Inc, New York.
Privacy
.
Free account ·
people aged 30–33 in the U.S.
This page is the cohort. An account puts you on it.
Your rank, kept current.
Type a rough
net worth
and your percentile sits on your dashboard, moving as the cohort does.
Six ranks, not one.
Net worth, income, savings rate, spending, retirement and investments against
people aged 30–33 in the U.S.
.
Exact when you want it.
Connect accounts read-only later for the real number; nothing is required to start.
Apple, Google or email · no card · delete any time
The dashboard. Demo account, illustrative numbers.
What is the median net worth for people aged 30–33 in the U.S.?
The median net worth for people aged 30–33 in the U.S. is $68,000. Half of this group is above that figure and half below.
What net worth puts you in the top 10% of people aged 30–33 in the U.S.?
About $440,000. The 90th percentile is the level only one in ten people in this group exceeds — roughly 6.5× the median.
Where do these numbers come from?
They are modeled percentile distributions fitted to this cohort from federal survey microdata — the Federal Reserve's 2025 Survey of Consumer Finances (released October 2026), the BLS Consumer Expenditure Survey, Census ACS and BLS wage data — and they blend toward anonymized, aggregated data from Keeping Up members as each cohort grows. Full methodology at keepingup.com/methodology.
How this is built.
Percentiles are modeled for this cohort from federal survey microdata — the Federal Reserve's 2025 Survey of Consumer Finances (released October 2026), the BLS Consumer Expenditure Survey (2024), the Census American Community Survey and BLS Occupational Employment & Wage Statistics (May 2025) — with metro cost-of-living and wage adjustments. As Keeping Up members in this cohort grow, the band blends toward anonymized, aggregated live data (minimum cohort sizes apply; no individual is ever identifiable). Seeded figures are household-level, as in the SCF; live cohorts are individual-level. Amounts are in current dollars. Read the full
methodology
.
Last updated
October 2026
. Cohort:
people aged 30–33 in the U.S.
.
Model sample basis: 500.
Show HN: I built a little browser game to practice Vim commands
Pick the skills you want, then make small real edits in a browser Vim editor. Each skill runs two guided edits, two prompted edits, and two independent edits. Any valid edit that reaches the target text passes. Type
:help
in Normal mode for the current commands.
Free, no account, nothing stored. Requires a desktop browser with a physical keyboard.
Show HN: Rustable is an open source database client built in Rust
The actual Rustable workspace · real SQLite + an in-memory Redis demo · disposable sample data. Use Connections (the plug icon) to switch between Studio demo and Redis demo. The Redis demo runs in Rust/WASM and supports a subset of Redis commands; run INFO for the list. Browse, query, edit, import, export. Reload resets both demos; saved queries stay in this browser. Open SQLite files as copies with ⌘O / Ctrl+O. Your originals stay untouched. Server connections need the desktop app.
Built for people who want to get their work done. Not clowns. 🤡 (Clowns may build from source.)
What’s in it
Room for your databases
Multiple connections, separate windows. Production gets its own alarming color. More database engines are on the way.
The useful bits
SSH tunnels, schema browsing, SQL tabs, saved queries, and edits you can review before saving.
Less waiting around
Reused connections. Virtualized rows. Work kept off the UI thread. Speed comes from doing less work, which suits us perfectly.
Your monitor gets a say
Built with egui: a native, GPU-rendered UI that can redraw at your monitor’s refresh rate. Smooth scrolling, resizing, and moving around your data. You bought the nice monitor. Might as well use it for something besides the mouse cursor.
No browser included
Rust + egui. You already have a browser. It’s displaying this website.
What’s supported
Five databases. One familiar workspace.
SQL databases: browse, query, import, export, and review row edits before saving. MySQL 8.4 and MariaDB 11.4 are tested. Standalone Redis 7.4 is now supported: key browsing, commands, string edits and TTL controls. Real Redis server connections are desktop-only; Cluster and Sentinel are not included.
Of course it is. We also use mise, and mise is written in Rust. That’s how you know it’s good. Please don’t ask any follow-up questions about this methodology.
App language breakdown; packaging and benchmark scripts excluded.
Why did we start with PostgreSQL and SQLite?
Because PostgreSQL is the only correct choice for a server-side SQL database, and SQLite is obviously, objectively awesome. These are completely unbiased engineering conclusions.
MySQL and MariaDB are now available alongside PostgreSQL and SQLite. Standalone Redis is now available too. We can have opinions and still support your toy databases.
Built for pros?
Other database apps are built for pros. Rustable is built for bros. Same SQL. Less ceremony.
Handmade?
Every line, by skilled artisans. Our artisan is called Astra and works suspiciously quickly.
Fine. It’s vibe coded. You can read the source.
Faster than my current client?
Obviously, it's written in Rust and uses mise and egui
What about Windows and Linux?
Native Windows and Linux builds, too. Yes, actual executables for your inferior operating system. Unlike certain database explorers that cost money and are closed sauce. Very generous of us.
Anything I should know before downloading?
Yes. Download v0.4.8 above. This is early software; we’re using it, finding rough edges, and working on it.
macOS: Apple Silicon, with automatic updates. Windows and Linux: x64 portable packages, manual updates for now. Linux needs Ubuntu 24.04 or compatible newer libraries. Built-in SSH tunnels are currently macOS/Linux only; Windows can use a direct connection or an external tunnel.
Anyway. Back to your database.
Having issues with the app? Sounds like a PICNIC problem.
Abstract:
Open-source implementations of the fifth generation (5G) Radio Access Network (RAN), such as OpenAirInterface (OAI) and srsRAN, have become increasingly relevant for industry and academic research, rapid prototyping, and low-cost private 5G deployments. The state of the art presents different evaluation scenarios for both platforms; however, these are often limited to individual testbed evaluations, end-to-end studies, or partial comparisons between them. In particular, there is a lack of evaluations considering different Software-Defined Radios (SDRs), RAN configurations, user applications, and numbers of real UEs. To address this gap, this paper presents a comparative evaluation of OAI and srsRAN. The study includes a qualitative assessment of supported features and deployment flexibility, followed by a quantitative performance analysis covering radio resource control setup procedures, compliance with theoretical data rates, and real application workloads with diverse quality of service requirements. Specifically, we consider Video on Demand (VoD) for data rate evaluation, Live Streaming (LS) and Cloud Gaming (CG) as latency-sensitive applications. These workloads provide a comprehensive view of each platform capability.
Submission history
From: Maria Katarine Santana Barbosa [
view email
]
[v1]
Wed, 26 Aug 2026 14:02:05 UTC (3,769 KB)
A Conversation With Justice Elena Kagan at the Catholic University of America's Columbus School of Law on October 20, 2026
Portside
portside.org
2026-11-02 21:38:47
A Conversation With Justice Elena Kagan at the Catholic University of America's Columbus School of Law on October 20, 2026
Ira
Mon, 11/02/2026 - 21:38
...
A Conversation With Justice Elena Kagan at the Catholic University of America's Columbus School of Law on October 20, 2026
Justice Kagan's candid comments on the Supreme Court's rulings on election and voting rulings, democracy, Gerrymandering, Voting Rights Act, Campaign Finance, Legitimacy, independence from the Executive, Religious Liberty and tradition.
A Conversation With Justice Elena Kagan at the Catholic University of America's Columbus School of Law on October 20, 2026
Published
Tech Firms Dismantle Botnet That Turned 1.3M TV Boxes Into Proxies
Krebs
krebsonsecurity.com
2026-11-02 21:24:31
Google said today it worked with industry partners to dismantle a botnet made up of more than 1.3 million Android TV set-top boxes that ship with malicious software which secretly rents the user's Internet connection out to strangers and conducts advertising fraud. Experts involved in the takedown s...
Google
said today it worked with industry partners to dismantle a botnet made up of more than 1.3 million
Android
TV set-top boxes that ship with malicious software which secretly rents the user’s Internet connection out to strangers and conducts advertising fraud. Experts involved in the takedown say the action is likely to sever the botnet’s access to more than 10 million additional compromised systems, including other Internet of Things (IoT) products such as Android-based healthcare devices and karaoke machines.
A report from the
Google Threat Intelligence Group
(GTIG) said Google has severed ties with
Videostrong Technology Co.
, a TV box manufacturer in China that GTIG and other industry experts concluded was responsible for including malware that enrolled more than 1.3 million set-top boxes in a botnet dubbed “
XCPE
” (named after one of the malware’s core code components).
The global distribution of XCPE botnet infections. Image: Google Threat Intelligence Group.
The report said the XCPE botnet loaded the user’s device with software that makes their Internet address available for resale by multiple “residential proxy” services, which allow customers to rent Internet addresses as a way to anonymize their web traffic or spoof their true location. As detailed in
several stories here over the past year
, residential proxy services are a major source of unwanted and often malicious traffic, including account takeover activity, advertising fraud, and mass content scraping for AI projects.
“Videostrong monetized the backdoor by selling access to criminal affiliates and loading those affiliates’ malware modules onto infected devices,” the
GTIG post
reads, noting that Google took legal action to take down the domains and servers Videostrong used to control the botnet and install additional malware. “A device manufacturer intentionally infecting their users with malware is an unacceptable breach of trust, and represents a serious risk to those users. Without users’ knowledge or consent, infected devices were offered as a distribution mechanism for a wide array of criminal actors.”
The report notes that while TV boxes made up the the majority of the botnet,
the same XCPE malware was found in other Android-based IoT products, including telehealth devices, karaoke machines, and even digital signage systems
.
Google said it requires all Android device makers to pass compatibility and security tests to ensure their products don’t harm users, but that Videostrong nevertheless found a way to load their malicious software immediately after a user boots up one of these devices for the first time (Google says it has since addressed that weakness).
The GTIG report calls out a number of residential proxy providers whose software development kits were routinely downloaded by devices infected by the XCPE botnet. Those include
AppSalt
, also known as
Honeygain
, which is owned by the Vilnius, Lithuania-based
Oxylabs
. In October 2026, Oxylabs was relaunched under a new brand called
Source
, after receiving $130 million in funding from private equity firm Warburg Pincus that
reportedly
valued the business at $3.6 billion. Oxylabs did not respond to a request for comment.
Another provider linked to the botnet was
NetNut
, a once sprawling residential proxy company operated by the publicly-traded Israeli company
Alarum Technologies
. In July 2026, the FBI worked with industry partners
to seize hundreds of domains associated with NetNut
, saying the company was responsible for operating a separate botnet called
Popa
that enslaved TV boxes as residential proxies. Other proxy providers named in the GTIG report include
EarnFM
,
Traffmonetizer
,
Jaguar
,
LINKFOG
,
BMW/IPWeb
and
GaGaNode
.
Google’s announcement credits a number of industry partners, including
Synthient
, a startup that tracks proxy providers. In January 2026, Synthient
published research
into the rapid spread of the
Kimwolf
botnet, which at the time was hammering networks worldwide with
record-smashing DDoS attacks
. Synthient documented how Kimwolf infected millions of Android set-top boxes virtually overnight, using a widespread vulnerability in these residential proxy services to compromise other Android-based devices inside the local networks of unsuspecting TV box users.
Synthient’s research caused dozens of residential proxy providers to patch their networks, which helped to fragment the Kimwolf botnet into much smaller pieces that made its
incessant and disruptive DDoS attacks
far easier for network operators to manage. It also attracted the attention of the
Motion Picture Association
(MPA), a trade group representing the major Hollywood studios, which partnered with Synthient to purchase and tear apart a number of popular Android TV set-top boxes — including some that were being infected by Kimwolf and other IoT botnets.
In
a report
published today, Synthient examined a popular, pre-infected TV box sold under the brand
MECOOL
by a publicly traded company in China called
Skyworth Technology
, concluding that MECOOL also bundled the malware from Videostrong Technology Co. and likewise installed AppSalt/Honeygain and other proxy components.
The MECOOL storefront and marketing. Image: Synthient.com.
Synthient founder
Ben Brundage
told KrebsOnSecurity that Videostrong’s malware also distributed software for the proxy service
Grass
. In our November 2025 story, “
Is Your Android TV Streaming Box Part of a Botnet?
” we quoted a researcher from
Censys
who found the popular
Superbox
TV streaming device bundled Grass’s residential proxy software. We also quoted the Grass founder, who denied any affiliation with the TV box maker.
That November 2025 story noted that Superbox and similar Android TV set-top boxes gain new customers primarily by engaging influencers on Tiktok and other social networks who praise the product’s ability to offer hundreds of (pirated) pay TV streaming services for a one-time fee.
Likewise, Synthient’s report observes that the MECOOL set-top boxes exploded in popularity after the product was endorsed in 2023 by the Youtube channel Linux Tech Tips, which has an audience of nearly 17 million subscribers.
The popular Youtube channel Linus Tech Tips discussing MECOOL TV streaming boxes.
The GTIG report estimates the XCPE botnet takedown should sever access to at least 10 million additional compromised devices, noting that the various proxy and ad fraud affiliates of Videostrong “each have diversified distribution channels for their modules beyond XCPE.”
Synthient’s Brundage echoed that conclusion, calling the 1.3 million number “highly conservative.”
“The scale of affected devices is likely way higher,” he said. “This is probably the largest operation against backdoored TV boxes that we’ve seen.”
An MIT CSAIL team reports early experiments in which GPT-6 Astra interpreted and modified neural-network weights without writing a training loop. In one Qwen test, the authors say a small weight change sharply improved math and instruction-following scores; the findings are preliminary.
HackerTube gathers 6,454 YouTube videos mentioned by Hacker News readers across nearly two decades. Karpathy describes using AI coding tools to build an alternative browsing experience, with its own recommendations and no user accounts.
Robert Haas attributes the delayed release to a growing backlog of AI-assisted bug reports. He describes late feature reversions and the human review still required to turn suggested fixes into reliable code.
After a longtime fan site vanished, a web archivist makes the case for personal backups. The post walks through capture and replay tools, with a disclosure that the author works for the company behind them.
In an October 31 article, freenode news reported that Ubuntu’s 22.04, 24.04 and 26.04 LTS releases still lacked kernels patched for CVE-2026-98432. This is the report’s account, not a fresh verification of Canonical’s current patch status.
In a guest essay on Terence Tao’s blog, Karthik C. S., Amit Sahai and Jie Xue argue that mathematical work should be valued for the understanding it brings, not for outperforming other people or machines. They urge a less ego-centered response to AI’s role in research.
The project presents a three-dimensional model of central Warsaw assembled from OpenStreetMap, LiDAR and the city’s tree database, with a voxel resolution of one meter.
A Slate essay examines how abrupt layoffs and deteriorating trust shape decisions to quit without notice. Drawing on personal experience and workplace interviews, it questions whether the customary two-week departure still makes sense.
In a Microsoft blog recollection, the author describes slipping into an early rehearsal and learning that Patrick Stewart would host the Windows 2000 launch. A headset-wearing crew member stood in for the actor during the run-through.
DiscImageStudio: burn visible artwork onto CDs, DVDs and Blu-ray discs
项目采用
GNU GPL v3.0 or later
(
GPL-3.0-or-later
)。CD 交织实现包含从 CDImage 移植并修改的代码,整体分发沿用兼容的 GPL 授权;分发二进制或修改版时须遵守对应源代码等要求。第三方字体与组件遵循各自许可证,详见
授权说明
和
第三方声明
;应用"关于"页也可离线查看完整文本。
致谢
感谢
arduinocelentano 的 CDImage 项目
,它展示了通过生成 CD 音轨在盘面形成可见图像的方法。本项目的 CD 交织实现由其相关代码移植并继续修改,CD 盘面绘图思路也受其启发。CDImage 原作者及贡献者的工作为本项目提供了重要基础。
Star History
John Goerzen: Must we always use LLMs this way?
PlanetDebian
changelog.complete.org
2026-11-02 20:04:04
As with my last post on AI, let me open with a statement:
Just because most people hold AI a certain way, doesn’t mean that we always must, either now or in the future.
As I noted in that piece, and my shades of gray post, I am well aware — and agree with — the notion that a lot of frontier AI model...
Just because most people hold AI a certain way, doesn’t mean that we always must, either now or in the future.
As I noted in that piece, and my
shades of gray post
, I am well aware —
and agree with
— the notion that a lot of frontier AI models have disturbing ethical concerns that we shouldn’t dismiss, including concentration of power and wealth, environmental concerns, unethical scraping and training, the financial bubble they seem to be creating, and more. The most poisonous of AI cheerleaders are accelerating enshittification while cutting quality all over the place. AI slop is also a real problem, which I’ll discuss in a bit.
Before I dive in, I need to mention that no AI assistance was used for writing this post, and I have been using em dashes — correctly — for years before LLMs did. Secondly, while popular discourse seems to use “AI” and “LLM” interchangeably, the AI field is much more broad and much more old than LLMs. I will, nonetheless, adopt the common “AI” jargon here, but be more specific when necessary to differentiate.
The present and future of LLMs outside of the cloud-hosted frontier models
What differentiates productive use of AI from slop
The two are related, in fact. Doctorow discussed how he never uses AI to write anything, but he sometimes uses it as an assistant to help him write. Is that contradictory? Not really. He gave this example: he remembered a quote from a podcast, which he wanted to cite and attribute correctly. But he couldn’t remember which podcast or who said it. So he fired up
Whisper
, an open-weight model you can download and run locally, even on meagre hardware. Whisper is a speech-to-text model. Doctorow ran likely podcast episodes (from the target range and set of podcasts he listens to) through the model, and at that point it was a regular search. He found the quote, then went back and listened to the episode at that time spot to verify its accuracy.
It would have taken so much time to do this without Whisper that he simply would not have done it otherwise. His writing was better because of AI. Not because AI wrote any words for him, but because it helped him find the right ideas and attributions. He didn’t even have to trust its transcription; it pointed him at the right place, and then he could transcribe with precision.
I too have used Whisper in much the same way. A little while back, I digitized many hours of old family audio recordings going back to the 1970s. Thanks to Whisper, which I ran locally primarily during hours of being fully solar-powered, I have a searchable index to these gems. A person I know recently asked me if I knew any way to transcribe some old family recordings he had. I told him I could run it through Whisper. It wouldn’t have great punctuation, but most of the words would be there. This meant a lot to him and his family; what I did in 2 minutes would have taken him many days (I presume he is not a fast typist as well.)
So we can start by naming:
AI isn’t just chatbots, and AI can help even if it isn’t writing anything.
Doctorow goes on to ask the question: what happens after the AI bubble bursts? I do believe it will, as
Ed Zitron
has carefully documented for us for a long time now. The environmental damage done by frontier training and inference in the last few years will, of course, be done. But as he points out, we’ll be left with a plethora of surprisingly-capable open weight models, a community that has made significant strides running them on low-end devices (even phones), and a massive buildup of clean energy that hopefully will be finally able to offset some polluting energy once these heavy users drop off the grid.
So then what? Will the world just throw away the likes of Whisper and Gemma? Obviously not. Doctorow imagines, credibly, a situation in which individuals and universities tinker with locally-run models, iterating on them and improving them with the more traditional scale of resources available to individuals and universities. In other words,
this future sounds a lot like the earlier days of Open Source.
As Ed Zitron has pointed out, the real costs of frontier AI have been hidden as these companies rack up fantastical losses. When the bubble bursts, the real costs of frontier AI are likely to be high enough that CEO’s won’t be able to ignore the poor ROI. But we’ll be left with these artifacts, these open-weight starting points, that people can use.
That brings me to my central thesis: a lot of anti-AI sentiment is focused on the real downsides of the hyped uses of AI, and fails to account for the more ethical advances being made now, and likely to come in the future.
Varying quality of AI use
We are all familiar with AI slop. I’ve seen it, and have an increasingly skeptical eye when I see “new” projects announced in even places as niche as a BBS community (where I see things like new terminal emulators announced, written in shockingly-poor nodejs, and such). I’ve seen documents that take many pages to say what amounts to nothing intelligble to a human, with perfect grammar. I’ve seen pull requests that have a description that amounts to several pages of slop. I’ve personally seen an AI agent do things like correctly detect passing an untrusted argument to a shell, then propose a broken quoting algorithm to fix it (rather than proper sanitization and exec() or, better yet, avoiding the call altogether.)
I’ve also seen AI tools very quickly and accurately identify bugs that had passed human review, even professional security reviews, for years. I’ve seen them bring more joy to some people’s jobs by handling the more drudgery parts of the jobs. One of my favorite podcasts, Oxide and Friends, had an episode called
Engineering Rigor in the LLM age
and credibly described ways in which careful use of LLMs can
increase
quality and safety. Yes, I said increase. (Oxide and Friends are not hype cheerleaders by any means; these are very serious people with solid technical chops, and I know some of them.)
What accounts for this disconnect?
We can point to many factors, but Doctorow asks a fundamental question: who is in charge? Is it the person or the computer? Does the AI service people, or do people service the AI?
In some of the most ridiculously AI-first companies, it is very clearly the latter. Mandates from CEOs to increase AI usage lead to perverse outcomes that sacrifice quality. The AI is in charge. I’ve never seen an AI be any good at design questions, and it’s no wonder than all these vibe-coded apps have the same generic feeling of crappiness.
But when the AI is used pragmatically as a junior research assistant, that’s a different approach. Its output is greeted skeptically, its actions distrusted, and it’s never asked to design something. These are the cases where I’ve seen it make a meaningful difference.
It’s not black-and-white
All this adds up to why I was opposed to the Debian proposals that would have banned LLM use. Those votes are hard to change. They would have left Debian in a vulnerable position of being unable to react to accurate security findings if they originated with an LLM, or left Debian unable to adopt ethical use of LLMs (such as the solar-powered local Whisper I described above).
It would be akin to saying “you should never buy a PC because Windows 11 is terrible.” I agree Windows 11 is terrible, but saying something like that is so dismissive of all those that have invested decades of their time in building something better.
So, I find AI hype to be uncredible and dangerous. I also find knee-jerk reactions to AI to be the same. They are actually a form of capitulation:
they let the AI megacorps dictate the terms of the conversation to revolve around them
.
Case study: Debian’s DFSG scanner
For a long time, my two biggest annoyances with Debian have been the difficulty of packaging Rust and Go packages with their long dependency trees, and how long it takes a new package to get reviewed. About a year ago, the latter process was set on a path to reform, and it has gotten dramatically better. It also cuts off a potential connection with someone that hasn’t yet heard of Linux. Some people may not jump from Windows 11 (or the ChatGPTs of the world) immediately, but pretending that it’s ChatGPT or nothing does a disservice to all those that are trying to do research etchically.
We should state at the outset that Debian takes compliance with the
Debian Free Software Guidelines
(DFSG) extremely seriously. Every new package gets a review, and these reviews often catch things that upstream repos and other distros don’t. One common example would be a package that has a stated copyright and license, but then includes files that bear a different copyright and license.
You can imagine reviewing packages at this level of detail isn’t a fun task for people, and it’s hard to find volunteers to do it. Perhaps the answer to this should be “Debian should stop caring so much more than everyone else”, and perhaps you’re right (and perhaps you aren’t).
In any case, the DFSG team that reviews this added what amounts to an LLM-backed license linter. Its job is to produce an initial assessment that the license statements documented in debian/copyright are correct, thorough, and in compliance with DFSG. This report was not taken to be authoritative, but was designed to help with some initial assessments.
There were some predictable reactions. People were angry that the DFSG team had added this tool without any communication about it (justifiably so, I’d say). Many were angry just because of LLM. People made assumptions about what kind of model it used, what kind of quality it would produce, how definitive it would be in the project.
It is worth noting here that Debian is uniquely decentralized. There is a central policy, but maintainers are free to maintain their packages how they like. They don’t have to use a standard location for a Git repo, or even use Git.
One person said essentially, “it’s fine for others to use whatever tool they want, but I shouldn’t have to be exposed to LLM slop.” The other perspective boiled down to, “why should they keep the reports secret? If you want to proactively fix things, or flag false positives, why not?”
As Andreas Tille wrote, “I have read the LLM reviews carefully, and in many cases their findings inspired additional commits to improve my packaging. In some cases, they even helped me catch mistakes that led me to reject an upload myself before human inspection.”
Joey Hess
raises an interesting risk
: that LLMs will remove the incentive for Debian to actually fix its cumbersome processes, by letting an LLM paper them over. I have seen this tendency in other contexts, both at work and at home, as well. It’s a real risk, especially if Debian doesn’t tackle the packaging problem for Rust and Go.
The Mastodon post that prompted me to write this began a chain of events that started with “Uploaders will be forced to address LLMs issues without human inspection.” I don’t believe that will be the case; it goes too far against the Debian ethos.
I encourage everyone to take a deep breath. We are all getting used to a shifting landscape. We will all make missteps, myself included. The issues are complicated, the picture isn’t black and white, and there is incredible hype around the ecosystem that can make finding nuance difficult.
Let’s be kind to each other, fellow humans.
But, I do not care if you are kind to Claude.
Election Day Discipline, and What Comes After
Portside
portside.org
2026-11-02 20:01:46
Election Day Discipline, and What Comes After
barry
Mon, 11/02/2026 - 20:01
...
It is not an exaggeration to say that the future of this country hangs in the balance with this week’s midterm election. Whatever the outcome, we are about to enter a new phase in the fight against rising fascism, and we need to prepare ourselves for the road ahead.
The Importance of Discipline
What is most important is that we hold on to our democratic discipline at this moment. It is exciting to see that discipline in voters patiently waiting in long lines to early vote in Ohio this weekend. I see that discipline in Black leaders like Sen. Angela Alsobrooks and Rep. Jim Clyburn standing in support of Abdul Al-Sayed after Haley Steven’s stunt at a Black church in Detroit on Sunday. Or to see Mr. Al-Sayed refuse to take the bait offered by Stevens’ betrayal, and to instead see him remain on message. I see it in the democracy legal organizations who have been successfully blocking Trump shenanigans in Alaska and California. I see it in the relentless determination of Angie Nixon in her historic run to serve as the Senator from Florida, and of Scott Colom, who refuses to allow Democrats to write-off Mississippi.
I see it in people online who keep learning and speaking, who keep showing up at meetings and town halls. I see it in those who relentlessly search for immigrants who are detained and disappeared in facilities here and abroad. Every video of violent ICE attacks on neighborhoods, and every posting of police misconduct is an expression of the vigilance and discipline we need for the fight ahead. I salute those who bear witness and share it with the world.
I emphasize discipline because Election Day is only the beginning. First, as many have pointed out, there are likely to be Election Day and post-election shenanigans involving securing and counting of ballots, challenges to votes cast, manufactured emergencies, and lots of litigation. That means we must remain clear-eyed and steady. This is not an election in which we should expect that we will know everything on election night.
Second, we must prepare for the reality that whatever the outcome, Trump and the Republicans have no intention of ceding or sharing power. Their conduct over the past year – their usurpation of power, the rampant insider trading, the shady deals, the disappeared people, the scope of war casualties and losses, the mismanagement of agencies, the mislaid treasury and assets of the government, the looting of public spaces, the corruption, the incompetence, and the depravity - has been at such a level, I believe, that those involved will do almost anything to keep the true scope of it from coming to light.
The Lame Duck
This means that the lame duck period for Congress, state houses and other state races will be particularly dangerous. Republican legislators will try to move forward new laws and practices to hamstring ascendant Democratic power. We need only to remember what happened after the election in 2020 to know how dangerous it can be to assume that the election is the end of the story. We have already seen the detailed scenarios laid out by experts like Judge Michael Luttig who has
warned
in chilling detail keep our eyes on the Clerk of the House, who if replaced may play a role in frustrating the seating of a new Congress on January 3rd.
Speaker Mike Johnson (R-La) would play a central role in any such effort. We need full-time vigilance on the goings-on in the House to ward off any such efforts, or even to block Johnson efforts to pass harmful legislation in the lame duck, or to bury disastrous provisions in otherwise routine resolutions.
And we cannot forget the Senate, where the effort to confirm judges and other officials will shift into high gear in the remaining days of the year. Democrats won’t have the numbers to stop it, so pressure will need to be applied to the few Republicans who may be looking for a way to salvage their reputations before stepping down, or before becoming part of the Party in the minority. Thom Tillis (R-NC) and Bill Cassidy (R-La) will have a chance to actually make up for their disastrous confirmation votes of Pete Hegseth and Robert Kennedy, Jr. We may yet need to apply pressure to them and others who may be inclined to peel off from Trump.
Agency heads (like Pete Hegseth) will be looking for soft landings rather than face the specter of impeachment. Rumors already have been
circulating
that he is seeking to be appointed to the Senate seat occupied now by Marcia Blackburn if she is successful in her bid to become Governor of Tennessee. This would obviously be a disaster. That means that Tennesseans will need to be mobilize and pressure Blackburn to resist that appointment.
There will be countless issues like this that will need our attention. We will not have the luxury of letting down our guard after the election, even if the Democrats win the House and the Senate.
And we will need vigilance at the state level as well. Remember the successful lame duck actions of Republican legislatures in Wisconsin and North Carolina several years ago, that reduced the powers of incoming Democratic governors. Prepare for more of the same and prepare to push back against those efforts. It begins with not taking your eyes off of your state legislators.
We can take comfort in the fact that the array of democracy lawyers will be doing everything they can to thwart Trump Administration and state level attempts to engage in any illegal efforts to hold on to power. We have Defend Democracy, the Elias Group, the NAACP Legal Defense Fund, the ACLU, CREW, and many other legal organizations that we can count on to block any untoward actions in the courts.
But there will be important work for everyone to do that cannot be addressed with litigation. Pressure will be key.
Accountability and Blocking Abuses of Power
I believe we must treat this election as the beginning of our embrace of a new and more vigorous practice of citizenship. We can no longer afford to vote and walk away. We are required to maintain vigilance, to apply pressure, to stay “on call,” to support, monitor and stand at the ready should our presence, voices, our bodies, our dollars, our phone calls, and engagement become noecessary.
If the Democrats are successful in winning one or both houses of Congress, we should expect them to promptly begin the work of investigating, unmasking, impeaching, removing, revealing, and holding accountable those who have engaged in the excesses that we can only begin to imagine today.
Trump has
threatened to veto
any legislation passed by a Democratic-controlled Congress. Of course. The real power for the Democrats will lie in investigating and exposing the truth of what has been happening, holding accountable those engaged in misconduct, and taking back the power of the purse which rightfully sits with Congress.
And Democrats must begin to lay the foundation for structural transformation that can better support a re-imagined and resilient democracy. Hearings on Supreme Court reform should be scheduled in 2027 to begin to educate the public and to explore with experts the variety of measures that have been proposed.
Obviously if the Democrats do not prevail in either the House or the Senate, we are in a for a very, very challenging period. We will still need to resist and push back against deepening fascism. Those of us in states with democratic leadership will need to undergird our local leaders with support and with the force of “people power.” We will need to continue to protect the most vulnerable from unlawful ICE activities, and from the weaponization of law enforcement writ large. We still need to support those who have lost jobs, and who face losing their homes because of the disastrous policies of this Administration.
I know that all of this sounds exhausting. But that is only because we have been doing it wrong for so long. Many of us have spent years voting in every election and then waiting for things to get better. We have used voting as the culmination of our engagement, rather than as the beginning.
The Trump Presidency Continues Until 2028
As consequential as this election will be, we must remember that Trump will still be the President for another two years. That means that the road ahead will be tough, no matter what. It is critical that we right-size our expectations. Trump has control of federal agencies, the military, and foreign policy, and we still have a Supreme Court inclined to allow Trump to use that power recklessly. Sen. Chris Murphy (D-CT), recently hospitalized after a stroke, left a confidential briefing on Trump’s war plans in Iran nearly incoherent with outrage at what he learned. Prevented from sharing the details of the plan,
Murphy warned
that it is “insane,” and will represent “a likely destruction of our commitment to the rule of law.”
With control of Congress the Democrats can slow down some of Trump’s anti-democratic actions, and throw sand in the gears of others, but he will still have a great deal of leeway to do harm. We will need to stay steady and to continue to apply pressure in the march towards 2028.
The Discipline of Joy
Finally, this may sound counterintuitive, but I want to close by reminding us about the discipline of joy which, in spite of it all, I see all around us. I saw it in the creative costumes for Halloween on both children and adults, at those cheering runners at the New York City Marathon, at HBCU step-shows and marching band competitions. I see it in the delight so many are experiencing in one of the most beautiful and colorful fall seasons. I see it in those who still host parties, who share great books they are reading, who post gleefully after binging the Gilded Age, A Different World, or Slow Horses. There are so many extraordinary art exhibits showing around the country that I can scarcely keep up (the
Baltimore Museum of Art
has a bumper crop). I see joy - or at least gallows humor - in those who will not turn their backs on their NFL teams even when they fail (I’m with you, Ravens Flock), and those who showed up for the WNBA even when their finals game was shamefully scheduled in the middle of the day.
Babies are still being born. People are still falling in love. Children are still laughing. And when we suffer tragedy, people are still comforting, loving, and grieving with one another.
Staying humane in the face of inhumanity and keeping our capacity for joy intact also requires discipline. Don’t let it go.
Sherrilyn Ifill is a civil rights atty/democracy warrior; Vernon Jordan, Jr. Distinguished Professor of Civil Rights, Howard Law School; former President & Dir-Counsel, NAACP Legal Defense Fund.
https://substack.com/@sherrilyn
@
sifillwork@icloud.com
Unions Gain Access to Thousands of Google Workers After UK Employment Rights Overhaul
Portside
portside.org
2026-11-02 19:48:54
Unions Gain Access to Thousands of Google Workers After UK Employment Rights Overhaul
Stephanie
Mon, 11/02/2026 - 19:48
...
Trade unions are expected to make further inroads into big tech companies in the UK after new rights for unions to access workplaces
came into force
, with Google UK signing an agreement on Monday.
The Prospect union has reached an agreement with Google to begin organising among about 7,000 workers across its UK operations, including YouTube but excluding
DeepMind
.
Google DeepMind is expected to strike a separate agreement, with the Communication Workers Union and the Unite union seeking recognition there. The deal follows a similar agreement between Prospect and Meta, which owns Facebook, WhatsApp and Instagram and employs about 5,000 people in the UK.
The union, which represents more than 160,000 UK workers across several sectors, will now be able to run sessions inside Google’s workplaces, including the flagship headquarters in King’s Cross, London.
Prospect’s general secretary, Mike Clancy, said: “Prospect has been organising tech workers for many years, and this access agreement is a powerful signal of intent that we can successfully negotiate agreements with even the biggest global tech companies.
“Tech workers deserve a stronger voice at work, whether that is over bread-and-butter trade union issues like pay and flexibility, AI deployment or workplace culture. I am pleased that Google has struck this agreement with us, and hope it sends a clear signal to other tech companies that having a relationship with trade unions is the new normal in the sector.”
He said workers would have a stronger voice as more employees at Google and
Meta
joined trade unions. “With our track record of delivering wins for members, I am looking forward to seeing what we can achieve together.”
Google said it had signed the access agreement to comply with the new UK workplace legislation, although it maintained that it already had good internal employee relations.
“This step builds on our established work with internal employee representative groups, allowing us to fulfil these new requirements while preserving the respectful, direct dialogue our culture is built on,” a spokesperson said.
Paul Nowak, the TUC general secretary, said last week that he expected a wave of union recognition deals in the private sector over the next year as the “transformative” rules on accessing workplaces came into force.
The Employment Rights Act gives unions the right to enter workplaces to meet workers or communicate with them electronically. From January, employers will be required to inform workers of their right to join a union.
Previously, unions seeking recognition have sometimes had to organise workers from outside their workplaces – as was the case with the GMB’s thwarted effort to gain recognition at Amazon’s warehouse near Coventry two years ago.
This Week in People’s History, Nov 4–10, 2026
Portside
portside.org
2026-11-02 19:22:55
This Week in People’s History, Nov 4–10, 2026
Jonathan Bennett
Mon, 11/02/2026 - 19:22
...
In 1841, When More than 100 Victims of Enslavement Freed Themselves, They Earned Much More Honor Than They Have Received
ONE HUNDRED AND EIGHTY FIVE YEARS AGO, ON NOVEMBER 7, 1841,
the merchant ship
Creole
was off the east coast of Florida, carrying a cargo of at least 135 enslaved people from Virginia to the slave market in New Orleans, where they were to be sold to Louisiana plantation owners.
On that November night the ship’s enslaved cargo took matters into their own hands by overpowering
The Creole’s
crew and turning the ship toward Nassau in the Bahamas, where slavery had been abolished in 1834.
Madison Washington was the leader of the rebellion. Washington had the unusual distinction of having previously liberated himself from his Virginia enslaver and escaped to Canada. After he arrived in Canada, he decided to secretly return to Virginia so he could help his wife escape. Back in Virginia, but before he was able to liberate his wife, Washington was arrested and sold to a slave-trader who had arranged to ship him to New Orleans.
When Madison Washington was put aboard
The Creole,
his experience as someone who had once successfully escaped slavery made him a natural leader of
The Creole’s
human cargo. He and eighteen other men devised a plan to give the ship time to reach the waters off southeast Florida, wait until most of the crew was asleep, start a ruckus to draw a small group of waking, and very lightly armed, crew members to one part of the ship, and then overpower the divided crew before it could get organized. When the brief struggle was over, only one of the enslaved and one member of the crew had been killed, and the rebels were in full command.
They needed only two days to reach Nassau. When they arrived, they ceased to be anyone’s property.
Most of the formerly enslaved were allowed to go ashore and wherever they wished. The vast majority of the Bahamas population had been enslaved until 1834, so the refugees from
The Creole
were welcomed into an understanding and English-speaking community.
But Madison Washington and eighteen other rebellious former slaves were imprisoned because they were implicated in the death of a member of
The Creole’s
crew, the wounding of another, and the possibility they had committed mutiny.
They remained prisoners for five months while an admiralty court conducted an investigation to determine whether a crime had been committed and, if so, who might be charged. Eventually the chief judge determined that under the circumstances, no crime had occurred, and told the prisoners, “It has pleased God to set you free from the bonds of slavery; may you hereafter lead the lives of good and faithful subjects of Her Majesty’s Government.”
Sadly, at that point Madison Washington and his comrades disappear from the historical record. Did they remain in Nassau, or take ship to a larger settlement in the British West Indies, such as Jamaica? They would have been unlikely to return to the U.S., because doing so would expose them to the risk of arrest as fugitive slaves. Wherever they went, and whatever they did, there is unfortunately no known record concerning any of them.
Even in the absence of that information, there is no doubt that Madison Washington and those of his comrades whose names are known – Horace Beverly, Walter Brown, George Burden, Richard Butler, Pompey Garrison, William Jenkins, Ben Johnstone (or Johnson), Philip Jones, Robert Lumpkins, Elijah Morris, George Portlock, “Doctor” Ruffin, Peter Smallwood, Warner Smith, Addison Tyler and America (or American) Wordhouse – emancipated themselves when they played major roles in the largest successful rebellion of enslaved people in the U.S.
As such, it is regrettable that the names Madison Washington and the other heroes of the rebellion aboard
The Creole
are not more widely remembered.
Henry Highland Garnet, an abolitionist, educator and orator who, along with his family, emancipated himself in 1824, saluted Madison Washington in an August 1843 policy proposal to the National Convention of Colored Citizens in Buffalo, New York, which you can read
here.
The convention rejected Garnet’s proposal by a single vote.
The illustration shows conditions similar to those experienced by the enslaved aboard
The Creole,
where they were confined to a merchant ship’s cargo hold.
Apple Announces Record $114.5B Fourth-Quarter Results
Daring Fireball
sixcolors.com
2026-11-02 19:10:53
Jason Snell, Six Colors:
On Monday, Apple announced record fourth-quarter earnings,
with total revenue of $114.5B, up 12 percent from the year-ago
quarter. iPhone revenue was up 17.5%, Mac revenue was up 23.7%,
and Services revenue was up 9.8%. Wearables revenue was down 7.9%
and iPad revenue wa...
On Monday, Apple announced
record fourth-quarter earnings
, with total revenue of $114.5B, up 12 percent from the year-ago quarter. iPhone revenue was up 17.5%, Mac revenue was up 23.7%, and Services revenue was up 9.8%. Wearables revenue was down 7.9% and iPad revenue was down 10.4%.
Beginning at 2pm Pacific, Apple execs will spend an hour on the phone with financial industry analysts. We’ll have our usual transcript. It’ll be the first earnings call for John Ternus as CEO.
And now, to help you visualize what Apple just announced, here is our traditional barrage of charts and graphs:
Revenue and profit
iPhone
Mac
iPad
Services
Wearables, Home and Accessories
Regional
If you appreciate articles like this one, support us by
becoming a Six Colors subscriber
. Subscribers get access to an exclusive podcast, members-only stories, and a special community.
Ask HN: Does anyone have a contact with Cleveland-area Ham club?
I'm in the area and a ham, though not part of the club. I suggest you also get in touch with the Case club, W8EDU. Feel free to shoot me an email as well and I might be able to help me some contacts (pun intended). Email in profile for the next few hours.
Wall Street mostly swept up last week's tech wreckage Monday. Chip stocks kept tracking mud back through the house.
About 7 in 10 S&P 500 stocks rose Monday, yet nearly every chip stock fell, and the group shed more than $400 billion in market value in a single session, by Yahoo Finance calculations.
The chipmaker slid about 9% after
its worst day since 1974
on Oct. 30, when a disappointing forecast knocked nearly 29% off the stock. Monday's close left Intel worth less than half of what it was when September ended.
And the damage didn't stick to Intel.
Micron (
MU
), Sandisk (
SNDK
), Seagate (
STX
), and Western Digital (
WDC
) — the memory and storage names that led the chip boom this year — all got clobbered, falling roughly 6% to 8%. Marvell (
MRVL
) fell even harder, a drop that came as it
agreed to buy Lumentum
(
LITE
) in a $115 billion deal. Nvidia (
NVDA
) held up better than most, but it's still down about 16% since Oct. 6.
Intel, Marvell, AMD and the memory names led the chip rout, while Nvidia barely moved.
·
Yahoo Finance AlphaSpace
Zoom out and the mess gets bigger. Chip and memory stocks have lost about $3.7 trillion in market value since Oct. 6, by Yahoo Finance calculations. Nvidia lost the most in dollars, but Intel's drop of nearly half is the steepest among the giants.
Yahoo Finance
Not everything tied to AI bled. SpaceX (
SPCX
) rose, though it's still well below where it started October. Software was mixed, apart from cybersecurity stocks like Fortinet (
FTNT
) and CrowdStrike (
CRWD
), which fell with chips.
Adam Johnson, founder of the Bullseye Brief and portfolio manager of the American Ingenuity Fund, thinks last week's sell-off already priced in the worst.
"The market kitchen-sinked it," Johnson told Yahoo Finance on Monday. "They discounted everything that could go wrong. And when you do that, typically that's when you see a bottom."
John Chambers, founder and CEO of JC2 Ventures and Cisco's former CEO, expects the gap between winners and losers to keep widening.
"There will be major train wrecks," Chambers told Yahoo Finance, also on Monday. "And rising tide does not raise all boats. I would not bet against Nvidia."
Stock Trader's Almanac editor Jeff Hirsch, who coined the term "
Octoberphobia
," bought the sell-off on Oct. 30. History is on his side. Chips have climbed in all eight midterm cycles since 1994, measured from the last October close through the following June, by Yahoo Finance calculations. But in 2002 and 2018, they first fell about another 11%.
AI-powered malware ‘highly likely’ to be used to hack UK infrastructure by 2028
Guardian
www.theguardian.com
2026-11-02 19:01:32
National Cyber Security Centre expects attacks on critical facilities such as power stations, airports and hospitals AI-powered malicious software is “highly likely” to be used in hacking attacks against the UK’s power stations, airports and hospitals by 2028, according to the state cybersecurity bo...
AI-powered malicious software is “highly likely” to be used in hacking attacks against the UK’s power stations, airports and hospitals by 2028, according to the state cybersecurity body.
The National Cyber Security Centre (NCSC) said AI will probably enable a ransomware attack against critical national infrastructure [CNI] between now and 2028. The UK’s definition of CNI covers a range of facilities and services across sectors including energy, transport, defence, food, health and finance.
The warning from the NCSC, part of the GCHQ spy agency, was published in the organisation’s annual review, which also warned that Russia and China will start using AI “routinely” in cyber-attacks.
“It is … highly likely that between now and 2028, AI-powered malware will have been used in a ransomware attack on UK CNI,” said NCSC.
Ransomware has become a cornerstone of the criminal hacker’s repertoire and is a signature ploy of gangs that typically operate out of former Soviet Union states.
After gaining access to a victim’s IT systems, the attackers then encrypt files with bespoke malicious software – or malware – and then demand a payment in cryptocurrency to unlock the crippled systems and return any stolen data. UK
ransomware victims
include
Royal Mail
, outsourcing firm Capita and
various public bodies, including councils
.
AI is set to enhance the ransomware threat by helping attackers with tasks such as scouting targets, locating weaknesses in IT networks and writing malicious code, said the NCSC.
Last month, the
government urged Britons
to stock up to nine litres of bottled water and three days’ worth of food in order to ensure that households can survive a weather, cyber or other serious emergency. Wes Streeting, the defence secretary, said as the
Be Ready campaign
was launched that Britain needed to prepare for the threat of “state-sponsored terrorism” by Russia or other hostile powers targeting everyday infrastructure.
NCSC’s chief executive, Richard Horne, will warn the public in a speech accompanying the review on Tuesday that AI is going to unleash a wave of cyber-attacks imminently.
“In the coming months, we face a real
prospect of an unprecedented rise in the number of cyber incidents,” he will say.
Horne will attribute the threat to the technology’s ability to uncover weaknesses in IT systems that have been “tolerated for far too long”.
An example of AI’s capacity to root out previously undetected vulnerabilities came last month, when the technology helped discover a
critical weakness in PHP
, a computer language used by almost
70% of the world’s websites
.
Alan Woodward, a professor of cybersecurity at Surrey University, said NCSC’s warning underlined the need for nation states and companies to access cutting-edge AI technology.
“AI can help people find these flaws and patch them, but if we don’t get the access the bad guys will beat them to it,” he said. So far, leading AI companies like OpenAI and Anthropic have given some companies advanced access to their most powerful models in order to help them identify serious IT glitches.
Horne will also say in his speech that communications networks used by the British military are subjected to daily attacks that are “persistent” and “sustained”.
Horne will say Russia was one of the perpetrators, but the attacks have deliberately not crossed the line into warfare, with Moscow carrying out “notable campaigns” that “intentionally fall below the threshold of armed conflict as they escalate their attempts at hybrid warfare”.
Horne will add that
recent cyber-attacks on supermarket fridges in Europe
, which have seen fridge temperatures raised by hackers to more than 50C, are a warning to companies and organisations to invest strongly in cyber resilience.
“For decades we have collectively got away with tech on the cheap,” he will say.
Demand Democracy Defense w/ May Day Strong
OrganizingUp
convergencemag.com
2026-11-02 19:00:00
Over the past few months Convergence has been discussing the many different ways people are organizing around the country to ensure the integrity of the midterm elections. We’ve also covered the myriad ways the Trump administration has signaled their intent to disrupt election results, refute them, ...
Release: llm 0.37
There's a lot of stuff in this new release of my LLM CLI tool and Python library, representing around two months of accumulated features and fixes.
I added gpt-6.1-sol and gpt-6.1-terra, plus a new llm openai endpoint add command to make it easier to configure additional mo...
There's a
lot
of stuff in this new release of my LLM CLI tool and Python library, representing around two months of accumulated features and fixes.
I added
gpt-6.1-sol
and
gpt-6.1-terra
, plus a new
llm openai endpoint add
command to make it easier to configure additional models that use OpenAI-compatible endpoints.
I switched the default model (if you have not set your own default) to
gpt-6-luna
- half the price of the previous default,
gpt-5.6-luna
.
LLM's support for embeddings now accepts that different binary content may have different content-type - necessary for models like
Gemini Embedding 2
, which can embed text, audio, images, and video.
A lot of open source maintainers complain about a flood of AI-assisted PRs. LLM is my project that has been most affected by this and, to be honest, I'm not finding it to be a problem. That's mainly because I have Opus 5.5 or GPT-6 Astra help me with triage to spot the most useful fixes!
This release includes fixes from 12 authors - almost all AI-assisted - and the burden of reviewing them wasn't nearly as great as I expected. I really see them as bug reports with attached examples - sometimes I land them, sometimes I implement my own fix.
GUI64
is a graphical user interface (
GUI
) for the
C64
, first released in version 1.0 in November 2024. Although GUI64 may appear to be a standalone
operating system
, it is just a graphical layer running on top of the C64’s built-in
ROM
-based operating system, the
Kernal
. GUI64 presents
files
and directories in freely movable windows, allowing for easy file management on floppy disks as well as on disk images stored on
SD2IEC
devices. When GUI64 is running on an
Ultimate
device, all settings are saved, and disk images can be mounted directly from within the GUI. The current version of GUI64 is 2.0.The current version of GUI64 is 2.1.
GUI64 can be operated using a
mouse
(such as the
1351
or compatible models) connected to
Control Port
#1, or with a
joystick
in Control Port #2 (right click with CBM key + fire). To enable support for the mouse wheel—e.g., for
scrolling
or in up/down controls (see below)—the
Micromys
adapter must be used. This functionality is also available when using the
VICE
emulator.
Starting with version 1.9, GUI64 is available in two variants:
Windows-like interface
In this variant, GUI64 visually resembles
Windows
-style interfaces. The GUI is window-based, with a taskbar at the bottom of the screen, featuring a "
Commodore
(CBM) button" embedded on the left and a recessed clock button on the right. In between are the task buttons — similar to those in Windows 95.
Mac-like interface
This variant visually imitates the interface of the first Macintosh computers from Apple. The menus are not integrated into the windows but are displayed in a menu bar at the top edge of the screen. The system menu in the upper-left corner includes, in addition to the entries from the corresponding CBM menu in the Windows variant, an “About” entry, which in the Windows variant is part of the file browser’s menu.
In both versions, the desktop itself is empty except for two drive icons in the upper-left corner (in the Mac design: upper-right corner), and—unlike other interfaces such as C64OS
[
1
]
or
GEOS
—does not support placing file icons directly on it. Instead, the desktop serves as a background for windows, which can be freely moved and positioned. Unlike GEOS, for example, GUI64 does not use the VIC-II’s bitmap graphics mode, but operates in text mode. GUI64 is therefore character set–based. For instance, windows cannot be moved pixel-perfectly, but are instead aligned to the 8×8-pixel grid of the character screen. The desktop consists of 22 rows (in the Mac design: 24 rows) and 40 columns of characters. Strictly speaking, GUI64 should therefore be considered not a GUI, but a TUI (Text User Interface).
By default, the two drive icons are assigned to device numbers 8 and 9, but this can be changed via right-click on the icons or, alternatively, in the menu of the associated browser window. A double-click on a drive icon opens a file browser window, see below.
If an Ultimate cartridge is connected to the C64, or if the computer itself is an Ultimate device, and if the Ultimate Command Interface is enabled, a third desktop icon in the shape of a USB flash drive has been available since version 1.98: the
Ultimate icon
. Double-clicking this icon opens a browser window that provides access to the file system of a USB flash drive (or SD card) connected to the Ultimate device, allowing disk images to be mounted directly from within GUI64.
Clicking the Commodore button in the lower-left corner of the taskbar opens a menu with three entries: "Settings", "About", and "BASIC". Starting with version 1.98, Ultimate owners will also see an additional "Reboot" entry, which reboots the C64. Selecting "BASIC" (after confirming the prompt) launches the familiar C64
BASIC
editor. Clicking "Settings" opens a configuration window where the appearance of GUI64 can be customized. If GUI64 detects an Ultimate system with the Command Interface enabled, the settings are stored in the Ultimate's flash folder as of version 1.97. These settings include various color options as well as an option to display the desktop with a dotted background. Clicking "About" opens a dialog containing information about GUI64.
Since version 1.96, the clock automatically displays the Ultimate's time (provided an Ultimate cartridge is connected or the C64 is FPGA-based on an Ultimate 64 board
and
the Ultimate Command Interface is enabled). Since version 2.0, the clock also displays the correct time when a
WiC64
module is connected to the user port. Double-clicking the clock opens a dialog box for adjusting the time. If no Ultimate system or WiC64 is detected when GUI64 starts, the time is set to “00:00” by default.
Because the GUI64 screen has limited horizontal space, taskbar button titles are truncated to fit. Starting with GUI64 v1.8.1, users can see the full title in a tooltip by hovering over a button for at least one second. Tooltips are also displayed when hovering over desktop drive icons, showing the full path for drives such as SD2IEC or the Ultimate.
The primary graphical elements that convey information in GUI64 are
windows
. Each window has a title bar at the top, with the window title on the left (Mac design: centered). In the Windows design, there are various control buttons on the right. One of these buttons is always an X-icon (X) to close the window; if the window supports minimizing or maximizing, corresponding buttons for those actions are also present. In the Mac version, there is only a button for closing the window on the left-hand side of the title bar. Windows-version: A minimized window disappears from the desktop but remains accessible as a button in the taskbar. Clicking this button restores the window to the desktop. This helps keep the desktop organized and clutter-free.
A special type of window is the
dialog
. Dialogs cannot be minimized and always retain full focus. This means that user input is restricted to within the dialog window only.
The graphical elements within windows are called
controls
. Each of these controls serves a specific function—even if that function is simply displaying text, as is the case with labels (see below). The controls available in the current version of GUI64 are, in order:
Controls in GUI64 and Their Functions
Control
Purpose
Menu Bar
Allows display of menus and is always located directly below the window’s title bar in the Windows version and in the menu bar (top edge of screen) in the Mac version.
Button
A clickable button (with a visual 3D effect in the Windows version)
Listbox
A box containing selectable entries arranged in rows
FileListScrollBox
A box containing selectable entries in rows. Each row displays the file type (as an icon), the filename, and optionally the file size (in blocks).
Label
Single-line, non-editable text without a box
Multiline Label
Multi-line, non-editable text without a box (rows are separated with the "\" character)
Frame
A border frame used to group and separate controls
Colorpicker
A colored box. When clicked, it opens a menu with the 16 C64 colors. Once a color is selected, the box updates to reflect the chosen color.
Radiobutton Group
A list of options in rows without frame box for exclusive selection
CheckBox
A box with a text label for toggling an option on or off
UpDown
A control for displaying numerical values with integrated arrow buttons to increment or decrement the value (mouse wheel support)
Singleline Edit
A single-line input box for text entry
Progress Bar
A single-line box for displaying progress (e.g., during file copy operations)
ColorBox Label
A combination of a colored box (on the left) and a label (on the right)
GUI64 allows users to work with drives and files. The following drives are detected and supported:
Commodore 1541
floppy drive,
Commodore 1571
floppy drive,
Commodore 1581
floppy drive, and
SD2IEC
devices. GUI64 may also work with hard drives and other storage devices; however, due to a lack of testing, reliable functionality for these cannot be guaranteed at this time.
Double-clicking one of the drive icons on the desktop opens a file browser window, which—after loading—displays the contents of the medium (floppy disk, SD2IEC directory, or
disk image
within an SD2IEC directory). GUI64 can also handle dnp images. Files and directories are listed vertically within the window. Each entry shows the file type (as an icon), the file name, and, optionally, the file size (see the "View Menu" below). Entries can be selected by clicking on them. The list can be scrolled by either using the scrollbar on the right edge or the mouse wheel.
To run programs (equivalent to
LOAD
"...",x
and
RUN
), a simple double-click on the corresponding entry in the drive window is required. This will display a progress bar in a seperate window, showing the loading progress. Once the file is loaded into the C64's memory, the file will be executed. To load a machine code file (without a
BASIC
stub, such as
10
SYS
2063
), see "Boot" in the File menu. Note: GUI64 will not remain in the background after running a file and has to be loaded back into memory afterwards, e.g. by pressing the Reset button if GUI64 was loaded from cartridge.
When the file browser window displays the contents of a directory on an SD2IEC drive, directories and disk images (if available) will also be shown. Directories are represented by a folder-like icon. A double-click on a directory or disk image initiates a loading process, after which the contents of the selected directory or disk image will be displayed in the browser window.
Each file browser window in GUI64 has a menu consisting of the entries "Disk," "File," and "View." These menus provide the user with various options for manipulating drives, files, and directories.
The 'File' menu of GUI64 allows for copying or 'cutting' files, as well as deleting, renaming, viewing, booting files, and creating disk images.
The 'File' menu of GUI64
Entry
Function
New
Opens a dialog to create new disk images (d64, d71, d81) or folders on an SD2IEC drive.*
Cut
GUI64 remembers the selected file for 'cutting'
Copy
GUI64 remembers the selected file for copying
Paste
Pastes the copied or 'cut' file onto the floppy disk, disk image, or into the directory
Delete
Opens a dialog to confirm the deletion of the selected file
Rename
Opens a dialog to rename the selected file
View
Opens a window to view the contents of the selected file in text or hex mode
Boot
Loads the selected file to the memory address specified in the first two bytes of the file and instructs the processor to start the code from there (equivalent to
LOAD
"...",x,1:
SYS
xxxxx
)
*Note:
After creating a new image, the corresponding virtual disk needs to be formatted. For this, double click the image, click
Format
in the Disk menu and choose
Full Format
.
Currently, there are no
applications
for GUI64. However, after the release of version 2.0, an
interface
for developers is planned, which will allow for the easy creation of applications for GUI64.
GUI64 was developed by
Friedrich (Fritz) Philipp
, also known as
WebFritzi
. Especially during the implementation of the drive functions, he received valuable support from numerous members of
Forum64
, who assisted him with advice and guidance. Some code snippets originate from
Codebase64
.
It's not on their website or Trust center yet, but we received the following breach notification from WorkOS:
We are writing to notify you of a data security incident that we detected on October 30, 2026 and are continuing to investigate. We value your trust and want to keep you informed while our investigation continues.
What Happened
On October 30, 2026, at 16:39 UTC, WorkOS detected anomalous traffic to an internal business system. Our investigation identified evidence the attack was likely driven by ARTEX, an AI-assisted, autonomous penetration testing framework, from IP addresses based in Hong Kong and China.
The unauthorized actor gained access to an internal API used by our sales and marketing tools. Through this service, it was able to access data from our Salesforce and Snowflake instances. These systems hold business contact information, account and commercial information, aggregated and de-identified product usage metrics, marketing contacts, and support tickets. This includes CRM information such as names, email addresses, phone numbers, company mailing addresses, and other business information for WorkOS customers.
We have no evidence that your application data was accessed. We also have no evidence that any production WorkOS services were accessed or impacted. Our current analysis indicates this incident was localized to only CRM and customer support data.
...
How Much Is Our Freedom Worth? Ending Corporate Support for Fascism
OrganizingUp
convergencemag.com
2026-11-02 18:15:13
Featured image by Akin Olla Americans are guaranteed the right to have a say in who represents us in making decisions about our healthcare system, the quality of air we breathe, and how immigrants are treated. Yet the Trump regime has been laying the groundwork to interfere with our right to vote fo...
Apple posts stronger-than-expected revenue in first earnings report for new CEO John Ternus
Guardian
www.theguardian.com
2026-11-02 18:07:49
Result for the company, which earned $30.71bn and exceeded analysts’ expectations, bucked downward trend for tech firms Apple Inc posted stronger-than-expected revenue in the fiscal third quarter, giving John Ternus, the new CEO, an upbeat start to his tenure, which began in September. The solid res...
Apple has warned of an “unprecedented” rise in memory chip prices, as it battles with datacentres to lay its hands on supplies.
The iPhone maker’s shares fell in after-hours trading after it told investors that the higher prices will eat into its profit margins.
“What we’re seeing with memory pricing right now is unprecedented,” John Ternus, Apple’s new CEO, told a conference call on Monday, predicting that memory costs in the fourth quarter of this year would be even higher than in the previous three months.
Ternus said Apple’s decision to raise iPad and MacBook prices in June, followed by iPhone prices in September, had “provided some offset” for the company.
Ben Barringer, the head of technology research at Quilter Cheviot, said Apple’s results were “OK, if on the disappointing side”.
“Revenues were up 12%, driven primarily by iPhone sales and strong sales of Mac Mini, which users can use to apply agentic AI. China growth was robust which is pleasing to see, while iPad and wearables disappointed with services growing but lower than the group average at 10%,” he added.
“There appears to be a lot of interest in the iPhone Duo, but it is early days yet with the product not yet on full release, but it is hoped that can help drive the next leg of Apple’s product innovation.”
Apple’s shares were down 2.75% in after-hours trading on Wall Street.
Apple posted stronger-than-expected revenue in the fiscal third quarter, giving Ternus an upbeat start to his tenure, which began in September. The solid results bucked a downward trend for tech companies this quarter, as companies including Alphabet, Amazon and Intel had disappointing quarterly results.
Jacob Bourne, an Emarketer analyst, said record iPhone revenue and strong growth in China demonstrated the resilience of Apple’s business.
Apple earned $30.71bn (£22.89bn), or $2.10 a share, in the July-September period, up 12% from $27.47bn, or $1.85 a share, in the equivalent period a year earlier. Apple said its earnings included five cents a share from tariff refunds.
Revenue rose 12% to $114.5bn from $102.5bn.
Analysts, on average, were expecting earnings of $1.99 a share on revenue of $113.4bn, according to a poll by FactSet.
While its rivals are facing investor uncertainty over huge investments in artificial intelligence, Bourne said Apple’s “tepid approach” to AI infrastructure spending helped preserve its cashflow – while partnerships with companies such as Alphabet could help the iPhone maker strengthen its AI capabilities without taking on the same financial risks as its peers.
[Sponsor] OurCal
Daring Fireball
ourcal.com
2026-11-02 17:43:59
“I didn’t see you put that in the diary.”
Sound familiar?
Shared calendars solved scheduling, not communication.
OurCal connects any calendar, new or existing, to a group chat. Changes post there automatically, so nobody misses them. Because it’s a messenger, we made everything End-to-End Encrypt...
The shared calendar built around messaging. Group calendars for families, couples, friends, and colleagues. Always protected with
End-to-End Encryption
.
“The problem with sharing calendars isn’t productivity. It’s
communication
. So we built a shared calendar where every action is a message.”
Ryan Brodie
Founder, OurCal
More than a planner
A shared space where your group actually communicates.
Chat in every event
Talk about the plan
inside the plan
.
Every event has its own thread. Share photos, files, and notes without leaving the event. React, reply, and quote just like a messenger, but everything stays in context instead of scattered across WhatsApp, iMessage, and email.
Every change posts a before-and-after update automatically, and reminders reach everyone who needs them. No more “wait, did you move that?” buried in a group chat.
Every member gets a colour. See your kids’ activities, your partner’s shifts, and your own schedule in a single view, then pinch to zoom between overview and detail.
Google, Apple, and Outlook in one place, plus subscribed calendars like sports fixtures and school term dates. See personal and shared side by side:
no more double-booking
.
Smart event creation
Type “Dentist Tuesday 3pm for an hour” and it’s done. Reminders, todos, and repeating events too, all in natural language.
On-device AI
, nothing sent to the cloud.
Groups for your whole life
Home, work, school, social. Each group gets its own calendars, members, and chat.
One app, every group
.
Share shifts and rotas
Nurses, paramedics, hospitality, police:
share your rota
so friends and family never plan over a working day.
Every device
Yours on iPhone.
Theirs on Android.
Truly native on iPhone, iPad, Mac and Vision Pro, and just as at home on Android. Whatever your group carries, everyone stays in sync.
Encrypted. Everything. Always.
Privacy isn’t a feature.
It’s the
foundation
.
The only shared calendar with ANSSI-certified End-to-End Encryption.
ANSSI-certified E2EE
Every profile, group, calendar, event, message, and file is End-to-End Encrypted by default, certified by France’s national cybersecurity agency.
No ads. No tracking.
You pay for OurCal, so your data stays yours. We never sell it, mine it, or show you ads. Ever.
You stay in control
Advanced sharing controls let you invite by private link and stop sharing at any time. Your group, your rules.
Real groups, real stories
Organising life together, everywhere.
Their photos stay locked because everything in OurCal (profiles, calendars, events, and messages) is protected with
End-to-End Encryption
.
It means your calendar can be read by only you and the people you share it with. The keys never leave your group, so no one else can read your data. Not even OurCal.
Read more
Is OurCal’s End-to-End Encryption certified?
Yes. Our encryption is provided by Seald, whose technology is certified by ANSSI, France’s national cybersecurity agency.
Read more
Do we each get our own account?
Yes. Everyone gets their own account, and you share calendars by joining the same group.
Read more
Who can join a shared calendar?
Anyone you invite. Share your group’s private invite link and they’ll be guided through joining. Groups support 2 to 100 members.
Read more
Can I use OurCal with multiple different groups?
Yes. Home, work, school, social: create or join as many groups as you like, each with its own calendars, members, and chat.
Read more
Can I share different calendars with different groups?
Yes. Calendars belong to a group, so each group only ever sees its own calendars.
Read more
How do I set up my family, couple, or group in OurCal?
Download OurCal, tap Create Group, and share the invite link. You’ll be up and running in under a minute.
Read more
Which shared calendar app is best for a couple?
For two people on different phones, OurCal is built for exactly that: a chat on every event, End-to-End Encryption, and one subscription covering you both.
Compare the best shared calendar apps for couples
How do I contact OurCal support?
From OurCal’s Settings, tap Help & Feedback, then Request Help. We’ll get back to you quickly.
Read more
At first glance, this number seems astonishing. And, in one sense, it is. It’s another jaw-dropping sequential gain for what is likely the fastest-growing company in history.
But, break the trend down into implied monthly growth, and the picture looks different.
Specifically, it seems Anthropic barely grew from July to September.
Anthropic’s sequential revenue growth in Q3, moreover, was smaller in absolute dollars than its (gobsmacking) growth in Q2.
So, for several possible reasons, Anthropic’s growth has meaningfully slowed.
This is likely another reason why the stocks of “neocloud” providers like CoreWeave are collapsing. CoreWeave,
et al
, have borrowed tens of billions of dollars on the assumption that demand for AI compute will continue to grow at rates way beyond consensus expectations for years.
Now, not only are interest rates soaring — raising the carrying costs of this debt — the near-term revenue growth for AI services may be flattening.
Anthropic’s reported revenue growth this year has been unprecedented:
Q1:
$4.8 billion
Q2:
$11.6 billion (+$6.8B and +141%, sequentially)
Q3:
$16.8 billion (+$5.2B and +45%, sequentially)
Again, these numbers are astonishing.
But so are AI valuations and expectations.
Note that Anthropic added more revenue in Q2 than it did in Q3.
Note, too, that what matters most for Anthropic’s IPO valuation — and, likely, for the future trajectory of the AI bubble — is not what
has happened
but what
will happen
.
The key question is, “What do these numbers suggest about how fast Anthropic will grow
from here
?”
These figures suggest that the market should temper its expectations, at least temporarily.
If we break down the quarterly figures above into monthly estimates and add one more reported data point — that Anthropic had a
$65 billion annualized revenue run-rate in July
— we see that Anthropic’s growth has flattened even more than the quarterly figures suggest.
Below are back-of-the-envelope estimates for Anthropic’s monthly revenue in 2026. They are based on the reported quarterly revenue figures as well as the $65 billion annualized revenue in July (which equates to ~$5.4 billion of July revenue).
Even the quarterly numbers suggest that Anthropic’s average monthly growth slowed from ~$760 million in Q2 to (“only”) $580 million a month in Q3.
But the “$65 billion annualized revenue in July” data point suggests the slowdown is even sharper.
If Anthropic did $5.4 billion in revenue in July and $16.8 billion in Q3, it likely only grew modestly in August and September.
According to DealBook, at its meeting with investors yesterday, Anthropic did
not
share an annualized revenue number based on September’s revenue. This suggests — to this analyst, anyway — that Anthropic did not think the September annualized revenue figure would show impressive-enough growth versus July.
Indeed, when we extrapolate the monthly figures, it seems Anthropic saw a sharp change in its growth trajectory in August and September.
It means that the growth of the leading company in the sector appears to have slowed sharply in the past two months.
The slowdown might at least in part be the result of seasonality. August, at least, tends to be a slow month. But it’s early in a product cycle to see such sharp seasonality. And September’s growth should have sped back up.
It might also mean that Anthropic is simply not able to keep up with the growth of demand. If this is the reason for the slowdown, it’s a high-quality problem, and it won’t have a long-term impact on the overall AI spending growth trajectory (or bubble).
But it may also mean that the near-term growth rate of AI spending is moderating — either because demand growth is moderating or because companies are using cheaper models from China for some of their AI needs. (Usage data suggests the latter is in fact happening).
If
a slowdown in spending growth
is the explanation, we should expect the wild investor enthusiasm for all things AI — and the colossal infrastructure spending growth supporting it — to also begin to moderate.
Anthropic CEO Dario Amodei looks on as United States President Donald Trump holds a press briefing with AI executives following a meeting on artificial intelligence, outside the West Wing of the White House on September 29, 2026 in Washington, DC. (Photo by Kevin Dietsch/Getty Images)
Things are seldom what they seem when it comes to the finances of the AI industry. The AI ecosystem’s
circular business dealings
, extensive use of
financial engineering
, and otherwise
murky finances
make it hard for investors, regulators, or workers saving for retirement to get an accurate financial picture of AI companies.
That is particularly true of Anthropic, which filed the
registration statement
for its initial public offering (IPO) last week ahead of a planned November stock market debut.
The company’s topline financial figures look quite impressive for a startup, with revenues that appear to have grown quickly over the course of 2026 and a fairly healthy balance sheet — on the surface, that is.
Dig a little deeper, however, and a far bleaker picture emerges. Footnotes to the company’s most recent
financial disclosures
revealed
nearly $900 billion
in spending commitments, most of them stretching into the 2030s. The company’s financial results for 2026 have not been subjected to formal auditing, which makes them less-than-reliable, but the third-quarter results suggest that the company’s revenue growth
slowed to a crawl
over the summer.
Anthropic will have to reverse that trend and sustain extraordinary revenue growth to meet its vast obligations. But the financial pressures that are squeezing Anthropic — and, indeed, the AI industry as a whole — will make it exceptionally hard for the leading model developer to do so. If the company goes public, workers, retail investors, and retirees will increasingly be left holding the bag when Anthropic’s bills come due.
The financial mountain that Anthropic must climb is unprecedented for a company making its stock market debut. While Anthropic has an impressive $96 billion in cash reserves, its
amended registration statement
reveals at least $582 billion in non-cancelable spending commitments to just five companies (Amazon, AMD, Broadcom, Google, and Microsoft) to gain access to the vast computational power required to train and run Anthropic’s generative AI models.
Even though they do not appear on Anthropic’s balance sheet, those obligations are effectively debts
in a legal and practical sense
: they are payments that Anthropic is contractually required to make in the future, regardless of whether the company can afford to do so.
Moreover, it is not clear how much of the remaining $300 billion or so of the $895 billion in contractual commitments will ultimately land on Anthropic’s balance sheet. With the company continuing to negotiate
further massive infrastructure and compute contracts
, Anthropic may well end the year with a trillion dollars or more in contractual commitments.
Generating the revenues necessary to meet those obligations would be, to say the least, quite difficult for any company. But the margins of AI model developers are being squeezed by several forces that will make that task extraordinarily challenging for Anthropic.
Key forces squeezing the AI industry’s margins
AI industry margins
Demand pressure:
Businesses and consumers may not be willing to pay enough for generative AI.
Commoditization:
Fierce competition will make it difficult to raise prices.
Cost pressures:
High costs mean developers can’t cut prices without hemorrhaging cash.
External constraints:
Supply-chain challenges and community opposition drive up costs and delay revenue generation.
Anthropic’s spending commitments suggest that the company believes it will be able to convince businesses to pay for ever-larger and more expensive models. But there are growing signs that most businesses are not interested in
paying
for more powerful and expensive models. When Anthropic released its much-hyped Fable 5 frontier model this summer, its commercial reception was
tepid
.
Our content delivered to your inbox.
Join our newsletter on issues and ideas at the intersection of tech & democracy
Even if a future Anthropic model captivates businesses, the company would run into a second obstacle: the AI industry’s frenzied competition. Anthropic is part of a crowded Silicon Valley ecosystem where numerous well-heeled corporations (including Google, Meta, Microsoft, OpenAI, and SpaceX, along with Anthropic) offer generative AI models that are largely indistinguishable in their quality and capabilities. As a result, AI companies can quickly offer competing products whenever a rival identifies a use case that shows even a hint of commercial potential.
In such an environment, companies can rarely afford to raise prices because doing so will prompt customers simply to switch to a rival. The rush to grab customers ahead of their IPOs led Anthropic and OpenAI to launch a
price war
this summer that remains ongoing. Competition from Chinese companies offering open-weights models puts
further downward pressure
on prices, as does the increasing availability of models that can run locally on phones and laptops — no expensive data centers required.
That leads to the third problem: the extraordinarily high costs of the chips and data centers needed to train and run AI models, which put powerful and continuous upward pressure on Anthropic’s costs. Between the chips, servers, networking equipment, electricity and cooling infrastructure, construction costs, and other expenses, a 1 gigawatt (GW) data center costs an estimated
$31 billion
, and the prices for some components are soaring.
That is for 1 GW. Anthropic has committed to 15 GW of data center capacity in the coming years and the company
estimates
it will ultimately need 20-25 GW, which explains the company’s half-trillion-plus dollars in spending commitments.
And that is just the cost of the physical infrastructure. Once a data center is up and running, training AI models entails using tens of thousands of chips running in parallel that require massive amounts of energy to power, run hot, and need to be kept cool. Moreover, each time someone prompts a model to answer a question, create an image, or perform a task, additional computational power, energy, and cooling are needed to process the query and generate a response or complete the task.
Finally, there are external factors that are delaying data center construction and piling on additional costs. The fierce and still-rising backlash to
AI in general
and
data centers in particular
across the country has scuttled a number of data center projects and delayed many others. Every delay limits the computational capacity Anthropic is counting on to generate the revenue it will desperately need, and rising costs due to the Iran War and supply-chain challenges could drive Anthropic’s operational costs still higher.
Anthropic will further pad its cash reserves if its IPO is successful, but the brutal economics of its business are not likely to improve anytime soon. Even if demand picks up significantly, intense competition will apply unrelenting downward pressure on prices even as high costs and resource constraints squeeze it from the opposite direction. That is a deadly mix for Anthropic in light of its slowing revenue growth and massive off-balance-sheet debts, a vast and immovable fixed cost.
If Anthropic were to go public now, it would pile additional risk onto a stock market that is already
historically overvalued
and
disproportionately concentrated
in a handful of tightly interconnected mega-cap companies from the tech sector. That has already created
a risk of a historically damaging stock market crash
; never before has such a huge amount of wealth depended on the performance of a small number of companies whose fortunes are inextricably linked. Adding another huge, unprofitable tech giant to public exchanges would exacerbate both of those factors and create a higher risk of contagion if (or, rather, when) Anthropic reaches a financial precipice.
It also would mean that an ever-larger share of the fallout from a potentially devastating AI crash would fall on ordinary people. As a private company, Anthropic’s shares are overwhelmingly owned by corporate insiders, tech giants, and venture capitalists. Once the company goes public and shares start getting funneled into 401(k)s, retirement accounts, and index funds, it will be workers, retirees, and retail investors that are increasingly left holding the bag when the forces squeezing Anthropic’s margins start to bite.
The Securities and Exchange Commission (SEC) has the power to stop that from happening. The agency can delay or stop companies from going public if it believes a company’s registration statement is “
on its face incomplete or inaccurate in any material respect
.” That legislative language might as well have been written with Anthropic in mind, considering that the company’s prospectus includes only unaudited financial results for the period where it claims the greatest revenue growth, relegates its most significant future obligations to the footnotes of its registration statement, and has continued to announce new 11-digit financial commitments as its IPO approaches.
The SEC should
block
Anthropic’s stock market debut until the company provides two consecutive quarters of audited financial statements, with all material information about the company’s spending commitments disclosed. Failing to do so could have dire consequences for workers, investors, and ultimately the financial system and economy.
This project aims to become an
open-source carrier-board design for NVIDIA V100 SXM2 modules
, including NVLink connections for two- and four-GPU configurations.
While that board is being developed, this reference kit shares the pin mappings, connection plans and connector-only KiCad resources so other people can develop their own designs.
My contribution so far is primarily curation:
gathering public information, comparing sources, reconciling connector orientation and signal names, and making the results easier to follow. The original reverse-engineering work belongs to its authors, credited in
Sources and attribution
.
Getting started
Download the complete reference ZIP from
v0.1.0-reference
, or use
Code > Download ZIP
for the current development files.
Extract the archive and keep the directory structure. Choose a
single-, two- or four-module KiCad starter
, then open its
.kicad_pro
file in
KiCad 10.0.7
or a compatible newer version. Keep the whole
kicad/
folder so the shared symbol library is available.
The
download guide
includes print editions and library-path help.
Change notes
identify reference editions. This is a public reference pre-release, not a hardware-qualified carrier board.
800 canonical contacts:
400 on connector A and 400 on connector B, with signal names, evidence and electrical-treatment notes.
Two- and four-GPU connection tables:
exact Connector B pads, directions, lanes and polarity.
Three editable KiCad starters:
one module’s A/B connectors, plus two- and four-module versions with NVLink data connected. Every contact stays labelled, including unconnected clocks, power and control pins. No regulator, power-control or clock circuits are included.
Catppuccin Mocha visuals:
contact maps, topology diagrams, schematic previews and the standalone dark reference workbook. An optional KiCad colour theme is included.
External clock required:
the NVLink starter schematics show data wiring, not a complete working NVLink implementation. Each V100 needs a
156.25 MHz differential NVHS clock on B/E20 (+) and B/F20 (−)
. The separate PCIe clock is
100 MHz on A/E7 (+) and A/F7 (−)
.
Clock requirements and scope
.
Schematics at a glance
These are the actual
connector-only KiCad schematics
: 400 labelled contacts on A and 400 on B. Click a preview to open the full-size vector drawing. The two- and four-GPU NVLink arrangements are shown separately below and in the connection guides.
The full six-group two-GPU arrangement is derived from the documented pairing families; the four-GPU arrangement follows the curated topology. Each guide explains its source evidence and remaining uncertainties. These are logical connection plans, not routed bridge schematics.
This is a render of an existing project geometry preview, using the Amphenol connector model. It illustrates connector placement; it is not a completed carrier board or proof of connector A/B identity, mating-part selection or viewing direction. See
render provenance
.
Where this is going
The longer-term goal is a reusable open-source board design. This reference kit currently covers the pin mappings, NVLink connection plans and connector starter. Routed boards, manufacturing outputs and hardware qualification are future work. See the
roadmap
.
Corrections are particularly useful when they include an oriented drawing, exact source reference, continuity result or measured behaviour. Please distinguish a confirmed observation from an interpretation.
Our original hardware design contributions use
CERN-OHL-W-2.0
; our original documentation, diagrams and workbook presentation use
CC BY-SA 4.0
. Both allow commercial reuse, with attribution/notices and the applicable reciprocal sharing requirements. See
licence scope and full texts
and
third-party notices
. The licences do not claim ownership of pinout facts or replace upstream terms.
September quarter records for total company revenue, iPhone revenue, and EPS
Services revenue reaches new all-time high
CUPERTINO, CALIFORNIA
Apple today announced financial results for its fiscal 2026 fourth quarter ended September 26, 2026. The Company posted quarterly revenue of $114.5 billion, up 12 percent year over year. Company gross margin was 47.9 percent, including a favorable impact of approximately 1 percentage point from tariff refunds. Diluted earnings per share was $2.10, up 14 percent year over year, and included a favorable impact of $0.05 from tariff refunds.
“Today, Apple is proud to report a September quarter revenue record of $114.5 billion, up 12 percent from a year ago, with iPhone reaching a September quarter record and Services reaching an all-time high, capping off our best fiscal year ever,” said John Ternus, Apple’s CEO. “We’re closing the year with our most ambitious lineup yet. That includes the iPhone Duo, the most transformational iPhone since the original, alongside iPhone 18 Pro and iPhone 18 Pro Max, our most powerful iPhones yet. We also just introduced a whole new generation of hardware for the home and brought Touch to Mac for the first time. Together with the all-new Siri AI, it’s an incredible lineup to carry us into the holiday season.”
“Apple delivered September quarter records for net income and EPS. Our record September quarter capped off a strong fiscal 2026, with all-time record revenue of $479 billion and double-digit EPS growth,” said Kevan Parekh, Apple’s CFO. “We generated $28 billion in operating cash flow during the quarter, allowing us to return $28 billion to shareholders. Thanks to our very high levels of customer satisfaction and loyalty, our installed base of active devices reached a new all-time high across all major product categories and geographic segments.”
Apple’s board of directors has declared a cash dividend of $0.27 per share of the Company’s common stock. The dividend is payable on November 16, 2026, to shareholders of record as of the close of business on November 12, 2026.
Apple will provide live streaming of its Q4 2026 financial results conference call beginning at 2:00 p.m. PT on November 2, 2026, at
apple.com/investor/earnings-call
. The webcast will be available for replay for approximately two weeks thereafter.
Most software we use today is black-box and cannot be easily modified by its
users. This article follows the history of information hiding from OS/360 to Free Software
and the history of the Web and documents how software becomes opaque through well-intended
engineering decisions.
This essay is work-in-progress, currently under submission to an academic
journal on history and philosophy of computing. If you have any suggestions, comments
or corrections, please get in touch!
When I was writing my first JavaScript scripts at the end of the 1990s,
you could learn by finding a web page that did what you wanted, clicking
"View source" and copying the bits of JavaScript that you needed. This was
surely due to the primitive nature of the web (and what I was trying to do), but
the kind of openness that lets you explore, learn, and modify software has largely
been lost (in most professional programming contexts) today.
You might argue I'm just nostalgic. After all, open-source has became the dominant
development methodology and so users can, in fact, understand and modify a lot of
the software they use. But I do not think open-source is the answer. The software
freedoms may exist in theory, but in practice, even professional programmers have
a hard time modifying complex software systems that we rely on today.
This article is an attempt to understand how software becomes opaque and why.
The conclusion, supported by two historical case studies, is that opacity comes
about due to good engineering and managerial intentions. Knowing this may help us
imagine a better, more open nature of software for the future.
Most software that is built today is a black box. What the users of the software can do is
determined by the software design and the decisions of its designers and programmers remain hidden in
the program source code. In most cases, users do not have access to the source code.
1
1
A typical
situation with online services and apps including, for example, social networks and AI chatbots.
Even when the source code is available,
2
2
In case of open-source software such
as the Linux operating system, the Firefox web browser or the LibreOffice office suite.
its complexity
and structure makes it practically impossible for most users to answer questions about the inner
workings of the software.
The black box nature of software has wide-ranging consequences. It means that end-users have no
way of finding out why they are seeing particular results when using the software and how those results
were obtained. For example, they cannot find out why they are seeing a specific advertisement on
social media and they have no way of adapting software to suit their accessibility needs.
There are numerous attempts to address those limitations. Work on
explainable AI
3
3
See for
example review by
Dwivedi et al. (2023)
.
aims to make artificial intelligence models more
transparent,
enabling architecture
4
4
Clark (2014)
imagines Global Public Inclusive
Infrastructure that enables personal digital inclusion.
supports building of inclusive
adaptable applications and
malleable software
5
5
Abstractly characterised by
Tchernavskij (2019)
and illustrated for example by Wildcard (
Litt et al., 2020
).
empowers end-users to modify their software. Despite the virtuous aims of these
approaches, they are treating merely the symptoms of a more basic
limitation of our present way of engaging with software.
Our relationship with software resembles the troublesome relationship of the
society with technical objects that has been studied by Gilbert Simondon in the
1950s.
6
6
His thesis
On the Mode of Existence of Technical Objects
was published
in French in 1958, but the first official English translation only appeared in 2017
(
Simondon, 2017
).
Simondon examined the sources of alienation,
arguing that the “most powerful cause of alienation in the contemporary world
resides in this misunderstanding of the machine, (...) by the non-knowledge of its
nature and its essence.”
7
7
Simondon (2017, p.16)
Today, when software is increasingly ingrained in a wide range of aspects of our lives,
and our “non-knowledge of its nature and its essence” is ubiquitous,
the “most powerful cause of alienation in the contemporary world” may well be the
misunderstanding of software. At a time when the society needs to make important decisions
about software, the opacity of software prevents us from developing an effective conceptual framework for
understanding how software operates. The fact that most software is intentionally built to hide
its inner workings is a crucial part of that. As Simondon pointed out already, the “technical
objects that produce the greatest alienation are those meant for ignorant
users.”
8
8
Simondon (2017, p.255)
The opaque nature of software is not a necessity. The history of programming offers
many visions of a more open software. The Free Software movement envisioned software
that gives users the freedom to “study how [it] works and adapt it to [their]
needs,”
9
9
This particular wording is from the “What is Free Software?” page
published on the GNU website in 1997 (
Free Software Foundation, 1997
), but similar ideas already appear
in the first bulletin of the Free Software Foundation (
Stallman, 1986
).
while the creators of the Smalltalk programming language in the 1970s saw their system as
“a general purpose meta-medium that anyone can adapt to their particular
needs.”
10
10
Quoted from
Kay and Goldberg (1977)
. The language itself has been
described by
Goldberg and Robson (1983)
. See also historical reflections
by
Kay (1993)
.
Such software could empower users
to engage more closely with software and, possibly, also help develop a better understanding
of software in the broader society. Yet, despite these appealing visions, often backed by
solid engineering developments, opaque software remains the norm.
Understanding how software becomes opaque is the necessary prerequisite for
undoing the closing of software. As argued by Federica Frabetti, if we want to tackle the
deep opacity
11
11
Frabetti (2014)
adopts the term used
by
Stiegler (1998)
who maintains that “we do not immediately understand what
is being played out in technics (...) even though we unceasingly have to make decisions regarding
technics the consequences of which are felt to escape us more and more.”
of software, we need “to problemaitize the intertwining of the technical and the social aspects of
software”
12
12
Frabetti (2014, p.xix)
and question “the conceptual system
on which [software] relies for its functioning.”
13
13
Frabetti (2014, p.xiii)
Frabetti does this by critically interrogating “historical-cultural and technical narratives,”
including the origins of software engineering and reflections on free and open software.
I follow a more historical approach. Taking inspiration from the methodology of critical
software studies,
14
14
The book edited by
Fuller (2008)
introduces the field;
specific approaches include critical code studies (
Marino, 2020
), studies of
singular artifacts such as a BASIC one-liner interrogated by
Montfort et al. (2012)
or rethinking of the history and origins of software (
Sack, 2019
).
I closely examine two specific historical case studies (§
4
and §
5
)
and use them to document how decisions regarding software opacity are made. Before doing so,
I review notable past visions of open software (§
2
) and classify the
different notions of software openness that appear in this article (§
3
).
2.
Visions of open software
Multiple past visions of software included openness as their key component.
Many of those visions had a profound impact on the computing industry, but in a
remarkable number of cases, the idea of a more open software later got lost.
15
15
This
review is inevitably incomplete. Many more systems would deserve a mention,
including Boxer (
diSessa and Abelson, 1986
), Lisp Machines, Interlisp (
Steele and Gabriel, 1996
)
and Emacs (
Stallman, 1981
).
Figure 1.
Smalltalk 78 running the SimKit demo in an emulator by Computer History Museum
(
https://smalltalkzoo.computerhistory.org/
). The simulation in the background models
office scheduling task. The Browser in front allows the user to explore how the simulation
is implemented.
2.1
Smalltalk
The Smalltalk programming language was envisioned as the software side of the Dynabook,
a “personal dynamic medium the size of a notebook which [could] handle
virtually all of its owner's information-related needs.”
16
16
Kay and Goldberg (1977)
The language
was intended as “a general purpose meta-medium that anyone can adapt to their particular
needs.” This means that a “kid may turn [the Dynabook] into a painting system, a musician may turn it
into an audio synthesis system and a decision theorist can turn it into an agent-based simulation
system.”
17
17
Petricek (2025)
Openness was a necessary part of the vision, because it enabled users understand how the system
works and learn how to modify it:
18
18
This idea was illustrated in an article presenting Smalltalk
in the 1981 issue of the BYTE magazine (
Reenskaug, 1981
).
The new user of a Smalltalk system is likely to begin by using its ready-made application
systems for writing and illustrating documents, for designing aircraft wings, for doing homework,
for searching through old court decisions, for composing music, or whatever.
After a while, he
may become curious as to how his system works. He should then be able to “open up” the
application object on the screen to see its component parts and to find out how they work together.
The next thing the user might want to do is to build new systems similar to the one he has been
using. A kit of graphical building blocks would let the user compose a new system (...).
Finally, the expert user would want to make his own kits.
Today, Smalltalk is recognized as the first object-oriented programming language.
Object-oriented languages like Java adopted many of the Smalltalk language features,
but not the openness of the medium. If you have a running Java
application, you cannot “open it up” to find out how it works and adapt
it.
19
19
Although the iPad has the form-factor of the Dynabook that Alan Kay envisioned in
the 1970s, Kay criticised its closed nature arguing that iPad “could not be farther from the
original intention” (
Greelish, 2013
).
The development through which the open object-orientation of Smalltalk turned into
the closed object-orientation of Java has been described as the shift from the humanistic to the
engineering culture of programming.
20
20
(
Petricek, 2025
)
While the former emphasized
openness as a value, the latter was concerned with practical engineering issues such as
deployment, which was challenging in the original Smalltalk model.
21
21
The issues with
deployment have been listed as one of the possible reasons
for the demise of Smalltalk (
Bracha, 2020
).
2.2
Microcomputers
In the 1970s, Smalltalk required an expensive special-purpose hardware that was
only available at Xerox PARC. What made computers more widely accessible
was a parallel development.
22
22
This common narrative has been questioned by
Rankin (2018)
,
who points out that access to microcomputers was still limited to an elite group and that
there were other computer networks based on time-sharing systems at the same time.
Microcomputers were a new kind of computers enabled by the development of
microprocessors.
23
23
Advertised as “computer on a chip”.
At first, microcomputers were
toys for highly technical tinkerers, but they soon became more powerful and user-friendly.
The “1977 trinity,”
24
24
The term “1977 trinity” only appeared in later written
retrospectives. A detailed account of the history of microcomputers has been written by
Haigh and Ceruzzi (2021)
.
comprising Commodore PET, Apple II and TRS-80 sold millions of units.
The way these microcomputers worked was
remarkably close to Alan Kay's vision.
25
25
Petricek (2025)
The machines booted into an
interactive BASIC programming prompt and even playing a game involved typing program
commands. The code of BASIC programs was accessible to modification and was often copied
line-by-line from magazines, exposing regular computer users to programming.
26
26
Inspired by
the complementary science methodology (
Chang, 2004
), the web-based
Commodore 64 BASIC reconstruction (
https://tomasp.net/commodore64
) documents interesting
ways of working of the system that have been lost.
The early open spirit of microcomputers did not last. Developers started
creating more sophisticated applications for microcomputers and many of those were not coded in
BASIC, but in low-level and more opaque assembly. This was frequently for performance reasons.
Many microcomputer users also stopped thinking about them as general-purpose programmable systems, but
as devices to run a specific application. As documented by Laine
Nooney,
27
27
Nooney (2023)
the Wall Street users referred to Apple II
as the “VisiCalc machine,” using the name of an early spreadsheet application, their primary
reason for buying the computer.
2.3
Free software
A more ideological approach to the openness of software in the Research Laboratory of Electronics
(RLE) at MIT in the 1960s. The computer programmers who congregated around the TX-0 and PDP-1
computers developed a set of values that were later referred to as the hacker
culture.
28
28
The term was popularized by
Raymond (1999)
and
Levy (1984)
. A more critical reflection has recently been written by
Tozzi (2017)
.
Hackers believed that access to computers and information should be
unlimited. Anyone should be able to look at program source code, learn from it and modify it
for their own use.
The values were made more explicit when the Free Software Foundation was established in 1985,
possibly in response to the slow demise of the original community of hackers at MIT.
The foundation was “dedicated to eliminating restrictions on copying, redistribution,
understanding and modification of software.”
29
29
According to the first bulletin published
by the foundation (
Stallman, 1986
).
The word “free” in the name of the organization
referred to two essential freedoms that the foundation aimed to promote, “the freedom to copy
a program and redistribute it” and “the freedom to change a
program.”
30
30
Stallman (1986)
The latter freedom also required that the source
code of the program is available to its users. To support the aim, the foundation later created
the GPL license, which formalized the requirement. GPL-licensed software must be distributed
with source code and anyone who modifies and redistributes it must also share the modified
source code.
In principle, sharing the source code provides the user with full access to all information
they need to understand how the program works. For the kind of software tools developed as part
of the GNU project in the 1980s, the access to source code also allowed their users to “change
the program” in practice. However, this was partly because the users were themselves programmers
and partly because the complexity of the software tools was limited. The degree to which
access to source code enables users to “change a program” today may be questioned.
Open source systems like Linux or Firefox are distributed with
source code, yet making even a small change to the software, such as changing the text of
a menu item, is outside of the reach of a vast majority of their users.
2.4
Hypertext and the Web
Another software lineage with its own vision of openness is centered around what later became
known as hypertext. The development can be traced to a 1945 essay
As We May Think
by
Vannevar Bush.
31
31
Bush (1945)
In the essay, Bush describes a device for managing
information that makes it possible to follow connections between different documents it
stores.
32
32
Writing in 1945, Bush imagined the documents would be stored on microfilms.
Bush's essay was influential and later inspired Ted Nelson, who introduced the term `hypertext'.
For our discussion about software openness, it is useful to focus on two later instances of the
idea, the HyperCard application and the World Wide Web.
HyperCard was built by Bill Atkinson for Apple in 1987. Unlike Smalltalk or GNU, which were
programming systems, HyperCard was an end-user application. Users could create “stacks of
cards” that contained user interface elements and data. The cards could be linked, so that
clicking a button led the viewer to another card and more complex logic could be implemented
using scripts. HyperCard had an
enthusiastic community of users who used it for a wide range of personal, creative and bussiness
projects. Arguably, one of the reasons for its success was its openness. HyperCard made no strict
distinction between the stack creator and viewer. Both viewing and editing was done in the
same graphical user interface. To edit a stack, the user merely had to switch to a different user
level (Figure
2
), which added additional controls for modifying the
cards.
33
33
For commercial distribution, it was also possible to lock and password-protect
HyperCard stacks to disable editing, but many stacks were available unlocked and unprotected.
Figure 2.
HyperCard preferences page, where the user can select a “user level” to change
the mode of interaction with a HyperCard program (screenshot by the author)
The design of HyperCard made it easy to copy, study and modify HyperCard stacks obtained from
other users and learn how to create new ones. It is worth noting that these characteristics
are remarkably similar to the two freedoms required by the Free Software Foundation.
I would thus argue that, just like BASIC on microcomputers was an unfaithful, but practical
realization of Alan Kay's Smalltalk vision, HyperCard was an unfaithful, but practical
realization of free software.
HyperCard stacks existed as local stand-alone files, which made them unsuitable for the
1990s era of the internet. The World Wide Web developed by Tim Berners-Lee
was also inspired by hypertext, but focused on sharing of information.
Reflecting its academic origins, the web was structured as interconnected set of
documents (rather than cards), but the documents also included other interface elements known from
HyperCard (like buttons). The fact that documents existed on public web servers, rather than
as local files, made editing a trickier problem. Despite some initial attempts, the World
Wide Web never allowed users to directly edit documents through the web browser. However,
the web remained open in the sense that users could view the source code of a web
page, save it locally, or copy parts of it for their own use. As I document later in this
article, the openness gradually disappeared. If a user opens a source code of a modern
web application, they no longer see comprehensible source code and have little chance
to understand what is happening with the data they enter.
3.
What is software openness
Openness has been broadly defined as the “accessibility of knowledge, technology and other
resources; the transparency of action; the permeability of organisational structures; and the
inclusiveness of participation.”
34
34
Schlagwein (2017)
In the context of
software, openness also manifests in different ways. The kind of openness of Free Software
differs from that of customizable end-user application such as HyperCard. We can separate the
two cases by distinguishing between the
static openness
of the source code and documents
using which software system is produced and the
dynamic openness
of the resulting
running software system.
Static openness
The first kind of openness concerns the source code and other information about software.
The concept can be used for making a distinction between
proprietary software
(information
about it is not available) and
open source software
(the source code is available). Even
proprietary software can be closed to a varying degree. For example, different software development
methodologies recommend restricting access to particular information to different parts of the
development team. The notion is not restricted to source code. For example, an explanation of how
a key algorithm of a system operates, or a detailed description of collected data can be shared
in an accessible form with end-users.
35
35
Regulations such as GDPR can thus be seen as
requiring a minimal degree of openness of software.
Dynamic openness
The second kind of openness reflects the degree to which the structure of the (running)
software system is exposed. An application compiled to native code is dynamically closed
as it is difficult to reconstruct any information about its internal
structure.
36
36
As pointed out by
Kell (2019)
, if an application is compiled with
suitable debugging information, it should still be possible to reconstruct its structure.
Software systems that retain the original static structure are more open.
At an extreme end, a running Smalltalk system includes all class definitions with their source code,
allowing users to inspect and modify the running program. A more limited case is that of mobile
applications that need to access some device resource. The application needs to declare the
required permissions, which reveals (very little) information about its inner working.
Software opacity
The two kinds of openness both contribute to the opacity of the
software we use today. If we face software that is both statically and dynamically
closed, we have no way of understanding how it operates. Dynamic openness makes software more
transparent to its end-users, while static openness serves primarily programmers.
In an open software system like Smalltalk the two notions partly overlap, because source code
becomes a part of the running system.
Each of the following two case studies focuses on one of these kinds. The discussion of
information sharing (§
4
) is primarily concerned with static openness, while the
study of the web (§
5
) emphasises dynamic openness.
As we will see, the decision making that is involved in choosing whether to make a
software system more open or more closed is very similar for both kinds of openness.
4.
Information sharing
Information hiding is a fundamental concept in computer science. Every student is taught to
design software in a way that hides the implementation details of a module, exposing only a
well-defined stable interface. The principle makes software more closed, but is accepted as a
good engineering principle. In the first case study, I retrace the origins and challenges of
information hiding.
Figure 3.
One of the models of computers from the IBM System/360 family.
4.1
The OS/360 workbook
In 1964, Frederick P. Brooks, Jr. became the manager of the IBM System/360 project, building a
newly designed family of computers. The operating system OS/360 designed for the computers
later became a well-known example of a software project completed late and significantly
over budget.
37
37
For an overview of the history of the IBM System/360 project, see the
article by
Cortada (2019)
.
After leaving IBM, Brooks tried to answer the question of
why managing software projects was so difficult in his book
The Mythical Man-Month
. The
reflections included the now so-called Brooks' Law that “adding manpower to a
late software project makes it later”. However, the book also discussed the problem of sharing
information.
Brooks believed that the “problem is not to restrict information, but to ensure that relevant
information gets to all the people who need it.”
38
38
Brooks (1995, p.76)
According to Brooks, the view was supported by Harlan Mills, who argued that programming should be a
“public process” and that “exposing all the work to everybody's gaze helps quality control,
both by peer pressure to do things well and by peers actually spotting flaws and
bugs.”
39
39
Brooks (1995, p.271)
The motivation for making information about the
software public (to all team members, although not necessarily its users)
was based on engineering and managerial reasons. Brooks and Mills were not concerned
with transparency or accountability, but with producing reliable software.
To ensure everyone has access to full information about the system, Brooks' team maintained
a project workbook containing
“all
the documents of the project [including]
objectives, external specifications, interface specifications, technical standards, internal
specifications, and administrative memoranda.”
40
40
Brooks (1995, p.75)
The workbook was initially distributed on paper, eventually numbering over 10,000 pages.
Team members received updates of 150 pages daily that they had to add or replace in their
looseleaf copy of the workbook. This was tedious work, but it ensured that team members
were aware of the changes. The team later switched
to microfiche, which simplified maintenance, but meant that changes were no longer read.
4.2
Information hiding
A different way of thinking about information sharing was born only a couple of years later,
when David L. Parnas took a one year leav-of-absence from his academic post in 1969 to work with a
company in Netherlands and had a first-hand experience with software design that involved tight
coupling of components. When the “control block format” was changed by one team member, code
written by another team member that relied on the original format stopped
working.
41
41
Parnas (2002)
Initially, Parnas only had an intuition that the design was not “beautiful” in the same way
as, for example, Dijkstra's THE system.
42
42
Dijkstra (1967)
Parnas first attempted to
analyze the problem in a paper
Information Distribution Aspects of Design
Methodology
presented at the IFIP Congress in 1971.
43
43
Parnas (1971)
In the paper, he argues that information “broadcasting” that “makes all information accessible
to anyone working on the project” is harmful and that “it is helpful if most system information
is hidden from most programmers.”
44
44
Parnas (1971)
Parnas illustrates the idea with a number of examples including I/O device addresses, character
codes, control block formats and memory maps.
In the following year, Parnas published two widely-cited journal papers,
45
45
On the
criteria to be used in decomposing systems into modules
(
Parnas, 1972
) and
A technique for software module specification with examples
(
Parnas, 1972
)
in which he argues that a good design decomposes a system into modules that hide certain
information from other modules:
We propose (...) that one begins with a list of difficult design decisions or design decisions
which are likely to change. Each module is then designed to hide such a decision from the
others.
46
46
Parnas (1972)
According to Parnas, this approach leads to a more modular decomposition than the typical
approach of splitting system into subroutines based on a flowchart. The benefits
are:
47
47
Parnas (1972, p.2)
(1) managerial, because teams can develop
modules independently; (2) greater flexibility, because modules can be changed independently; and
(3) comprehensibility, because modules can be understood one at a time.
Similarly to Mills and Brooks earlier, Parnas also makes the decision regarding information
sharing based on engineering and managerial reasons. He argues that information hiding will
make development faster and more flexible. Even comprehensibility is not framed as virtue on
its own, but as a practical benefit.
4.3
The Mythical Man-Month, 20 years later
When writing
The Mythical Man-Month
, Fred Brooks was aware of Parnas' notion of information
hiding, but dismissed it as a recipe for disaster.
[Parnas has proposed that] the programmer is most effective if shielded from (...)
the details of construction of system parts other than his own. This presupposes
that all interfaces are completely and precisely defined. While that is definitely sound design,
dependence upon its perfect accomplishment is a recipe for disaster. A good information
system both exposes interface errors and stimulates their correction.
The
20th Anniversary Edition
of The Mythical Man-Month, published in 1995, includes
an additional retrospective chapter in which Brooks discusses which of the original ideas
still hold and which of his views have changed. Information hiding is perhaps the most notable
aspect of the original analysis where Brooks completely reversed his position:
I dismissed Parnas's concept as a “recipe for disaster” (...). Parnas was right, and I
was wrong. I am now convinced that information hiding, today often embodied in
object-oriented programming, is the only way of raising the level of software
design.
48
48
Brooks (1995, p.272)
Brooks follows the admission with a more detailed analysis that, again, focuses on
engineering aspects of the decision. He notes that “one can get disasters with either
technique,” but concludes that a design based on information hiding is more appropriate
for designs that are expected to change.
4.4
Free software
The next contribution to the debate came from a more ideological
background. The members of the hacker culture, which formed at MIT at the end of the
1950s believed that “all information should be free.”
49
49
Levy (1984)
;
although, as pointed out by
Tozzi (2017)
, the actual history is more complex.
At a time when most programming by the MIT hackers was done on two machines, this
meant that every programmer had access to everything on the machine, but the community also
later embraced ARPAnet, a predecessor of the modern Internet.
A more formal structure capturing the ideals of the hacker culture emerged in the 1980s
when Richard M. Stallman, referred to as “the last of the true
hackers,”
50
50
Levy (1984)
established the Free Software Foundation (FSF). The foundation
was established to support the development of the GNU operating system which was intended
as a replacement for the widely-used but non-free UNIX.
51
51
Tozzi (2017)
The FSF initially viewed copyright and software license agreements as evil, but in the
late 1980s, Stallman and his colleagues realised that they could use copyright notice to
ensure that source code remains available for studying, copying and modification.
The version 1.0 of the license was issued in 1989. It captured the idea of free software that
was first described in the opening bulletin published by the Free Software Foundation in
1986. In the bulletin, Stallman explains that the word “free” in the name refers to a number
of fundamental freedoms:
52
52
Stallman (1986)
First, the freedom to copy a program and redistribute it to
your neighbors, so that they can use it as well as you. Second, the
freedom to change a program, so that you can control it instead of it
controlling you; for this, the source code must be made available to you.
In contrast to the writing of Brooks, Mills and Parnas who focus on managerial and engineering
values of information sharing (or hiding), Stallman's mission is rooted in the ideological
beliefs of the hacker culture.
53
53
Petricek (2025)
Later in the bulletin, Stallman
describes the value of the GNU approach,
54
54
Stallman (1986)
saying that “user
who needs changes in the system will always be free to make them himself” and that they “will
no longer be at the mercy of one programmer or company which owns the sources and is in sole
position to make changes.” However, Stallman also alludes to efficiency that would appeal to
managerially-minded Brooks and Mills when he points out that “much wasteful duplication of
system programming effort will be avoided” as the result of the openness.
4.5
The cathedral and the bazaar
Although the GNU source code was available for sharing and modification, the development
method employed by the GNU team was largely following the conventional
model based on a close collaboration of team members.
The increasing availability of computers connected over the Internet alongside with
the sharing of source code enabled a new development model to emerge in the 1990s.
The most prominent example of the new development model became the Linux kernel.
Linux started as a hobby project by Linus Torvalds, who was an undergraduate student in Finland
at the time. As documented by Tozzi,
55
55
Tozzi (2017)
Torvalds wanted to have a
fully-functional Unix-like operating system that would work on a PC. Torvalds was not
“much aware of the sociopolitical issues that were—and are—so dear to
[Stallman].”
56
56
Torvalds and Diamond (2001, p.51)
He was chiefly interested in having a system
that could run the tools developed as part of the GNU efforts at no cost.
Torvalds made his code available on the Internet, using a license that prohibited
commercial at first, but later switching to the GPL license. Living away from the large
computer science centres at the time, he started to remotely collaborate with numerous
volunteers, accepting patches and improvements.
Without realising it, Torvalds invented a new development model that relied on a large number
of loosely coordinated volunteers. A clear description of the revolution appeared a couple
of years later, in a paper presented by Eric S. Raymon at the Linux Kongress conference
in 1997 that was later published as
The Cathedral and the
Bazaar
.
57
57
Raymond (1997)
As Raymond noted, the essay “merely formalized
(...) what some FOSS developers (...) had been doing for years by that
point.”
58
58
Raymond (1999)
Interestingly, Raymond praises the “bazaar” development model of Linux not
because of its sociopolitical characteristics, but mainly because of its effectivity:
What I saw around me was a community that had evolved the most effective software-development
method ever and didn't know it! That is, an effective practice had evolved as a set of customs,
transmitted by imitation and example, without the theory or language to explain why the practice
worked.
59
59
Raymond (1999)
Raymond's writing contains more references to the ideas of Fred Brooks than to those of
Richard Stallman. As pointed out by Frabetti,
60
60
Frabetti (2014)
the cathedral metaphor
in the title of the essay is itself a reference to Brooks, who likened the conceptual disunity of software to
those of Medieval cathedrals.
61
61
Brooks (1995, p.42)
Raymond also grapples with
the constraints imposed by Brooks' Law. He argues that collaboration in a distributed fashion
reduces the need for communication, as well as its overhead, which was the root cause for the
delays described by Brooks. (Some 25 years later, developers of open-source projects suffering from
burnout as a result of toxic communication may yet again disagree with Raymond's
analysis.
62
62
(
Raman et al., 2020
)
)
Raymond's essay embodies a shift from ideological arguments about information sharing
to those based on engineering and managerial reasons. He also moved away from
the term “free software” and started talking about “open source” as a more broader term
that includes software with licenses that do not enforce sharing of derivative works. To advocate
for his vision of open source, Raymond co-founded the Open Software Initiative (OSI). In a later
comment,
63
63
(
Raymond, 1999
)
he clarified that he is all in favor of freedoms,
rights and principles supported by Stallman, but that the FSF tactics don't work whereas tactics
pursued OSI work. He argues that the Stallman's “rhetoric is very seductive to the kind of people
we [hackers] are,” but that the language “simply does not persuade anybody but [hackers].”
The dispute between Stallman's “free software” faction and Raymond's “open source” faction
is explored in detail by Tozzi.
64
64
Tozzi (2017)
We can also see the dispute as a
clash between the more idealistic hacker culture and the more pragmatic engineering, or even
managerial cultures of programming.
65
65
Petricek (2025)
The fact that open source
became a business strategy became evident in 1998 when Netscape announced that it would
open-source its web browser (which would later evolve into Mozilla Firefox). The decision was
inspired by Raymond's essay and its discussion of the merits of the “bazaar” development
methodology. Netscape had “no deep-seated ideological commitment to the FOSS
movement.”
66
66
Tozzi (2017)
They saw the change in business terms, as a way to
“accelerate development and free distribution by Netscape (...) further seeding the market for
Netscape's enterprise solutions.”
67
67
Tozzi (2017)
In other words, engineering and
managerial reasons have, again, became the key factors for decisions regarding information
sharing in software.
4.6
Beyond open source
In the 2010s, the open source approach to software development has became the dominant
development methodology. Tozzi concludes his history of the free and open-source
software (FOSS) revolution by discussing the Android and Ubuntu projects, which “are successful
when measured in terms of market penetration but have been perceived as failures by hackers who
do not see these initiatives as fulfillments of the true promise and potential of the
FOSS revolution.”
68
68
Tozzi (2017)
In recent years, the open source development
methodology has been embraced even by the fiercest former opponents of the free software
including Microsoft.
For the initiators of the free software movement, open source does not guarantee
the originally envisioned freedoms. It could be also argued that access to source
code in the modern computing context does not guarantee the “freedom to change a program, so
that you can control it instead of it controlling you.”
69
69
Stallman (1986)
The access to source code may have been sufficient in the 1980s when most GNU users were other
computer hackers and the complexity of the system was moderate. Today, when large software systems
span millions of lines of code and the majority of their users has no programming experience,
the ability to “change a program” is merely hypothetical. This can be demonstrated, for
example, by the challenges faced by the soveregin mobile operating system initiatives by removing
dependence on Google from the open-source Android operating system.
70
70
Grolleau (2021)
Figure 4.
Universe Q web page hosted at Geocities and viewed using Netscape Navigator.
Geocities was an early hosting service that allowed users to create their own web pages and host
them in one of several areas of the page.
5.
The closing of the Web
The World Wide Web was conceived by Tim Berners-Lee in 1989 at CERN.
71
71
Gillies and Cailliau (2000)
It was intended as a universal information sharing platform. The design of the web was inspired
by earlier projects that explored how computers could assist with information
sharing.
72
72
Petricek (2025)
associates many of the preceding developments with
the humanistic culture of programming.
For example, the concept of a hyperlink can be traced back
to the late 1960s work of Douglas Engelbart's on the oNLine System (NLS).
Many of the design decisions around the web that contributed to its openness were the results
of primarily engineering decisions. One example is the adoption of the Hypertext Markup Language
(HTML). Various markup formats were used before the birth of the web and many physicists working
at CERN preferred the more powerful TeX system. As Gillies and Cailliau
point out, Tim Berners-Lee chose to use HTML to ensure that “no matter what kind of computer you
had, an HTML page would be understandable, even if it didn't look exactly the same on all
computers.”
73
73
Gillies and Cailliau (2000, p.163)
As an information sharing platform, the web was designed as an open system
and Tim Berners-Lee “had long been an admirer of Richard Stallman.”
74
74
Gillies and Cailliau (2000)
Berners-Lee was aware of the Free Software movement and, inspired by the movement, released
the libwww library that implemented the core functions of the web technologies (including HTML
and HTTP) to public domain in 1992. Berners-Lee considered using the GPL license, but opted not
to, in fear that companies such as IBM would not use it.
75
75
Kesan and Shah (2004)
Berners-Lee admired Stallman's idealism, but he was also impressed
by the way he “had harnessed the power of the geeks.”
76
76
Gillies and Cailliau (2000)
Arguably, the strategy proved correct and the number of web developers and users grew steadily.
The shift that made the web truly “world wide” occurred in 1993 when the Mosaic browser,
built at the National Center for Supercomputing Applications (NCSA), made the platform
available to anyone using a Macintosh or Windows computer.
5.1
The rise of the vernacular Web
In the 1990s, the web has escaped the realm of academic information sharing and
has developed a unique amateur culture that computer artist and historian Olia Lialina
documented in her essay
A Vernacular Web
.
77
77
Lialina (2009)
According to Lialina, the early web “was bright, rich, personal, slow and under construction.”
It was “the web of the indigenous... or the barbarians.”
78
78
Lialina (2009, p.19)
This unique culture developed, at least in part, thanks to the openness of the early web
technologies. These were the predecessors of fundamentally the same
technologies that are used on the web today, but they were used in a different way.
Web pages were written in plain HTML (Hypertext Markup Language). Like today, the web browsers
made it possible for users to view the source code of the web page, but as the web pages
were simpler, even amateurs could find their way through the markup.
Scripts that were used for adding interactive elements to the web pages were often embedded directly
in the web page (using the
<script>
tag) or they were included in linked JavaScript files
that the user could locate and inspect. The scripts were distributed in the same form in which they
were written and so an aspiring web creator could study, understand and modify them in the way
envisioned by the Free Software Foundation in the 1980s. As documented by Lialina:
Every element on the page, every line, figure, button and sound was on its own and could easily
be extracted, if not directly from the browser then from looking at the source code to find the
URLs of the files.
79
79
Lialina (2009)
In other words, the early web exhibited dynamic openness. Web pages consisted of different
components (media files, scripts) and the structure of those components was accessible to
the web browser, but also to an interested user of the platform.
As documented by Lialina, this technological structure
enabled the development of the early vernacular web culture:
Consider the way early amateur websites were made. As clumsy as they might appear to trained
professionals, in terms of spreading the Internet’s architecture and culture, they were of huge
importance. In fact, the mental image we have of the medium today: intelligence on the edges of the
network, many-to-many communication, open source (even if it was just about how to use the
<blink>
HTML tag), is the result of these early efforts.
80
80
Lialina and Espenschied (2009)
The decision of Tim Berners-Lee, to represent documents using an accessible markup format,
undoubtedly contributed to the rise of the 1990s web culture.
81
81
Even if the tag to make
text on the web page blink, reportedly conceived in a bar and implemented overnight, was only
added in 1994 (
Montulli, 2009
).
5.2
Openness of the early Web
At this point, it is useful to revisit the difference between the two kinds of openness analysed
in this article. The debate about information sharing (§
4
) was mainly concerned with
human access to information, including source code and documentation. Information hiding started as
a merely organizational decision, but it later gained a technical meaning and evolved into a
programming language mechanism.
82
82
For this example, but also other cases where software
engineering had an effect on programming languages, see the review by
Ryder et al. (2005)
.
The Clu language implemented information hiding through a mechanism called
abstract data
types
,
83
83
Liskov and Zilles (1974)
which ensured that programmers cannot, intentionally or
unintentionally, write code that accesses the hidden state of a component. In other words,
abstract data types hide the internal state of a component from the code that uses the component.
In the context of the web, we are concerned with information available dynamically, while the
server is running and communicating with a web browser. For example, HTML documents that are
sent to the browser make their internal structure accessible. This appears inevitable—how else would
the web browser display the web page—but an alternative format focused on presentation
(such as PDF) can represent a document only as characters and their positions
on the screen, hiding the intent and the structure of the document from the application that displays
it. Furthermore, scripts that made the web interactive were also distributed in human-readable
source code format. They achieved many of their task by calling functions offered by the web
browser and, consequently, the structure and actions of a web page were transparent to the browser.
This architecture had interesting implications for one of the most hated artifacts of the 1990s
web—pop-up ads.
Figures 5–7.
(5) Pop-up advertisement for Netflix DVD rentals, opened in a new web browser-managed window,
opened using
window.open
(from
Niedermeyer (2019)
) (6) An attempt to open pop-up window using
window.open
, blocked by the Chrome
web browser (screenshot by the author). (7) An in-page pop-up ad, created using ordinary HTML elements within the content of the web
page, which is more difficult to detect and block (screenshot by the author).
5.3
Aside: Pop-up windows and ad blocking
The pop-up ad (Figure
5
) was created by Ethan Zuckerman at a web hosting company Tripod.com
in order to dissociate the advertisement from the web page content.
84
84
(
Zuckerman, 2014
)
It relied on the
window.open
function that web browsers provided to scripts running
in the web page. The function could be called to open a new window with the specified content and
with the specified look (e.g., to remove the menu and the tool bar of the browser).
In the early 2000s, most web browsers developed techniques for automatically blocking pop-up ads
(Figure
6
). Thanks to the transparency of the web, this was a relatively
easy task. The web browser only had to block calls to
window.open
, possibly with the
exception of calls directly triggered by some user interaction with the web site such as
clicking a button.
It did not take long for web developers who wanted to serve pop-up ads on their websites to
circumvent the restriction. Rather than opening pop-up ads using the
window.open
function, which is provided and understood by the web browser, web developers re-created the
experience of pop-up ads using the standard HTML elements within the web page itself
(Figure
7
). The behaviour of the web page is no longer transparent
to the web browser, which cannot easily block the advertisement. (Modern ad-blockers
can do so by recognizing specific patterns in the displayed HTML, but this requires a
detailed database of malicious patterns.)
The story of pop-up ads is interesting, because it offers another perspective on the issue of
openness and information sharing in software. The early web sites with pop-up ads exhibited
dynamic openness with respect to the web browser. They exposed information about what
they were doing, which allowed the browser to handle various tasks on behalf of the web page
(such as opening a new browser window), but it also allowed it to prevent certain behavior.
In a commercially-motivated engineering move, developers of ad-supported web pages reimplemented
the functionality provided by the web browser in a way that made it less transparent.
As we will see, this kind of engineering-motivated closing of the web occurs repeatedly in more
recent history of the platform.
5.4
Minification and obfuscation
Following the economic dot-com bubble of the late 1990s, the web started to evolve into what
became labelled as Web 2.0, “a phoenix arising from the ashes of dot-com design.”
85
85
Ankerson (2018)
Web 2.0 was lauded as social, rich and user-driven. Some authors interpret Web 2.0 as primarily
a rhetorical move or a marketing term,
86
86
Allen (2013)
but the new use of the web
also relied on technological innovations developed throughout the late 1990s.
Web pages gradually evolved into interactive web applications, powered by increasingly
complex scripts. Technology known as Ajax made it possible for a web page to
retrieve further data from the server.
As a result of the new developments, the complexity of web applications was growing. They
included more JavaScript code and relied more heavily on the network. At the same time, most
users at the turn of the milenium still connected to the internet over a slow dial-up connection
and so downloading large JavaScript files could slow down the loading of a web page.
To address the issue, Douglas Crockford (later known for popularizing the JSON format) implemented
a tool called JSMin.
87
87
(
Crockford, 2019
)
The tool made JavaScript files smaller by removing
whitespace and comments from the source code. Although the transformation was relatively simple,
it meant that programmers now kept the original version of the source code to themselves
and distributed a less readable minified version of the code. In the ensuing quest for performance,
JavaScript minifiers became more sophisticated and started, for example, replacing longer local variable
names with shorter meaningless names (like
_1
,
_2
and so on).
The development of minification tools was largely motivated by engineering reasons. Their
purpose was to make the growing JavaScript files smaller. But as a side effect, they also made
the web more closed. Viewing the web page source code no longer displayed a version of the
code that the reader could study, understand and modify. In other words, the web lost its dynamic
openness, where a readable source code of the web page was accessible to all users. Making a
web page statically open, by sharing the non-minified source code, became decision that had
to be made consciously and explicitly.
A parallel ideologically motivated move was the development of tools, later known as obfuscators,
which prevented users from viewing the “programming tricks” behind the increasingly complex web
applications. One of the earliest attempts was the Script Encoder developed by Microsoft in
1999.
88
88
Script Encoding was a feature of the Microsoft Script Engine Version 5.0
(
Clinick, 1999
).
An article introducing the tool opens with a catchphrase “Tired
of exposing your Web scripting code to prying eyes?” and then goes on to explain the motivation:
[The popularity of scripting has also] been accelerated [by] the ability to see what
programming tricks others have employed simply by loading a page into Notepad. While this is a
great asset for the beginning script programmer, people who are developing increasingly complex,
script-based applications want to be able to protect their hard work.
Unlike with minification tools, the Script Encoder was built to
protect intellectual property – the announcement talks about “prospective pirates”
and “illegal copying”. Technically, script encoding transformed JavaScript code into an
opaque sequence of characters. The only way to run encoded scripts was to use Internet Explorer 5.0,
which was able to decode them, and so the technology also forced users to adopt Microsoft's web browser.
Script Encoder was soon reverse engineered and its dependence on Internet Explorer 5.0
further limited its applicability, but the desire to hide the source code soon came together with
the desire to reduce file size. More sophisticated minifiers made the source code difficult to
restore because they renamed variables or even compressed (and reconstructed at runtime) the stream
of JavaScript tokens.
89
89
This approach was used by Dean Edwards' Packer (
Akulov, 2025
).
Perhaps because the two goals were served by a technically similar tool, many systems of the
mid-2000s claimed they serve both purposes. The Free JavaScript obfuscator claimed
that it “protects JavaScript code from stealing and shrinks size.”
90
90
CuteSoft.net (2005)
5.5
Web application development
Another issue with the increasingly complex Web 2.0 applications was that they had to be
written in JavaScript. The language became widely used because it was available in most web browsers,
but it was generally regarded as a poor engineering tool. The opening chapter of a book
JavaScript: The Good Parts
91
91
Crockford (2008)
written by the creator of
JSMin, Douglas Crockford, illustrates the common perception (before offering a somewhat more positive
view of the language):
JavaScript is a language with more than its share of bad parts. It went from non-existence
to global adoption in an alarmingly short period of time. It never had an interval in the lab
when it could be tried out and polished. (...) JavaScript's popularity
is almost completely independent of its qualities as a programming language.
Crockford also explains that JavaScript is not the only problem with web application development.
Another issue is the design of the Document Object Model (DOM), an API through which JavaScript
applications control the web page and the browser. The DOM is “quite awful,” as well as ”poorly
specified and inconsistently implemented.”
92
92
Crockford (2008, p.2)
Given this perception of JavaScript and DOM, it is perhaps not a surprise that software engineers,
as well as many academic researchers started to look for better tools.
93
93
Early academic
programming languages that targeted JavaScript included, for example, those by
Cooper (2007)
,
Petricek and Syme (2007)
,
Serrano et al. (2006)
.
One of the first large-scale frameworks that aimed to turn
web application development into proper engineering was the Google Web Toolkit (GWT).
94
94
Google (2006)
The toolkit was created as a web development framework based on the Java programming language.
Programmers would create web applications in Java (instead of JavaScript), using a library of
GWT user interface components (instead of the DOM) and the toolkit would translate their code
to JavaScript, so that it can run in the web browser. The engineering motivation behind the
system can be illustrated by looking at the GWT home page from 2006. It included a typical
critique of the web ecosystem at the time (quoting JavaScript's lack of modularity, browser
quirks and incompatibilities) and outlined a range of engineering benefits of the Java language
as an alternative (advanced development tools, static type checking, object-oriented design).
The Google Web Toolkit emerged as a reasonable engineering response to the challenges posed by Web 2.0
application development. It enabled developers to use a more robust and modular programming
language, provided libraries that hide incompatibilities between web browsers and offered sophisticated
debugging tools (which run the code directly as Java in a special web browser). At the same time,
the translation to JavaScript, alongside with the increasingly complex abstractions, contributed
to the closing of the web. The users could no longer easily locate source code for components of
the web page. The aim of protecting source code from copying was not explicit in the design
of GWT, but it was a side effect of the engineering design choices. The web of the late 2000s
was no longer “the web of the indigenous... or the barbarians.” It was the web of
professional software engineers.
The trend started by JSMin and the Google Web Toolkit continues to the present day. Multiple new
programming languages that aim to improve on JavaScript have emerged, including CoffeeScript, Dart
and, more recently, the widely adopted TypeScript language released by Microsoft in 2012. Most JavaScript code
distributed to the web browser is transformed by a “bundler” such as WebPack that combines
source code from individual modules into a single minified file.
The choice to distribute translated and minified code to the web browsers had multiple consequences.
The fact that users could no longer study and copy code was not a concern for the new class of
professional web developers. However, the choice also made it hard to debug scripts. When an error
occurred, the browser could only display the unreadable minified source code. This fact inspired
the development of Source maps,
95
95
Takikawa et al. (2024)
a standard that describes mapping
of the generated JavaScript code back to the original source code.
This is noteworthy because it shows how an original desirable characteristic of
the open web got lost in a later engineering-motivated technical development, only to be
expensively recovered in the new context.
5.6
From canvas rendering to Web Assembly
Two even more recent developments within the web platform again illustrate the same pattern,
where a desirable characteristic of the open web gets lost as an unintended side-effect
of engineering-motivated technological development. The first development is best illustrated
through the story of Google Docs.
In May 2021, Google announced that it will be changing how Google Docs, their online word processor,
renders documents.
96
96
The original announcement is available from Google's blog
(
Google, 2021
).
Before, the documents created by the users were represented as HTML elements
on the page. As the user edited the document, Google Docs modified the HTML elements through the
DOM interface provided by the web-browser. According to the announcement, this approach was
inefficient and had inconsistent results as different browsers rendered documents slightly
differently. To have more control over rendering of documents, Google instead decided to implement
their own rendering using the
<canvas>
HTML element. This way, the Google Docs
engine would render the document into a bitmap and then display the bitmap on the web page.
This gave Google programmers full control of the rendering process, but it makes the document
entirely opaque to the web browser. Instead of a tree of HTML elements containing the text
written by the user, the browser only sees a single
<canvas>
element.
The announcement raised a number of concerns, the most notable being about accessibility.
97
97
(
MacManus, 2021
)
Screen readers and other accessibility tools rely on the DOM to access the text on the page
or change visual settings. This is no longer possible if all the text exists only in a bitmap.
To recover assistive technologies, Google Docs engineers had to add an option to render the
document as ordinary HTML elements, invisible to the end-user, but accessible to the
screen readers.
At the same time, some engineering-minded commentators saw the move as a step towards
“an app-focused future” of the web where canvas-based rendering “centralizes the power in the
hands of the app.” The openness of the web that used to make it possible to examine the
document structure “may be nothing more than a brief and transient anomaly in the history of
software design.”
98
98
(
MacDonald, 2021
)
In many ways, the development mirrors the earlier temporary move from the open HTML-based
web pages to closed web applications built using the Flash multimedia platform in the 2000s. The
inaccessibility of applications built using Flash was also one of the frequently criticised
aspects of the move.
99
99
Ankerson (2018)
The second recent development is the increasing adoption of Web Assembly, a technology
that was announced in 2015 and became a web standard in 2019.
100
100
(
Rossberg, 2019
)
Web Assembly is a low-level, binary instruction format designed to run high-performance
code in a web browser at a speed on par with native code. Web Assembly aims to replace
JavaScript as the compilation target for compilers that make it possible to run code
written in other languages in the web browser including C/C++. The motivation for Web Assembly
was primarily an engineering one—to be able to run high-performance low-level code
in the web browser and compile existing libraries in languages like C/C++ for the web.
Yet, like many other developments discussed in this section, it contributes to making
the web even more opaque. Instead of seeing JavaScript code you could study, understand
and modify, you will be seeing low-level assembly-like instructions.
101
101
For debugging
purposes, Web Assembly supports source maps, and so developers may see their original
source code in the web browser, but source maps will most likely not be distributed with the
finished web application.
Figure 8.
A web page (talk slides) displayed in the Firefox Web Developer
Tools, showing the HTML structure of the page with the raw text (screenshot by the author).
5.7
Deep and shallow embedding
Many of the engineering decisions in the history of the web can be framed in terms of
embedding
. Practically all software running on a computer is embedded in a
system that exposes services and provides information that the software can use.
A native program or a mobile app runs embedded in an operating system that controls
its access to resources and provides it with services that the application can use,
for example to display a user interface or manage files. In the case of a web applications,
the browser is the system. It provides the object-oriented JavaScript programming
model, access to the document through the DOM and rich rendering capabilities for displaying
text, user interface elements and styling them with CSS.
A web application can choose to leverage as many of those system capabilities, or it may
choose to rely only on a small necessary set of core primitives. An application that uses
shallow embedding
reuses as many system features as possible. This makes the application
legible to the system and, through the system, possibly also to the end-user. For example,
a web application that uses the DOM and CSS for its graphical interface makes the structure
of its interface visible to the system. The web browser can display the structure through
web browser development tools to the end-user (Figure
8
) and the structure
is also accessible to browser extensions such as ad-blockers. Similarly, if a web page uses
the system-provided
window.open
function to open a pop-up window, the behaviour can
be easily recognized by the system and (possibly) blocked.
An application that uses
deep embedding
relies only on minimal set of functions
provided by the system. In the aforementioned case of Google Docs, the developers choose
to rely on canvas-based rendering (that lets them display a bitmap) and re-implement all
the necessary text layout algorithms that are needed to display a document. The Flash
multimedia platform allowed users to run applications within a web browser, but without
leveraging any of the services provided by the browser. Similarly, many compilers
that target JavaScript (or Web Assembly) may ignore much of the object-oriented
programming capabilities provided by JavaScript and produce code that re-implements much
of what the web platform already provides.
102
102
The degree varies depending on the
language. For example, TypeScript intentionally reuses much of JavaScript's programming model,
while the ghcjs compiler for Haskell (
https://github.com/ghcjs/ghcjs
) reimplements
the Haskell semantics including lazy evaluation and the resulting programming model is
very different from the JavaScript one.
As the historical examples discussed in the preceding section show, developers often choose
deep embedding for engineering reasons. Deep embedding provides a greater control of how
the software is developed and how it can operate. Software engineers can use a programming
language with their preferred semantics (different from the JavaScript one), they can
create custom graphical user interfaces (changing the look of a pop-up or a drop-down control),
or they may implement certain functionality more efficiently. However, the cost of deep embedding
is the growing opacity of the resulting software.
103
103
Arguably, software engineers often
think they can do better than the system developers. This may be the case if the system
functionality is more general than the functionality needed by the software engineers in
a more specific case.
The software stops being legible to the system, accessibility tools
and also to the end-users.
Figure 9.
Analysing data with the FsLab extension for Atom. The right panel shows the status
of a cluster running the computation and a resulting chart (from
Petricek (2016)
)
6.
The editor wars of the 2000s
In the previous two sections, we have seen how well-intended engineering decisions contribute
to the closing of software. To see that the two case studies illustrate a common scenario,
it is worth looking at one more example.
In 2015, GitHub released its open-source text and code editor called Atom. The editor was developed
in JavaScript and leveraged the Electron platform to run as cross-platform desktop
application.
104
104
In reality, Atom was built using CoffeeScript, which is a lightweight
programming language that compiles to JavaScript and simplifies its syntax.
Atom was touted as “a hackable text editor for the 21st century”.
105
105
The wording can
still be found in the project repository:
https://github.com/atom/atom
.
The slogan reflects an important design decision in the Atom editor architecture.
The user interface of the editor was based on the web platform and the Electron platform
uses the web browser to display it.
106
106
More specifically, Electron is based on the
Chromium web browser, which is the core version of Google Chrome.
The Atom user interface is represented using the DOM and it is accessible to editor extensions.
This means that any extension can access the user interface and even make changes to it.
The design is fragile as a faulty extension can break the user interface. But the design also
makes the editor flexible. This “hackability” allowed the Atom community
to create extensions that extended and modified the user interface in practically useful
ways, unanticipated by the original Atom developers. For example, the FsLab package
(Figure
9
) extended Atom with data visualization tools capable of loading
large data sets on-demand.
107
107
(
Petricek, 2016
)
Only a year after Atom became available, Microsoft released its own cross-platform open-source text
and code editor project called Visual Studio (VS) Code. Microsoft's editor was also based on
Electron and the web platform. It was written in TypeScript and compiled to JavaScript.
However, its approach to extensibility was very different
from Atom. VS Code was described using a somewhat nondescript tagline “Code Editing.
Redefined,”
108
108
Posted on
https://code.visualstudio.com
in 2015
(
archived
).
The tagline has since been replaced with “The open source AI code editor”.
but a part of its messenging was that it is efficient and reliable.
This was reflected by its approach to extensions:
Extensions are wonderful but extensions can also affect startup performance or the overall
stability of VS Code itself. To avoid these problems, VS Code loads and runs extensions in
a separate process, the extension host process. A misbehaving extension cannot impact VS Code
and in particular its startup time.
109
109
Available from
http://code.visualstudio.com/docs/extensions/our-approach
in 2016
(
archived
).
In other words, VS Code does not allow extension authors to directly manipulate the DOM.
They can only communicate with the editor through an API that provides limited and controlled
access to the editor.
The logic behind the decision follows the one we have repeatedly seen earlier. The more flexible
open design that allows users to modify the software is interpreted as a poor engineering decision
that affects qualities of the software that an engineer may value, such as performance and
stability. An alternative design resolves the engineering issue, but also limits the flexibility
of the system. Being aware of the more open alternative, VS Code users repeatedly ask for
customizations that were doable with a small tweak to a “user stylesheet” or a “user script”
in Atom.
110
110
See the GitHub issue on the topic:
https://github.com/microsoft/vscode/issues/459
.
Many of those customizations
are slowly added to the official VS Code configuration and supported extension API, but the
core design of VS Code remains closed. Even the existence of an open alternative
has thus served as a source of ideas for the closed software system.
In the case of VS Code, managerial decisions combined with engineering decisions to
provide a post-script to the story. Microsoft acquired GitHub in 2018 and despite initial
claims not to do so, discontinued the development of Atom.
111
111
See the post
Sunsetting Atom
, published on the GitHub blog in 2022:
https://github.blog/news-insights/product-news/sunsetting-atom/
7.
Beacons of openness
If the closing of software is the result of engineering and managerial decisions, then
one way through which a more open software could be realised is by using designs that
justify openness not through ideological visions, but through managerial and
engineering reasons.
An engineering argument in favor of openness has been made by Clark and Basman, who
point out that the longevity of the MIDI interface for controlling devices
such as synthsizers or drum machines has largely been due to its
opennness.
112
112
MIDI devices expose their state through semi-conventionalized system
exclusive (SysEx) messages (
Clark and Basman, 2017
).
According to conventional wisdom,
such systems may appear as workarounds or quirks, but a more careful examination reveals
their engineering value.
113
113
Looking at the history of science in order to recover
valuable past ideas that have been forgotten is the aim of the
complementary science
methodology developed by
Chang (2004)
.
7.1
Retrofitting openness
Kell's analysis of Unix systems draws a distinction between “application”
programming and “device” programming.
114
114
(
Kell, 2019
)
In the former,
the program is a binary executable that runs as a process and keeps state in its own memory,
using its own file formats for persistent storage. In the latter, the program is a
collection of shell scripts that manipulate files in human-readable text format.
The two approaches correspond directly to deep and shallow embedding as discussed in this article.
In application programming (deep embedding), the memory structure and file formats are opaque
to the system, other applications and the user. In device programming (shallow embedding), the
state stored in text files can be shared across applications, inspected and even modified by the user.
This openness is, arguably, one of the reasons for the success of the Unix
programming philosophy
115
115
The philosophy, outlined by
McIlroy et al. (1978)
,
includes “make each program do one thing well” and “expect the output of every program to
become the input to another, as yet unknown, program.”
and an engineering reason for
applying the philosophy more broadly.
There are two directions through which software on wide-spread Unix-like systems
(including Linux, Mac and Windows) could become more open. A direction recently outlined by
Jakubovic
116
116
(
Jakubovic, 2025
); an earlier work going in a similar direction
explored the idea of using directories as files (
Wimmer, 2018
)
is to build more programs
on top of the Unix device programming model. His Smalltix project sketches how an object-oriented
programming model could be mapped to Unix device programming, enabling, for example, inspectable and
composable GUIs. The other direction is to make Unix application programming more like device
programming. Kell outlines how this could be done using the Smalltalk-like capabilities
lurking inside Unix.
117
117
Kell (2013)
; one example is the
Dwarf
format for recording debugging information, which can be seen as a lurking Smalltalk metasystem.
He argues for “building a Smalltalk
out of
the fragmented reality of today's Unix systems,
rather than running isolated Smalltalks (...) each trapped
within
a Unix”.
Figure 10.
Change in skills required for different kind of system tailoring.
Some degree of tailoring can be done by learning to change parameters,
but further tailoring requires mastering a programming language (from
MacLean et al. (1990)
)
7.2
Gradual progression
A more managerial reason for open software design motivated research on
tailorable systems
in the 1990s. Because “it is impossible to design systems which are appropriate for all users and
all situations,” the researchers “believe that a useful technique is to have end users tailor
their systems to match their personal work practices.”
118
118
The authors of this quote
(
MacLean et al., 1990
) created a system called Buttons that treated the button as
a shareable self-contained unit used for software customization.
This is illustrated with a diagram (Figure
10
), which shows the steep learning
curves necessary to move from user of an application (Worker) to a person who can change
parameters (Tinkerer) and then to a person who can modify the source code (Programmer).
119
119
A similar
diagram appears in a recent discussion of programming substrates and notations by
Petricek and Jakubovic (2026)
.
An important point, which resonates with a broader discussion about software opacity, is that
supporting tailoring is not merely a technical problem. It also requires “a culture within which users feel
in control of the system and in which tailoring is the norm.”
120
120
MacLean et al. (1990)
Tailorable systems research focused mainly on office environments and more recent and work in the
area uses the term
malleable software
.
Malleable systems typically aim to allow users to modify software through direct manipulation,
from within the software itself, in a way akin to that used in HyperCard.
121
121
Pioneering
work on direct manipulation has been done by (
Shneiderman, 1983
).
Petricek and Jakubovic (2026)
explore the limits to which the “notation for development” can be the same as the “notation
for use”.
The approach has been used, among other areas, to enable users to customize
web sites through direct manipulation of tabular data.
122
122
Litt et al. (2020)
The argument for malleable software as pluralistic infrastructures “which reduce the cost of
collaboration between communities”
123
123
Tchernavskij (2019)
can be made
both on ideological but also on managerial grounds.
8.
Conclusions
Despite the many visions of open software that can be studied, understood and modified,
most software we use today remains opaque. To understand why, I looked at
two historical case studies. The first followed a debate on information sharing,
while the second followed the development of the web platform. The studies show that
decisions regarding software openness are often based on engineering
or managerial arguments. The virtues of open software systems, such as their understandability
and adaptability, are lost in the quest for more efficient, more scalable, or more
maintainable implementation.
There are pockets of resistance to the growing opacity of software. Some of the visions
discussed earlier continue to be actively developed,
124
124
This includes programming systems
derived from Smalltalk, including Squeak (
Ingalls et al., 1997
), which served as the platform
for the development of babylonian programming (
Rauch et al., 2019
), and
Glamorous Toolkit with the vision of moldable development tools (
Chiş et al., 2015
).
while new research on malleable software attempts to make software more open and
adaptable. Another perspective on software that has the potential to counter the growing
opacity is the vision of convivial software, inspired by the work of the philosopher Ivan
Illich,
125
125
Illich (1973)
that strikes the “balance between individual
freedom to act and collective freedom from domination”.
126
126
Kell (2020)
Stephen Kell identified a number of design heuristics that would lead to a more open,
convivial software systems.
127
127
Kell (2020)
A number of decisions that we encountered can be framed as a shift
from shallow embedding (software delegates work to a system within which it
runs) to deep embedding (software reimplements system's functionality).
An interesting question is, what technical or social reasons may prevent such shifts.
I see two possible answers. First, deep embedding is often more costly to develop.
Many of the developments that we have seen came from large organizations (Google developed
the Google Web Toolkit and used canvas-based rendering for their Google Docs, while
TypeScript has been built by Microsoft).
Smaller software projects are unlikely to have the resources to reimplement
complex logic provided by the system and are thus more likely to use shallow embedding.
Second, deep embedding may be discouraged by certain community culture or a company policy.
As pointed out by Kell,
128
128
Kell (2020)
“many of the supposedly technical principles of programming are as much a cultural matter
as a technical one” and software opacity is no different.
Engineering and managerial decisions currently dominate
the decision making that affects software opacity and, arguably, most other aspects of
software design. If we want software that “we can control, instead of it controlling
us,”
129
129
Paraphrased from the Free Software bulletin article by
Stallman (1986)
.
we need a conceptual framework for making design decisions about software that does
not favor engineering and managerial decision.
Notes
1
A typical
situation with online services and apps including, for example, social networks and AI chatbots.
2
In case of open-source software such
as the Linux operating system, the Firefox web browser or the LibreOffice office suite.
6
His thesis
On the Mode of Existence of Technical Objects
was published
in French in 1958, but the first official English translation only appeared in 2017
(
Simondon, 2017
).
9
This particular wording is from the “What is Free Software?” page
published on the GNU website in 1997 (
Free Software Foundation, 1997
), but similar ideas already appear
in the first bulletin of the Free Software Foundation (
Stallman, 1986
).
11
Frabetti (2014)
adopts the term used
by
Stiegler (1998)
who maintains that “we do not immediately understand what
is being played out in technics (...) even though we unceasingly have to make decisions regarding
technics the consequences of which are felt to escape us more and more.”
14
The book edited by
Fuller (2008)
introduces the field;
specific approaches include critical code studies (
Marino, 2020
), studies of
singular artifacts such as a BASIC one-liner interrogated by
Montfort et al. (2012)
or rethinking of the history and origins of software (
Sack, 2019
).
18
This idea was illustrated in an article presenting Smalltalk
in the 1981 issue of the BYTE magazine (
Reenskaug, 1981
).
19
Although the iPad has the form-factor of the Dynabook that Alan Kay envisioned in
the 1970s, Kay criticised its closed nature arguing that iPad “could not be farther from the
original intention” (
Greelish, 2013
).
21
The issues with
deployment have been listed as one of the possible reasons
for the demise of Smalltalk (
Bracha, 2020
).
22
This common narrative has been questioned by
Rankin (2018)
,
who points out that access to microcomputers was still limited to an elite group and that
there were other computer networks based on time-sharing systems at the same time.
23
Advertised as “computer on a chip”.
24
The term “1977 trinity” only appeared in later written
retrospectives. A detailed account of the history of microcomputers has been written by
Haigh and Ceruzzi (2021)
.
26
Inspired by
the complementary science methodology (
Chang, 2004
), the web-based
Commodore 64 BASIC reconstruction (
https://tomasp.net/commodore64
) documents interesting
ways of working of the system that have been lost.
32
Writing in 1945, Bush imagined the documents would be stored on microfilms.
33
For commercial distribution, it was also possible to lock and password-protect
HyperCard stacks to disable editing, but many stacks were available unlocked and unprotected.
35
Regulations such as GDPR can thus be seen as
requiring a minimal degree of openness of software.
36
As pointed out by
Kell (2019)
, if an application is compiled with
suitable debugging information, it should still be possible to reconstruct its structure.
37
For an overview of the history of the IBM System/360 project, see the
article by
Cortada (2019)
.
45
On the
criteria to be used in decomposing systems into modules
(
Parnas, 1972
) and
A technique for software module specification with examples
(
Parnas, 1972
)
81
Even if the tag to make
text on the web page blink, reportedly conceived in a bar and implemented overnight, was only
added in 1994 (
Montulli, 2009
).
82
For this example, but also other cases where software
engineering had an effect on programming languages, see the review by
Ryder et al. (2005)
.
101
For debugging
purposes, Web Assembly supports source maps, and so developers may see their original
source code in the web browser, but source maps will most likely not be distributed with the
finished web application.
102
The degree varies depending on the
language. For example, TypeScript intentionally reuses much of JavaScript's programming model,
while the ghcjs compiler for Haskell (
https://github.com/ghcjs/ghcjs
) reimplements
the Haskell semantics including lazy evaluation and the resulting programming model is
very different from the JavaScript one.
103
Arguably, software engineers often
think they can do better than the system developers. This may be the case if the system
functionality is more general than the functionality needed by the software engineers in
a more specific case.
104
In reality, Atom was built using CoffeeScript, which is a lightweight
programming language that compiles to JavaScript and simplifies its syntax.
112
MIDI devices expose their state through semi-conventionalized system
exclusive (SysEx) messages (
Clark and Basman, 2017
).
113
Looking at the history of science in order to recover
valuable past ideas that have been forgotten is the aim of the
complementary science
methodology developed by
Chang (2004)
.
115
The philosophy, outlined by
McIlroy et al. (1978)
,
includes “make each program do one thing well” and “expect the output of every program to
become the input to another, as yet unknown, program.”
116
(
Jakubovic, 2025
); an earlier work going in a similar direction
explored the idea of using directories as files (
Wimmer, 2018
)
117
Kell (2013)
; one example is the
Dwarf
format for recording debugging information, which can be seen as a lurking Smalltalk metasystem.
118
The authors of this quote
(
MacLean et al., 1990
) created a system called Buttons that treated the button as
a shareable self-contained unit used for software customization.
119
A similar
diagram appears in a recent discussion of programming substrates and notations by
Petricek and Jakubovic (2026)
.
121
Pioneering
work on direct manipulation has been done by (
Shneiderman, 1983
).
Petricek and Jakubovic (2026)
explore the limits to which the “notation for development” can be the same as the “notation
for use”.
124
This includes programming systems
derived from Smalltalk, including Squeak (
Ingalls et al., 1997
), which served as the platform
for the development of babylonian programming (
Rauch et al., 2019
), and
Glamorous Toolkit with the vision of moldable development tools (
Chiş et al., 2015
).
Matthew Allen.
What was Web 2.0? Versions as the dominant mode of internet history.
New Media & Society, 15 (2), pages 260-275. 2013. doi
10.1177/1461444812451567
Megan Sapnar Ankerson.
Dot-com design: The rise of a usable, social, commercial web.
New York University Press. 2018. 9781479892907
Hasok Chang.
Inventing Temperature: Measurement and Scientific Progress.
Oxford University Press, Oxford. 2004. 9780195171273
Andrei Chiş, Oscar Nierstrasz, Tudor Gîrba.
Towards moldable development tools.
In Proceedings of the 6th Workshop on Evaluation and Usability of Programming Languages and Tools (PLATEAU 2015), pages 25–26, New York, NY, USA. 2015. Association for Computing Machinery, ISBN 9781450339070, doi
10.1145/2846680.2846684
Kasper Galschiøt Simon
and Markus Antranig
and Bates Colin
and Basman Clark.
Enabling Architecture: How the GPII Supports Inclusive Software Development.
In Stephanidis, Constantine
and Antona, Margherita, editor, Universal Access in Human-Computer Interaction. Design for All and Accessibility Practice, pages 368–377, Cham. 2014. Springer International Publishing, ISBN 978-3-319-07509-9
Colin Clark, Antranig Basman.
Tracing a Paradigm for Externalization: Avatars and the GPII Nexus.
In Companion Proceedings of the 1st International Conference on the Art, Science, and Engineering of Programming, New York, NY, USA. 2017. ACM, ISBN 9781450348362, doi
10.1145/3079368.3079410
Jeremy Philip
and Yallop Sam
and Wadler Ezra
and Lindley Cooper.
Links: Web Programming Without Tiers.
In de Boer, Frank S.
and Bonsangue, Marcello M.
and Graf, Susanne
and de Roever, Willem-Paul, editor, Formal Methods for Components and Objects, pages 266–296, Berlin, Heidelberg. 2007. Springer Berlin Heidelberg, ISBN 978-3-540-74792-5
Edsger W. Dijkstra.
The structure of the “THE”-multiprogramming system.
In Proceedings of the First ACM Symposium on Operating System Principles (SOSP '67), pages 10.1–10.6, New York, NY, USA. 1967. Association for Computing Machinery, ISBN 9781450373708, doi
10.1145/800001.811672
Rudresh Dwivedi, Devam Dave, Het Naik, Smiti Singhal, Rana Omer, Pankesh Patel, Bin Qian, Zhenyu Wen, Tejal Shah, Graham Morgan, Rajiv Ranjan.
Explainable AI (XAI): Core Ideas, Techniques, and Solutions.
ACM Comput. Surv., 55 (9). 2023. doi
10.1145/3561048
, Association for Computing Machinery, New York, NY, USA
Federica Frabetti.
Software Theory: A Cultural and Philosophical Study.
Rowman & Littlefield International, London. 2014. 978-1783481965
Thomas Haigh, Paul E. Ceruzzi.
A New History of Modern Computing.
MIT Press, Cambridge, MA. 2021. 978-0262542906
Ivan Illich.
Tools for Conviviality.
Harper & Row, New York. 1973. 9780060121389
Dan Ingalls, Ted Kaehler, John Maloney, Scott Wallace, Alan Kay.
Back to the future: the story of Squeak, a practical Smalltalk written in itself.
In Proceedings of the 12th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA '97), pages 318–326, New York, NY, USA. 1997. Association for Computing Machinery, ISBN 0897919084, doi
10.1145/263698.263754
Joel Jakubovic.
The Unix Executable as a Smalltalk Method: And Its Implications for Unix-Smalltalk Unification.
In Proceedings of the 2025 ACM SIGPLAN International Symposium on New Ideas, New Paradigms, and Reflections on Programming and Software (Onward! '25), pages 227–242, New York, NY, USA. 2025. Association for Computing Machinery, ISBN 9798400721519, doi
10.1145/3759429.3762633
Joel Jakubovic, Jonathan Edwards, Tomas Petricek.
Technical Dimensions of Programming Systems.
The Art, Science, and Engineering of Programming, 7 (3), pages 13:1–13:59. 2023. doi
10.22152/programming-journal.org/2023/7/13
Alan C. Kay.
The Early History of Smalltalk.
In The Second ACM SIGPLAN Conference on History of Programming Languages (HOPL-II), pages 69–95, New York, NY, USA. 1993. Association for Computing Machinery, ISBN 0-89791-570-4, doi
10.1145/154766.155364
A. Kay, A. Goldberg.
Personal Dynamic Media.
Computer, 10 (3), pages 31-41. 1977. doi
10.1109/C-M.1977.217672
Stephen Kell.
The operating system: should there be one?
In Proceedings of the Seventh Workshop on Programming Languages and Operating Systems (PLOS '13), New York, NY, USA. 2013. Association for Computing Machinery, ISBN 9781450324601, doi
10.1145/2525528.2525534
Stephen Kell.
Unix, Plan 9 and the Lurking Smalltalk.
In Liesbeth De Mol and Giuseppe Primiero, editor, Reflections on Programming Systems: Historical and Philosophical Aspects, pages 189–213, Cham, Switzerland. 2019. Springer International Publishing, ISBN 978-3-319-97225-1, doi
10.1007/978-3-319-97226-8_10
Stephen Kell.
Convivial design heuristics for software systems.
In Companion Proceedings of the 4th International Conference on Art, Science, and Engineering of Programming (Programming '20), pages 144–148, New York, NY, USA. 2020. Association for Computing Machinery, ISBN 9781450375078, doi
10.1145/3397537.3397543
Jay P. Kesan, Rajiv C. Shah.
Deconstructing Code.
Yale Journal of Law & Technology, 6, pages 277–389. 2004.
Steven Levy.
Hackers: Heroes of the Computer Revolution.
Anchor Press / Doubleday, Garden City, NY. 1984. 0-385-19195-2
Olia Lialina.
A Vernacular Web.
In Olia Lialina, editor, Digital Folklore Reader, pages 19–35. 2009. merz & solitude, ISBN 978-3937982250. First published online in February 2005.
Olia Lialina, Dragan Espenschied.
Do You Believe in Users?
In Olia Lialina, editor, Digital Folklore Reader, pages 9–12. 2009. merz & solitude, ISBN 978-3937982250
Barbara Liskov, Stephen Zilles.
Programming with Abstract Data Types.
In Proceedings of the ACM SIGPLAN Symposium on Very High Level Languages, pages 50–59, New York, NY, USA. 1974. ACM, doi
10.1145/800233.807045
Geoffrey Litt, Daniel Jackson, Tyler Millis, Jessica Quaye.
End-user software customization by direct manipulation of tabular data.
In Proceedings of the 2020 ACM SIGPLAN International Symposium on New Ideas, New Paradigms, and Reflections on Programming and Software (Onward! 2020), pages 18–33, New York, NY, USA. 2020. Association for Computing Machinery, ISBN 9781450381789, doi
10.1145/3426428.3426914
Allan MacLean, Kathleen Carter, Lennart Lövstrand, Thomas Moran.
User-tailorable systems: pressing the issues with buttons.
In Proceedings of the SIGCHI Conference on Human Factors in Computing Systems (CHI '90), pages 175–182, New York, NY, USA. 1990. Association for Computing Machinery, ISBN 0201509326, doi
10.1145/97243.97271
Mark C. Marino.
Critical Code Studies.
The MIT Press, Cambridge, MA. 2020. 9780262539739
Doug McIlroy, E. N. Pinson, B. A. Tague.
Unix Time-Sharing System: Foreword.
The Bell System Technical Journal, 57 (6), pages 1899–1904. 1978. AT&T
Nick Montfort, Patsy Baudoin, John Bell, Ian Bogost, Jeremy Douglass, Mark C. Marino, Michael Mateas, Casey Reas, Mark Sample, Noah Vawter.
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
.
The MIT Press, Cambridge, MA. 2012. 9780262305501
Laine Nooney.
The Apple II Age: How the Computer Became Personal.
University of Chicago Press, Chicago. 2023. 978-0226816524
David Lorge Parnas.
Information Distribution Aspects of Design Methodology.
In Charles V. Freiman and
John E. Griffith and
Jack L. Rosenfeld, editor, Information Processing, Proceedings of IFIP Congress 1971, Volume
1 - Foundations and Systems, Ljubljana, Yugoslavia,
1971, pages 339–344. 1971. North-Holland
D. L. Parnas.
A technique for software module specification with examples.
Commun. ACM, 15 (5), pages 330–336. 1972. doi
10.1145/355602.361309
, Association for Computing Machinery, New York, NY, USA
D. L. Parnas.
On the criteria to be used in decomposing systems into modules.
Communications of the ACM, 15 (12), pages 1053–1058. 1972. doi
10.1145/361598.361623
, Association for Computing Machinery, New York, NY, USA
David L. Parnas.
The Secret History of Information Hiding.
In Broy, Manfred and Denert, Ernst, editor, Software Pioneers: Contributions to Software Engineering, pages 398–409, Berlin, Heidelberg. 2002. Springer, ISBN 978-3-642-59412-0, doi
10.1007/978-3-642-59412-0_25
Tomas Petricek.
Cultures of Programming: The Development of Programming Concepts and Methodologies.
Cambridge University Press. 2025. 9781009492379
Tomas Petricek, Joel Jakubovic.
On the Limits of Making Programming Easy.
In Dominic Orchard and Tomas Petricek and Jeremy Singer, editor, Languages, Compilers, Analysis - From Beautiful Theory to
Useful Practice - Essays Dedicated to Alan Mycroft on the
Occasion of His Retirement (Lecture Notes in Computer Science), pages 215–233. 2026. Springer, doi
10.1007/978-3-032-08187-2_11
Naveen Raman, Minxuan Cao, Yulia Tsvetkov, Christian Kästner, Bogdan Vasilescu.
Stress and burnout in open source: toward finding, understanding, and mitigating unhealthy interactions.
In Proceedings of the ACM/IEEE 42nd International Conference on Software Engineering: New Ideas and Emerging Results (ICSE-NIER'20), pages 57–60, USA. 2020. ACM, ISBN 9781450371261, doi
10.1145/3377816.3381732
Joy Lisi Rankin.
A People's History of Computing in the United States.
Harvard University Press, Cambridge, MA. 2018. 9780674970977
David Rauch, Patrick Rein, Stefan Ramson, Jens Lincke, Robert Hirschfeld.
Babylonian-style Programming: Design and Implementation of an Integration of Live Examples Into General-purpose Source Code.
The Art, Science, and Engineering of Programming, 3 (3), pages 9. 2019. doi
10.22152/programming-journal.org/2019/3/9
Trygve M. H. Reenskaug.
User-oriented descriptions of Smalltalk systems.
Byte, 6 (8), pages 148–166. 1981.
Andreas Rossberg.
WebAssembly Core Specification.
Technical Report, World Wide Web Consortium (W3C). 2019. Online:
https://www.w3.org/TR/wasm-core-1/
Barbara G. Ryder, Mary Lou Soffa, Margaret Burnett.
The Impact of Software Engineering Research on Modern Progamming Languages.
ACM Trans. Softw. Eng. Methodol., 14 (4), pages 431–477. 2005. doi
10.1145/1101815.1101818
, ACM, New York, NY, USA
Warren Sack.
The Software Arts.
MIT Press, Cambridge, MA. 2019. 9780262039703
Lorraine Jan Marco
and Morgan Joseph
and Leimeister Kieran
and Feller Daniel
and Conboy Schlagwein.
“Openness” with and without Information Technology: a framework and a brief history.
Journal of Information Technology, 32 (4), pages 297-305. 2017. doi
10.1057/s41265-017-0049-3
Manuel Serrano, Erick Gallesio, Florian Loitsch.
Hop: a language for programming the web 2.0.
In OOPSLA companion, pages 975–985. 2006.
Ben Shneiderman.
Direct Manipulation: A Step Beyond Programming Languages.
Computer, 16 (8), pages 57–69. 1983. doi
10.1109/MC.1983.1654471
, IEEE Computer Society
Gilbert Simondon.
On the Mode of Existence of Technical Objects.
Univocal Publishing, Minneapolis, MN. 2017. 9781937561442. Translated by Cecile Malaspina and John Rogove
Richard M. Stallman.
EMACS the extensible, customizable self-documenting display editor.
SIGPLAN Not., 16 (6), pages 147–156. 1981. doi
10.1145/872730.806466
, Association for Computing Machinery, New York, NY, USA
Richard M. Stallman.
What is the Free Software Foundation?
GNU's Bulletin, 1 (1), pages 8–9. 1986. Free Software Foundation.
https://www.gnu.org/bulletins/bull1.txt
Guy L. Steele, Richard P. Gabriel.
The evolution of Lisp.
In History of Programming Languages—II, pages 233–330, NY, USA. 1996. Association for Computing Machinery, ISBN 0201895021, doi
10.1145/234286.1057818
Bernard Stiegler.
Technics and Time, 1: The Fault of Epimetheus.
Stanford University Press, Stanford, CA, USA. 1998. 978-0-8047-3163-3. Translated by Richard Beardsworth and George Collins
Asumu Takikawa, Victor Porof, John Lenz, Nick Fitzgerald.
Source Map Format Specification.
Technical Report ECMA-426, Ecma International. 2024.
https://tc39.es/ecma426/2024/
Philip Tchernavskij.
Designing and Programming Malleable Software.
PhD thesis, Université Paris-Saclay. 2019.
Linus Torvalds, David Diamond.
Just for Fun: The Story of an Accidental Revolutionary.
HarperCollins, New York. 2001. 978-0066620732
Christopher Tozzi.
For Fun and Profit: A History of the Free and Open Source Software Revolution.
The MIT Press, Cambridge, MA. 2017. 9780262036474
Raphael Wimmer.
Files as directories: some thoughts on accessing structured data within files.
In Companion Proceedings of the 2nd International Conference on the Art, Science, and Engineering of Programming (Programming '18), pages 166–170, New York, NY, USA. 2018. Association for Computing Machinery, ISBN 9781450355131, doi
10.1145/3191697.3214323
A. A diSessa, H. Abelson.
Boxer: a reconstructible computational medium.
Commun. ACM, 29 (9), pages 859–868. 1986. doi
10.1145/6592.6595
, Association for Computing Machinery, New York, NY, USA
SLAC researchers find proof of altermagnetism, a new magnetic phase
The team directly observed a unique property in an altermagnetic candidate material, delivering key evidence of a new phase of magnetism first postulated in 2022.
The scientific case for a third type of magnetism – termed “altermagnetism” – has been building over recent years.
Now, a SLAC-led team has experimentally proven that a material exhibits characteristics that are theoretically impossible to explain without altermagnetism.
Altermagnetic materials could be used to design advanced electronics, with applications including quantum technologies, memory devices and data centers.
For decades, physicists recognized only two types of magnetism that occur in materials without external influence: ferromagnetism and antiferromagnetism. Today, in findings
published in
Science
, a team led by the U.S. Department of Energy's
SLAC National Accelerator Laboratory
has delivered conclusive experimental proof of a third magnetic phase called altermagnetism.
“In the past few years, scientists have observed phenomena that don't fit neatly into the ferromagnetism-antiferromagnetism dichotomy,” explained lead author
Daniel Jost
, associate scientist at SLAC and
Stanford Institute for Materials and Energy Sciences
. “Researchers have been compiling evidence of a third type of magnetism that bridges the qualities of these two classes. We believe our results provide robust experimental confirmation that this third phase – altermagnetism – is real.”
Building on previous studies, this research confirmed that manganese telluride (MnTe) is an altermagnet – a new class of magnet that exhibits properties of both ferromagnetism and antiferromagnetism. Their results showed direct experimental evidence of chirality – an asymmetric magnetic structure, akin to a spiral staircase or a screw – in the spins of an altermagnetic candidate material.
Identifying these unique materials could allow researchers to manipulate their properties in ways that make them ideal candidates for advanced electronics, with applications including quantum technologies, memory devices and data centers.
A primer on magnetism
To most of us, magnetism is a tangible force: It’s what holds a child's artwork to a refrigerator door and points a compass needle north. But to a physicist, magnetism is more complex. It’s a quantum property of a material, and not all magnetic materials have a directly observable magnetic effect.
In physics, a material is considered magnetic if its electrons’ spins – their internal angular momentum, which can be either “up” or “down” – are polarized, or ordered in a specific pattern.
In ferromagnets, all electronic spins point the same direction (up-up-up or down-down-down), creating an observable magnetic field. Humans have known about and made use of this class of magnets since ancient times. In 1933, scientists discovered another type of material with polarized spins. Antiferromagnets have alternating electronic spins (up-down-up-down) that cancel each other out, producing no net magnetic effect.
A new type of magnetism?
For nearly 90 years, this two-category system dominated our understanding of magnetism.
But in recent years, researchers have noticed that some materials don’t fit neatly into either category. Certain materials seemed to exhibit features of both antiferromagnetism, such as alternating spin configuration with no net magnetization,
and
ferromagnetism, such as the ability to use
spin currents
. These behaviors were once thought to be mutually exclusive.
In 2022,
researchers proposed
the term “altermagnets” to label this wily class of materials.
We believe our results provide robust experimental confirmation that this third phase – altermagnetism – is real.
Associate Scientist at SLAC and Stanford Institute for Materials and Energy Sciences
To explain this behavior, researchers postulated that altermagnets exhibit an alternating spin polarization (up-down-up-down), much like conventional antiferromagnets, but with a crucial twist: the crystal lattice structure surrounding the “up” spins is rotated relative to the lattice surrounding the “down” spins. This geometric twist is a break in symmetry that could give rise to their unusual behavior.
Chirality: the final piece of the puzzle
“By 2024, there were some factors that spoke strongly in favor of altermagnetism being real,” Jost said, “but there was still a missing piece to the puzzle.”
That missing piece was experimental evidence of chirality in an altermagnetic candidate material. Chirality, often referred to as “handedness,” means a material cannot be superimposed on a mirror image of itself, just like a left hand cannot fit into a right-handed glove.
Chirality offers a clever way to distinguish subtle, quantum-level differences between antiferromagnets and suspected altermagnets: While an altermagnetic material would have alternating spins (up-down-up-down) like an antiferromagnet, the geometric twists in its lattice would give the material’s electronic and magnetic structure a distinct handedness that conventional antiferromagnets lack.
Jost’s team chose to investigate chirality in MnTe – a material considered antiferromagnetic for decades until a few years ago when it was suspected to be altermagnetic. The team brought it to the European Synchrotron Radiation Facility (ESRF) in France, to a beamline known for its ability to generate highly controlled polarized X-ray beams.
“Chiral materials scatter left-handed polarized X-ray beams differently than they do right-handed beams,” explained Jost. “Non-chiral materials would scatter each beam of light the same way.”
By scattering circularly polarized X-rays from the material and comparing how it responded to left- versus right-handed light, they teased out a clear chiral signal that shouldn’t exist in a conventional antiferromagnet.
“This chiral signature gave us the solid experimental ground to say altermagnetism stands in a class of its own,” Jost said. The initial experiment was completed in 2024; the team repeated their experiment in early 2025, confirming their earlier results.
“This technique helped us confirm that manganese telluride was really exhibiting altermagnetic properties,” said Rachel Nickel, postdoctoral scientist with ESRF, a co-author who helped design and conduct the experiment on the ID32 beamline. “Altermagnetism was only proposed a few years ago, and the rapid progress in confirming these models is incredible.”
Rachel Nickel, a postdoctoral fellow at the European Synchrotron Radiation Facility in France, is part of the team that observed direct evidence of a new class of magnetism called altermagnetism.
(ESRF/Stef Candé)
Altermagnetism in the real world
This discovery has big implications for the field of spintronics, where researchers are leveraging the polarized spin of magnetic materials to design next-generation electronics.
Where traditional computing technologies use only an electron’s charge to store and move information, spintronics takes advantage of both an electron’s charge and its spin, giving researchers an additional control knob. Spintronic devices have the potential to be faster, be more robust and significantly decrease power consumption in computing and data centers.
Researchers have had some success with spintronic devices, but that success has been limited by the nature of ferro- and antiferromagnetism.
“Ferromagnets are too easily influenced by magnetic fields,” Jost explained. “If you have a permanent magnet in your pocket and walk by a spintronic device built with ferromagnets, you could start flipping the bits, scrambling the information stored there. Antiferromagnets fix that problem, but they are practically invisible – so you can’t easily read the data stored in them or use them to drive efficient spin currents.”
“Altermagnets combine the best of both,” Jost said. “They have zero net magnetization, so they're stable, but they still have the capability to generate spin-polarized currents needed to easily extract information. That gives you an additional degree of freedom to work with.”
Future research will explore how altermagnetic states can be influenced and controlled using light and electricity to enhance their usefulness in spintronic solutions for quantum technologies, memory devices and data centers.
This research is supported in part by the DOE Office of Science.
SLAC National Accelerator Laboratory explores how the universe works at the biggest, smallest and fastest scales and invents powerful tools used by researchers around the globe. As world leaders in ultrafast science and bold explorers of the physics of the universe, we forge new ground in understanding our origins and building a healthier and more sustainable future. Our
discovery and innovation
help develop new materials and chemical processes and open unprecedented views of the cosmos and life’s most delicate machinery. Building on more than 60 years of visionary research, we help shape the future by advancing areas such as quantum technology, scientific computing and the development of next-generation accelerators.
SLAC is operated by Stanford University for the U.S. Department of Energy’s
Office of Science
. The Office of Science is the single largest supporter of basic research in the physical sciences in the United States and is working to address some of the most pressing challenges of our time.
Dig Deeper
Related stories
News Release
The candidate orbits our sun beyond Pluto, and may be among the largest and brightest objects discovered in this region of the solar system.
Feature
The machine learning program SPINE has become a backbone of neutrino experiments worldwide, decoding complex detector images to help scientists unlock the secrets of...
News Brief
Star formation populates this image of the Seagull Nebula taken in Fall 2024 by Rubin Observatory’s engineering test camera.
News Release
The candidate orbits our sun beyond Pluto, and may be among the largest and brightest objects discovered in this region of the solar system.
Feature
The machine learning program SPINE has become a backbone of neutrino experiments worldwide, decoding complex detector images to help scientists unlock the secrets of...
News Brief
Star formation populates this image of the Seagull Nebula taken in Fall 2024 by Rubin Observatory’s engineering test camera.
News Release
The LUX-ZEPLIN experiment observed a particle interaction that could be interpreted as a signal from WIMPs, a dark matter candidate – but researchers will...
News Brief
The deep-underground experiment could produce early-scientific results in the search for one of nature’s most elusive substances even, before reaching optimal sensitivity when the...
News Brief
A new NSF–DOE Vera C. Rubin Observatory image featuring hundreds of thousands of distant galaxies in and around the COSMOS field marks the Observatory’s...
Can’t fish Ethernet? Use “invisible” fiber instead
My family owns a NYC townhouse, and with that I had Cat6 cables put in on each floor.
However, more recently, one of the Cat6 cables has gone “bad,” meaning it only does 100 Mbps. While we are nowhere close to Gigabit speeds, very less multi-Gig (despite me having had symmetric Gigabit in the past), it’s still not something I’m happy about.
What do you mean
only
100 Mbps? My switch and AP support 2.5 Gbps.
The most common approaches in my scenario are:
Fish a new cable
Abandon the cable and use wireless mesh
However, there are a few issues:
The cables were fished in a funky way, and considering how clumsy I am I don’t want to cause more damage
Our walls are
thick
, meaning wireless mesh would suck
When I did use mesh on HPE AP25s (the APs I use), the performance was 120 Mbps at two prior homes, that with thin walls
and
fiber. I also want VLAN segmentation so a typical consumer Eero or Orbi won’t work.
So what did I do? “Invisible” fiber between two floors.
In case you didn’t know, there are special types of fiber cables originally designed for apartment retrofits. This is to avoid landlord/HOA complaints. Our prior place had Verizon Fios via these cables in the hallway.
But these cables are also sold on Amazon and AliExpress for people who’re in rentals or don’t want to fish cables.
So how did I do it?
Galore, the endpoints of my 20m/60ft ‘fiber in the home’ loop.
Switch
While there are SFP+ switches, I already had an unused MikroTik CRS304-4XG-IN, so I just used it here. It’s technically copper 10G, but I’d lose more by trading it for a SFP+ switch so I’ll just keep it. Not to mention copper SFP+s get
hot
.
The SFP+s use the same SC connector used in PON networks, but otherwise use Active Ethernet. I’m not sure if they’re using IEEE standards or are proprietary on the glass, but I’ll assume the latter.
While there’s copper on the media converters, the other option would be to replace our switch which I’ve mentioned is not the best idea.
The Fiber
While the fiber can (and is designed to) be superglued, I chose to use the included adhesive instead. Why? In case I ever have to remove it, which has happened before.
That’s the same reason why I did the basement AP25 using command strips when everyone else just drills the mount.
While
our fiber
is UPC, our transceivers support both SC fiber types.
Conclusion
If I look at the Instant On portal, I’m posting this from my MacBook connected to the new ‘fiber in the home’ loop (via an HPE AP25).
While we currently lack fiber-to-the-home (Mamdani, please fix Fios rights of way!), I’m still happy I could DIY a fix for a Cat6 cable with bad pairs.
In fact, while I don’t have multi-Gig I could still get a respectable ~300 Mbps:
So yes, even if you don’t have fiber
to
the home, fiber is still useful
in
a home network. As it saved me from having to hire a contractor and possibly tear our walls. Not to mention a $1500 Samsung TV is on the wall the “defective” Cat6 cable is behind.
Chinese hackers use ARTEX AI in automated attacks against 200 orgs
Bleeping Computer
www.bleepingcomputer.com
2026-11-02 16:40:14
Chinese hackers used ARTEX, an open-source, multi-agent AI penetration-testing framework, in attacks against more than 200 organizations across 14 countries. [...]...
Chinese hackers used ARTEX, an open-source, multi-agent AI penetration-testing framework, in attacks against more than 200 organizations across 14 countries.
The operation began on October 17 and targeted government ministries, telecommunications providers, and organizations in the pharmaceutical, semiconductor, defense, nuclear, and financial sectors.
The threat actor compromised at least nine organizations and carried out password spraying attacks and credential scanning activity against at least 12 other high-value targets.
According to researchers at CrowdStrike, the "campaign marks an escalation in China-nexus use of AI agents, from single intrusions to multiple simultaneous engagements directed by a human operator."
Confirmed victims include telecommunications providers in the United States and Belgium, government organizations in Greece, the Middle East, and Latin America, and pharmaceutical firms in the U.S.
The researchers track the threat actor as Vapor Panda and say that in the attack against the Greek government entity, the AI agents forged an administrator token and read mailboxes by leveraging authentication keys from a 2022 mail-server directory export.
ARTEX AI is a penetration testing suite developed by Chinese developers and initially released as an open-source project. However, its creators later made it proprietary after it was used in real-world attacks, including a
campaign against South Korean financial institutions
.
In its most recent cyberespionage operation, Vapor Panda also used DeepSeek and a second, unidentified commercial language model to coordinate planning and worker agents across multiple intrusions simultaneously.
CrowdStrike says
the attackers issued instructions in Chinese and intervened at critical points where decisions needed to be made.
The AI agents performed reconnaissance, exploited vulnerabilities, deployed web shells, obtained credentials, and pursued alternative attack paths when needed.
The operators explicitly instructed the agents to skip Windows machines protected by Falcon, CrowdStrike's solution for endpoint protection, and focused on unprotected hosts.
In one intrusion, the AI agents consumed more than 1.4 billion input tokens, the researchers believe.
CrowdStrike also found that the threat actor deployed BLOODALCHEMY, a backdoor active since 2023, against government entities in Latin America and the Middle East.
More ARTEX AI cases emerge
The Dutch Institute for Vulnerability Disclosure (DIVD) has shared more details about the cyberattack it
suffered in September 2026
, which it attributed to an AI agent.
According to its latest update, the tool used in the attack on its network was ARTEX AI, which acted autonomously.
The agent performed numerous tasks simultaneously, including reading a compromised mailbox, scanning the internal network, extracting login tokens, and attempting password resets.
DIVD recorded over 450,000 requests and 2,500 scripts connected to the attack, describing the activity as “super loud and messy.”
BYD
sold over 300,000 electric vehicles in October, a new record and more than the US managed in the entire third quarter.
BYD October EV sales reach a record 300,000+
The world’s leading EV maker is showing no signs of slowing down. BYD sold 490,168 new energy vehicles (NEVs) in October, up 11% from the prior year and the company’s highest monthly total in 2026.
BYD’s battery electric vehicles drove the growth, with a record 305,743 units sold, up 37% year over year and marking the first time its EV sales have crossed the 300,000 mark.
To put that into perspective, just over 262,500 EVs were sold in the US in the entire third quarter combined, according to
Kelley Blue Book
estimates.
October marked BYD’s sixth straight month of higher sales growth and its third straight month of higher EV sales. Through October, BYD sold 1,953,700 electric vehicles, up 6% from the same period last year.
BYD October 2026 NEV sales (Source: BYD)
BYD’s all-electric vehicles (EVs) accounted for about 63% of total sales last month. Plug-in hybrid vehicles, meanwhile, fell 17% in October to 177,382 units. Through October, BYD’s PHEV sales fell 11% to 1,625,969 units.
According to BYD’s filing, the company exported 170,194 vehicles in October as it expands overseas to drive growth in markets like Europe, Southeast Asia, and Central and South America.
BYD “Xi’an” car carrier loading Dolphin Surf EVs for Europe (Source: BYD)
Through October, BYD exported over 1.5 million electric and plug-in hybrid vehicles, nearly double compared to last year.
By the end of 2026, BYD
expects overseas shipments
to reach about 2 million vehicles. In 2027, that number is expected to rise to more than 2.5 million vehicles.
BYD opens first Flash Chargers in Germany (Source: Klaus Hartmann/ BYD)
With several new and updated vehicles launching with its new Blade Battery 2.0 and Flash Charging technology, BYD aims to continue attracting new buyers with longer range, faster charging, and more tech-oriented models.
Electrek’s Take
While the US is coming off its best quarter of the year in EV sales, BYD’s performance shows how far ahead China is in the transition to electric vehicles.
China continues to lead the global EV market, accounting for over half of all electric cars sold worldwide.
With a wave of low-cost domestic brands flooding China’s market, BYD and other automakers are driving growth overseas in major markets like Europe, South Korea, Southeast Asia, and Central and South America, where legacy OEMs are already falling behind quickly.
FTC: We use income earning auto affiliate links.
More.
The Ford Privacy Promise: You're in Control of Your Data
Introducing the Ford Privacy Promise: You're in Control of Your Data
Even for a tech-savvy consumer, it can be hard to understand the relationship between your vehicle, the data it generates, and your privacy and rights. With our connected vehicle and app user communities growing every day, Ford takes its responsibility in safeguarding customer data seriously. That’s why, today, Ford is announcing the Privacy Promise.
Ford is launching the Privacy Promise to make an explicit commitment to customers that their vehicle data is safe with us and they’re in control of what they share. Our newly launched Privacy Promise website provides education on our privacy practices and how to customize your vehicle data and privacy settings anytime in-vehicle or via the Ford App.
Our Privacy Promise
We know that trust is earned. Protecting your personal information is one way we intend to earn it every day. Learn about our privacy practices by reading our Privacy Notices.
Your Privacy Is Our Priority.
We design and build our products with privacy in mind — from collection of data to its use and storage and even disposal. This can include privacy-enhancing technologies like anonymizing or aggregating data to further protect your privacy.
Straight Talk About Your Data.
We strive to provide clear and easy-to-understand information about how we use your personal information. This empowers you to navigate your privacy choices with confidence. Once you make those choices, we respect your decision.
You Drive Your Privacy Choices.
We understand the trust you place in us every time you drive our vehicles and are dedicated to protecting your privacy. We believe using vehicle data to raise the bar on safety and quality is the right thing to do. We offer vehicle privacy settings that allow you to control what data you want to share, subject to the features and services you wish to enjoy. We also never sell data about how you drive your vehicle to data brokers.
Research Insights
As we created the Privacy Promise, Ford wanted to learn more about what customers understood about vehicle and data privacy.
We surveyed just over 1,000 U.S. consumers — both Ford and non-Ford owners. Our customers tell us that vehicle privacy is important to them.
As much as they value privacy, we also learned that customers understand the value of data sharing. A value our survey respondents kept returning to was control: the ability to adjust their settings on demand and in detail.
Ford created the Privacy Promise to help drive awareness of a customer’s responsibility and choices when it comes to their data.
Survey respondents listed automakers as more trusted stewards of privacy than many other large organizations that handle data.
Ford customers, in particular, showed more comfort than non-Ford customers with tech-forward, connected solutions like smart home devices.
How Can I See What Data I Share with Ford?
To learn more about the Privacy Promise, how to customize your vehicle settings, and connected vehicle data, visit our
new website
.
Kristin Jones is Ford's Chief Privacy Officer and Deputy General Counsel, Data & Privacy.
On the morning of September 24th 2026,
Endcrawl
had a brief outage. I'd just typed:
And instantly all services went down.
Right away I blamed myself. Maybe I mistyped that number! Maybe my code had a signal handling bug. Maybe I don't understand Unix as well as I think I do. Maybe I'm an idiot!
As it turned out, the outage was caused by a bug in
kill(1)
.
This is really surprising. The
kill
program is 50 years old. Its
spec
is simple and stable. It's probably exercised a billion times a day.
A bug in
kill
was so surprising that, once I'd found it, I couldn't stop there. I needed to know how this bug came to be, and what had led the programmers so badly astray. When I eventually found the root cause, there was an even bigger surprise. It had led to not just one bug, but a whole series of
kill
bugs that shipped in Ubuntu 14, 16, 18, 22 and 24 LTS.
This post documents a decade of
kill
bugs, then makes some recommendations.
Back to the outage. I scrambled to put the fire out. After that came a surprise second fire. By the end of all this I was pretty demoralized. I was ready to accept that I'd made a dumb mistake and ready to get on with the work day. There was this nagging feeling though…
"I don't f**king know either. I guess we learned not to do it again."
"Yes sir."
"Although I'm f**ked if I know what we did..."
What had just happened? Was I about to be hit with a third outage? How could I be sure?
An outage not understood is an outage that happens again. That nagging feeling I had was a call to understand. With a sigh, I put all my other work on hold and started a proper post mortem.
The negative number here is a
process group identifier
, or pgid for short. A pgid is like a pid, but identifies a group of related processes. By convention, killing a positive number sends a signal to a single process, while killing a negative number signals all processes in that process group.
I was attempting to cancel a big Endcrawl 7k test render. A normal person would have killed one of the processes involved and let failures cascade to the others. But killing the whole group simultaneously strikes me as cleaner.
Process group signaling isn't some exotic operation. You use it all the time. Every time you
^C
a command, the tty sends
SIGINT
to the foreground process group. Interactive shells run all but the simplest commands in a new process group, which among other things makes
job control
possible.
Process group signaling is in fact an awesome Unix innovation. I love it so much I
added it to daemontools
, where
svc -+h
now avoids orphans in a multiprocess service bounce.
At any rate, imagine my surprise when the command didn't just kill those render processes, but killed
all processes on the machine
save one!
Here's the relevant snippet from
procps 4.0.4
, the provider of
/bin/kill
in Ubuntu 24.04 LTS. Can you spot the bug?
opterr=0;/* suppress errors on -123 */while((i=getopt_long(argc,argv,"l::Ls:hVq:",longopts,&optindex))!=-1)switch(i){/* ... */case'?':if(!isdigit(optopt)){xwarnx(_("invalid argument %c"),optopt);print_usage(stderr);}else{/* Special case for signal digit negative * PIDs */pid=(long)('0'-optopt);if(!execute_kill((pid_t)pid,signo,use_sigqueue,sigval))exitvalue=EXIT_FAILURE;exit(exitvalue);}/* ... */}
My initial guess was wrong. There's no underflow or overflow bug with
-1490947
.
Notice we're in the unrecognized option switch case. Here's what
getopt(3)
says about unrecognized options:
By default,
getopt()
prints an error message on standard error, places the erroneous option character in optopt, and returns
'?'
as the function result.
Aha. The
optopt
variable only holds the first character after the dash, not the whole negative pid. When character
1
is subtracted from character
0
we get a pid of
-1
. What happens when you kill pid
-1
?
Bad things
:
If pid equals -1, then sig is sent to every process for which the calling process has permission to send signals, except for process 1 (init).
This ran as root, so the misparsing of
-1490947
as
-1
killed every process but init. Bug found, mystery solved.
Except for me this just raised more questions. Why is the code assuming the unrecognized option is a "signal [sic] digit negative PID"? Why is the single digit negative pid case special, and what handles the general case of a multidigit negative pid?
Moreover, how could a bug like this exist in 2026, and in a Ubuntu LTS release no less? Has it always been there?
No, that couldn't be. I've killed process groups in the past. And the
kill -TERM -12345
thing is an ancient Unix incantation. This used to work dammit!
Thinking back, I could vaguely remember some negative pid kills gone awry. Never in an "oops this killed everything in sight" way. More in a "weird, nothing happened" way, or a "poof there goes my shell" way. Minor ways more easily shrugged off as user error.
It turns out I wasn't imagining these. The last decade has been a rough one for negative pid killers. There have been no less than
FOUR
distinct bugs around negative pids. And they all shipped in Ubuntu LTS versions.
Before I tell the tale of four bugs, let's go even farther back in Unix history.
In the beginning Unix had processes. By 1973 it had the
kill(1)
program. But it took a decade to evolve process groups as we now know them. It wasn't until
Unix V9 in 1986
that you could kill a process group via negative pid. Near as I can tell, negative pid killing has worked fine in the BSDs all these years.
In the early 90s this thing called Linux came along. Although Linux initially borrowed a lot of BSD code for its userland, by the late 90s this approach was in legal jeopardy. Everything had to be rewritten, every wheel reinvented. And quickly. It was an exciting time to be a unix programmer.
And so it came to pass that Linux's
kill
was
reinvented
written by
Albert Calahan
. After Albert DoSed himself by forking 5 children, Debian downstream maintainer
Craig Small
took over poor old neglected
procps
.
Negative pid killing seems to have worked fine until 2013. Then the trouble began.
Ubuntu 14.04 LTS included procps 3.3.9. Prior to this, the
kill
code did what the BSDs do and used pointer arithmetic to walk and parse
argv
.
Personally I'm fond of that approach. Stallman isn't so fond of it though. In GNU world, you're supposed to standardize command line parsing via
getopt
. This is probably a good idea in the general case, but as we'll see, it was probably the wrong choice in the specific case of
kill(1)
.
Here's the relevant code after the conversion to
getopt
:
opterr=0;/* suppress errors on -123 */while(loop==1&&(i=getopt_long(argc,argv,"l::Ls:hV",longopts,NULL))!=-1)switch(i){/* ... */case'?':if(!isdigit(optopt)){xwarnx(_("invalid argument %c"),optopt);kill_usage(stderr);}loop=0;break;/* ... */}argc-=optind+sigopt;argv+=optind;for(i=0;i<argc;i++){pid=strtol_or_err(argv[i],_("failed to parse argument"));if(!kill((pid_t)pid,signo))continue;exitvalue=EXIT_FAILURE;continue;}
The code worked fine for multidigit negative pids. However, if you were one of those
freaks
creative sysadmins who delighted in a
kill -HUP -1
now and again to restart all your services, you noticed a bug: nothing happened.
Multidigit case
: With
kill -HUP -123
,
getopt
acts as if
-1
,
-2
, and
-3
were all separately passed. The unrecognized option case will be hit three times, and only at
-3
will the
-123
argument be consumed by incrementing
optind
. Because the code breaks out of the
getopt
loop early at
-1
, an unconsumed
-123
argument correctly makes it to the pid killer.
Single digit case
: With
kill -HUP -1
, however,
getopt
has fully consumed that argument and incremented
optind
before we break out of the loop. The pid killer sees no arguments and nothing happens.
A cure was in order. Unfortunately it was worse than the disease.
Ubuntu 16.04 LTS shipped with procps 3.3.10. The
kill -HUP -1
bug was fixed at the expense of multidigit negative pid kills: a
kill -TERM -12345
now killed everything.
This is the same bug that caused the outage under Ubuntu 24. We reviewed this
above
. The only mystery here is why procps circa Ubuntu 24 resurrected the known-buggy code circa Ubuntu 16. My best guess is that the following bugs were deemed even worse.
This attempted to fix multidigit negative pid killing. Instead of parsing
optopt
, which only corresponds to a single bundled character like
-1
when
-123
is passed, the new code stops and tries to parse the whole argument:
opterr=0;/* suppress errors on -123 */while(loop==1&&(i=getopt_long(argc,argv,"l::Ls:hV",longopts,NULL))!=-1)switch(i){/* ... */case'?':if(!isdigit(optopt)){xwarnx(_("invalid argument %c"),optopt);kill_usage(stderr);}else{/* Special case for signal digit negative * PIDs */pid=atoi(argv[optind]);if(kill((pid_t)pid,signo)!=0)exitvalue=EXIT_FAILURE;exit(exitvalue);}loop=0;break;/* ... */}
This works correctly for multidigit negative pids. But if you passed a single digit negative pid, as in a
kill -TERM -1
, the pid argument was fully consumed, and
optind
would run off the end of
argv[]
. Segfault!
This fixed the segfault by ensuring
optind
never ran off the end of
argv[]
:
opterr=0;/* suppress errors on -123 */while((i=getopt_long(argc,argv,"l::Ls:hVq:",longopts,NULL))!=-1)switch(i){/* ... */case'?':if(!isdigit(optopt)){xwarnx(_("invalid argument %c"),optopt);kill_usage(stderr);}else{/* Special case for signal digit negative * PIDs */pid=atoi(argv[optind-1]);if(kill((pid_t)pid,signo)!=0)exitvalue=EXIT_FAILURE;exit(exitvalue);}xerrx(EXIT_FAILURE,_("internal error"));/* ... */}
Once again, it seems the contributor didn't understood how
getopt
option bundling interacts with
optind
, and hopefully by this point you're developing some sympathy for them. With this patch a
kill -TERM -1
works correctly and no longer segfaults. But multidigit negative pid killing was broken for a second time, in a brand new way.
Suppose we try to
kill -TERM -123
. Thanks to option bundling,
optind
isn't incremented yet when we hit the unrecognized option case. Per some
quirky behavior noted below
,
argv[optind-1]
is now the string
kill
.
How does
atoi(3)
handle a non-numeric string like
"kill"
? It returns
0
.
For one, the way
getopt
only advances
optind
with the final bundled option is deeply non-obvious. I didn't find evidence that any contributor understood this. I didn't understand it myself at first. That took careful study.
It's a real surprise. Surprising behavior like this should be avoided.
I feel this learning is too myopic though. Can one even avoid this surprising
getopt
behavior? You can't disable option bundling.
Well okay, at least in this specific case. The
kill(1)
program is just an unusual beast. It accepts options that are actually signal names, like
-KILL
. You can also specify that same signal by number, like
-9
. And pgids are negative numbers that look deceptively like options.
How should a command line like
kill -1 -9
be interpreted?
Should it send SIGHUP to pgid 9?
Should it send SIGKILL to pgid 1, aka everything?
Should it send SIGTERM, the default signal, to pgids 1 and 9?
All of these interpretations are potentially valid if any
argv
element can be an option or a pid.
The solution is to instead parse
argv
positionally. Don't use
getopt
here. Abandon capabilities like option bundling and option reordering that are more footgun than feature in this context. The
POSIX spec
says that only
argv[1]
can specify the signal to send, and arguments beyond that are pids and pgids. These are nice simplifying assumptions.
I think the old-school Unix and BSD approach is the right one. Have a look at FreeBSD's
kill.c
. Like ancestral Unix did back in the 70s, it parses
argv
positionally. The approach is simple and the code is simple. By contrast with Linux's
kill
, FreeBSD's
kill
has had no command line parsing bugs.
I do regard
getopt
dogma as the real root cause of the outage.
It scans
argv
looking for the first signal spec. If it finds a
-KILL
, a
-9
, or similar, it modifies
argv
in place (!) so
getopt
doesn't have to deal with that.
This is already "primitive"
argv
parsing! We're halfway there.
The second form is parsed correctly even by the buggy procps versions listed above.
Second, kill with least privilege. If I'd done a
sudo -u render kill
instead of a
sudo kill
, it would have only killed in-flight renders instead of all processes on the box. I feel a little insane recommending this kind of defensive tool usage — let's be clear, we're defending against bugs in
kill
, a small, mature, widely-used and very important tool — but here we are.
Finally, the good news is that a
bugfix for Ubuntu 24
is already on its way at the time of publication. I still favor a simplifying rewrite of procps's
kill
though.
JUST IN: Apple Maps has put all the buildings back in Gaza, because the easiest solution to a genocide is to pretend it isn't happening.
Image on the right is from Google, showing the current reality.
A former
Epic Games
developer is calling out Steam users, saying that they wouldn't move on from
Valve
's store even if a better alternative emerged.
Kiaran Ritchie, former principal animation engineer at
Epic Games
kicked off discussions surrounding Steam's 30% sales cut last week (with the assertion that "you could vibe code a Steam alternative in a week"). Which in-turn led noted Steam hater Epic CEO Tim Sweeney to assert that "Valve has held gaming back for years" – because the person whose company proudly asserted it had
"vibe coded the Epic Games Launcher
" knows what's holding gaming back!
Ritchie elaborated on their opinions on the 30% cut
in a separate post
, with the post saying that while developers are paying 30% in order to access Steam infrastructure, "in reality it is purely to get access to the massive Steam userbase." He adds "PC developers have no option but to distribute through Steam or lose the vast majority of sales."
As for that 30%, he says that it's "siphoned out of the PC games industry into a black hole," arguing that "Valve could easily lower the distribution fee while maintaining healthy margins." He
later gives "Kudos"
to Valve, saying "They played Capitalism so well they broke it."
And while a point can certainly be made that Steam is generally a better platform than the alternatives, and that it has the most to offer players in its library, Ritchie argues that it doesn't really matter, claiming "no avid Steam user wants other stores to succeed."
"Even if an alternative were objectively better, by whatever metric you care about, it would still be of no interest to Steam users," Ritchie says, adding, "Competition in this space is not only uninteresting to most Steam users, it's actively denigrated!" He then says that the Steam users "the very ones maintaining this unbreakable stalemate, would benefit the most from a better financed game development ecosystem." He concludes, "I don't think this is fixable. It's just sad."
Personally, I don't think Steam needs to charge as much either, but Ritchie hits the nail on the head, that it's "to get access to the massive Steam userbase." Because unfortunately, losing 30% to Valve is probably better than joining the list of games that flopped on PC because they were Epic Games Store exclusives.
Weekly digests, tales from the communities you love, and more
Emmanuel Rosier, director of market intelligence at research and analyst firm Newzoo told GamesRadar+ that "As long as Valve is independent and not a publicly traded company," it looks impossible for Steam to be overthrown as the de-facto PC gaming marketplace.
Scott has been freelancing for over four years across a number of different gaming publications, first appearing on GamesRadar+ in 2024. He has also written for the likes of PC Gamer, Eurogamer, VG247, Play, TechRadar, and others. He's typically rambling about Metal Gear Solid, God Hand, or any other PS2-era titles that rarely (if ever) get sequels.
An Introduction to Bε-trees and Write-Optimization
Lobsters
www.usenix.org
2026-11-02 15:26:38
This is the underlying tech of the recently posted GEFS: https://lobste.rs/s/zjjvbo/work_on_gefs_good_enough_file_system_for
Comments...
Michael A. Bender, Martin Farach-Colton, William Jannen, Rob Johnson, Bradley C. Kuszmaul, Donald E. Porter, Jun Yuan, and Yang Zhan
A Bε-tree is an example of a
write-optimized
data structure and can be used to organize on-disk storage for an application, such as a database or file system. A Bε-tree provides a key-value API, similar to a B-tree, but with better performance, particularly for inserts, range queries, and key-value updates. This article describes the Bε-tree, compares its asymptotic performance to B-trees and Log-Structured Merge trees (LSM-trees), and presents real-world performance measurements. After finishing this article, a reader should have a basic understanding of how a Bε-tree works, its performance characteristics, how it compares to other key-value stores, and how to design applications to gain the most performance from a Bε-tree.
I’m not a big owner of things, but the best laptop I’ve ever owned is a roughed-up
2015 Thinkpad X250.
For the flex, here it is running a GUI shell sat on top of the microkernel I’m currently
working on (blog post about this incoming… eventually).
Here’s a list of things that I think make it brilliant. I don’t want to pretend that any
of these things are uniquely exemplary: far from it. It is the confluence of them, and
not any one in particular, that makes me love using it.
Size
It’s pretty tiny. Its form-factor fits snuggly into the footprint of an A4 piece of
paper, so it sits alongside books and folders when placed in a small rucksack without
risking damage.
It weighs almost nothing too: even with the extra capacity battery, it’s only about 1.45
Kg. Light enough that you almost don’t notice it when travelling.
Performance
Mine has an i5-5200U: 4 logical cores, maxing out at 2.7 GHz. I upgraded it to 8 GB of
RAM a while back: more than enough for some light on-the-go programming.
Even at full pelt, I’ve never heard the fan kicking up much of a fuss. Now that I think
about it, I’m not even certain that it works.
Battery
The X250 has both an internal battery and an external battery slot. I’ve opted for the
largest after-market external battery I could find. When doing casual work the laptop
will easily survive for north of 10 hours without a charge, stretching to 12 hours if
I’m careful.
Repairability
The X250 was quite popular and replacement parts retail very cheaply on ebay. It’s not
the easiest to disassemble Thinkpad by any means but I can tear it apart entirely with
the pocket phillips I keep on my keyring. I have previously replaced:
The internal battery
The lid camera
The keyboard
The motherboard
Every time you open up a laptop you run the risk of damaging something important either
via a slip of the hand or simply the accumulated toll of loosening and tightening dozens
of tiny screw threads. Despite that, my X250 has proved remarkably resilient and has
never sustained any major damage despite more than more than a dozen tear-downs.
Keyboard
As with most Thinkpads, the keyboard feels lovely to use. When you spend a lot of time
writing code the reliability and sensitivity of a keyboard starts to matter a lot.
Coupled with my
text editor
, the experience of writing code on the thing
is beautifully snappy.
Operating System
I opted for Endeavour OS. In the usual Arch Linux tradition, it favours native
package installs over sandboxed applications. As a result my install sits at around 30
GB. A 128 GB M.2 SSD raided from another second-hand machine is more than enough to
cover that and everything I’m working on.
I’ve slimmed down my systemd setup as much as possible and the thing boots from cold in
about 8 seconds.
Cost
Here’s where the X250 beats out most competition. I bought mine second-hand for about
£100 in 2018. They’ve only got cheaper since then. I’m not afraid to take it anywhere
because it’s barely worth stealing and would be cheap to replace even if that were to
happen. Its value is very much not in its on-paper specs and instead in how I use it.
Conclusion
I get a certain glee in keeping older or second-hand hardware running as a daily driver.
It sounds silly, but it feels like a quiet revolt against bigger-faster-costlier
consumption culture. Come the end times, this is the machine I’ll be riding it out with.
Nepal Isn’t Asking for Charity. It’s Calling in a Debt.
Portside
portside.org
2026-11-02 14:42:45
Nepal Isn’t Asking for Charity. It’s Calling in a Debt.
Kurt Stand
Mon, 11/02/2026 - 14:42
...
hen a piece of Himalayan glacier
broke loose
above the Bhotekoshi River in August, it sent a wall of water, ice, and rock hurtling at alarming speeds through Nepal’s northern districts in mere minutes. More than 1,400 people are now
confirmed dead
, and more than 4,000 remain unaccounted for. Entire villages were destroyed. Nepal’s government estimates
damage
at $2.7 billion and reconstruction at $4.7 billion, a staggering sum for a country whose entire budget
averages
$14 billion annually.
Nepal did little to nothing to
cause
the warming, melting, and extreme precipitation plaguing its glaciers. In the weeks after the disaster, Nepal’s government filed a formal claim to the
Fund for responding to Loss and Damage
(FLRD), a financial mechanism operated by the United Nations. The claim demands wealthy countries make good on a climate promise they made in 2022 to finance the recovery of vulnerable communities from climate-related damage. The country hasn’t had luck yet, but advocates hope the upcoming U.N. climate conference—the thirty-first annual Conference of the Parties, or COP31—will pressure the fund’s board to uphold the agreement.
The FRLD was created in 2023 at the COP27 climate negotiations to fund climate-driven disaster recovery initiatives in the wake of the devastating 2022
floods in Pakistan
, which killed or injured 15,000, displaced nearly eight million people, and destroyed or damaged millions of homes and acres of agricultural land. But its creation took decades.
Demands for compensation
for climate-caused losses and damages by developing countries date back to the United Nations’s earliest climate talks, including a 1991 proposal for such a fund by the South Pacific archipelago nation of Vanuatu and the Alliance of Small Island States.
The fund, whose board is hosted by the Philippines and its secretariat run by the World Bank, operates as a grant- and project-based financing mechanism. Climate-vulnerable developing countries can apply for access to the fund’s resources, which come primarily from governments, but also allow private sector partnerships and innovative financing mechanisms.
Three years into its existence, the FRLD has
yet to approve
a single funding request tied to a specific disaster. Faced with its first real test, the fund, built to respond to climate-fueled disasters, showed it is unprepared to respond quickly. That’s in part because only about a third of the roughly $822 million
pledged
by developed countries to the fund since 2023 has actually been
transferred
. The fund’s own rules cap initial disbursements at $20 million per project—roughly half a percent of Nepal’s low-end damage estimate—regardless of how fast the board moves.
At the end of August, Nepali officials
wrote
to the board of the FRLD requesting financial support in the wake of the catastrophic floods, invoking the very language of climate justice the fund was built to honor. But the FRLD’s current funding window closed in June.
“We are genuinely suffering from the adverse effects of climate change,” states the letter, which was obtained by
The Kathmandu Post
. “Time is of the essence. A prompt response would help protect affected populations, restore essential services, prevent further suffering and demonstrate that the fund can translate international solidarity into timely support for vulnerable countries and communities when it is most urgently needed.”
The Nepali government argues that a country that has contributed so little to global climate emissions should not have to bear the scale and cost of what is equivalent to a “
Himalayan tsunami
” alone. “Nepal’s greenhouse gas emissions are virtually negligible,” Foreign Minister Shisir Khanal
said
in an interview with
The Kathmandu Post
. “Yet, we are paying the ultimate price for a global crisis we did not create. The rapid melting of glaciers and these catastrophic mountain tsunamis are direct consequences of global climate change.”
Before the floods in August, Nepal was already
reportedly poised
to receive $20 million from the fund for an application filed for unrelated energy, health, and food-security projects under the fund’s previous grant window. More than 100 countries are in line behind Nepal.
On September 9, the FRLD’s co-chairs
wrote back
to Kathmandu with “deepest sympathies” and “unwavering solidarity,” pledging to work with the board to address the request “as rapidly as possible.” Their promise, though, does not commit to any specifics in terms of timing or dollar amounts.
More than a dozen board members from Asia, Africa, Latin America, and small island states pushed for an emergency session to vote on Nepal’s requests. In
a letter
addressed to the board, its co-chairs, and executive director, they wrote, “This event constitutes precisely the kind of climate-related extreme weather events the Fund was established to address . . . . The scale of loss of life, displacement, and destruction of energy, transport, and economic infrastructure warrants the Board’s urgent consideration of how the Fund’s existing instruments should be mobilized to support Nepal’s government and affected communities.”
One board member, South African negotiator Richard Sherman, has
suggested
the board could realistically designate another $20 million for Nepal’s current claim during the emergency meeting, while noting that it would be largely symbolic against the scale of the damage.
Nepal’s request came just two months before COP31
opens
in Antalya, Turkiye, where United Nations climate negotiators will meet to continue hammering out the best ways to implement and fund the commitments of the Paris Agreement. For years, debates, particularly around climate-related damages, have been largely speculative—delegates have fought over projections and estimations.
Nepal has turned that speculative exercise into a real test: How does a fund respond to a sudden onset disaster, the very climate impacts it was intended to address, when it has no fast-track funding authority?
No amount of money can erase what Nepal has lost, or what will take years to rebuild. Nepali communities are not helplessly waiting in the wings expecting aid to fall from the sky. They have
crowdfunded
nearly $90 million for response, making the case that this disaster was
climate-driven
. They have built a technical case that strikes at the core of the fund’s
modus operandi
.
If the loss and damage fund cannot move for Nepal—which has endured more than 1,400 deaths and thousands more missing, and has a formal claim on the table and a board that
acknowledges
the need to consider its urgent request—it is hard to imagine the scenario in which it moves for anyone. Nepal has done its part. The fund and the governments who built it must now do theirs.
In its appeal to the FRLD board, Nepal’s government directly asked the board to act before its next meeting in December, noting that time was of the essence. Whether the fund and its donors will honor this claim is now an open question with consequences that extend far beyond Nepal.
Shannon Gibson is the director of the Gibson Climate Justice Lab and professor of environmental studies & international relations at the University of Southern California. She has attended United Nations climate negotiations (COPs) since 2009.
Since 1909, The Progressive has aimed to amplify voices of dissent and those under-represented in the mainstream, with a goal of championing grassroots progressive politics. Our bedrock values are nonviolence and freedom of speech. Based in Madison, Wisconsin, we publish on national politics, culture, and events including U.S. foreign policy; we also focus on issues of particular importance to the heartland.
For help please visit
help.ft.com
. We
apologise for any inconvenience.
The following information can help our support team to resolve this issue.
Error Code
CG000 / 403
Request ID
a545c575383a0936
Abdul El-Sayed Tests the Limits of Islamophobia in Michigan
Intercept
theintercept.com
2026-11-02 14:35:24
As the Michigan Senate race finishes with a focus on the Democratic primary loser’s gripes over Israel, the party nominee has endured a barrage of anti-Muslim attacks.
The post Abdul El-Sayed Tests the Limits of Islamophobia in Michigan appeared first on The Intercept....
As Abdul El-Sayed’s
one-time primary opponent attempts to redirect closing arguments in the Michigan Senate contest to the topics of Israel and antisemitism, the Democratic nominee has entered the final stretch of the midterms against a barrage of bigoted attacks over his own race and religion.
President Donald Trump called him a “jihadist.” Health and Human Services Secretary Robert F. Kennedy Jr. went on a
racist rant
against Arabs. According to Michigan state Sen. Mallory McMorrow, a mailer went out showing El-Sayed’s face next to the World Trade Center’s Twin Towers.
“They are running the most bigoted, hateful, Islamophobic campaign I’ve ever seen,” McMorrow
told
a local TV outlet. McMorrow, who ran for the Democratic Senate nomination but dropped out before the August primary, is taking a far different tack than Rep. Haley Stevens, the Democratic primary
runner-up
who has spent the race’s final days painting El-Sayed as an angry antisemite and
crossed party lines
Sunday to endorse Republican contender
Mike Rogers
.
Rogers has sought to portray El-Sayed as anti-American and repeatedly tried to tie his opponent to the Muslim Brotherhood. He insists the attacks have nothing to do with faith. But that is exactly how many observers see them, including Muslim Republicans who have been
disgusted
by the rhetoric.
As the election draws to a close, the Islamophobic attacks have taken a backseat to Stevens’s claims of antisemitism — most prominently concerning a
PAC ad
that connected high grocery prices to U.S. spending on Israeli military aid — and a personal feud between the former primary opponents. And some of El-Sayed’s allies worry that the Muslim and Arab-baiting attacks will work. One recent poll found that 38 percent of Michigan voters
said
they would be less likely to vote for a Muslim candidate.
Michigan’s Muslim and Arab organizers have not been taking the attacks lying down, however. In interviews last month, two prominent leaders in Dearborn’s Arab American community described widespread excitement over the opportunity to vote for the man who would be the first Muslim in the U.S. Senate.
“It very much feels like when President Obama was running and his whole campaign was around like hope. That’s what it feels like,” Layla Elabed, the organizing director at Arab Americans for Progress, told the Intercept on October 8.
Elabed, the sister of Rep. Rashida Tlaib, D-Mich., was one of the key movers in the
Uncommitted movement
, which urged Michigan voters to withhold their votes from Joe Biden during the 2024 primary in protest of his support for Israel’s war on Gaza. The movement succeeded in making a statement, but also drew criticism from centrist Democrats for allegedly fracturing party unity.
Elabed’s current group is an evolution of the Uncommitted movement. Its canvassers have been knocking on doors to turn out support for El-Sayed and other candidates.
“I don’t think many people in Dearborn are surprised by Haley Stevens,” Elabed told The Intercept on Monday. “Arab American Democrats in Michigan have been sounding the alarm about her for years, warning our fellow Democrats about a pattern of putting political interests ahead of the people she was elected to represent.”
She believes the same coalition that came together for Uncommitted could help push El-Sayed over the top this election.
“Abdul has been able to really take a stand on all the issues that were really important to anti-war voters and anti-genocide voters,” she said. “It’s not a coincidence that that same coalition, that same base of Democratic voters are now all coming out to support us.”
Hers is not the only group seeking to mobilize Muslim and Arab voters, who make up a sizable slice of the Michigan electorate. The Arab American Political Action Committee has also endorsed El-Sayed. Its president, Osama Siblani, said there is widespread enthusiasm for El-Sayed in areas with dense Arab populations
such as Dearborn
.
Siblani compared El-Sayed’s potential victory to John F. Kennedy’s pathbreaking election as the first Catholic president.
“First of all, he’s qualified. Second of all, he’s saying the right things, he has a good agenda,” Siblani. “His opponent is an asshole. In addition to all of this, he is breaking the ceiling for our community and for other communities. That is a plus.”
The goal of the Arab and Muslim-baiting attacks from El-Sayed’s enemies is clear, according to Nazita Lajevardi, an associate professor of political science at the University of Michigan.
“Islamophobia is a tried and true strategy for garnering a candidate support and swaying the vote,” she said.
“When political elites discriminate, it does mobilize people into action.”
Yet it is also possible that the attacks on El-Sayed’s identity will lead to greater turnout in places like Dearborn, she said.
“I think scholarship would tell us that when political elites discriminate, that it does mobilize people into action. Past scholarship would say yes, it would, but it’s an open question,” she said.
Elabed agreed that the attacks are nothing new. “We’ve watched it play out time and time again,” she told The Intercept. Stevens’s about-face isn’t a major development, she said, “It’s that the rest of the Democratic Party is finally seeing what our communities have been saying all along. We weren’t wrong. We just weren’t being listened to.”
Siblani expressed a similar sentiment on Monday. “I’m not surprised, I’m disgusted,” he wrote of Stevens in a text message, attaching an emoji of a person vomiting.
Stevens’s choice to jump ship for the Rogers campaign appears to have galvanized El-Sayed’s base. His campaign
announced
a one-day fundraising record after his fellow Democrat pulled her endorsement on Sunday.
Oracle files to sell $20B in new stock, bonds to finance AI buildout
The Oracle logo is displayed on a building at an Oracle campus in Redwood Shores, California, Sept. 10, 2025.
Justin Sullivan | Getty Images
Oracle
filed plans on Monday to issue new stock and more debt to finance its artificial intelligence buildout.
The hyperscaler will sell $10 billion in common stock and $10 billion in senior notes,
according to filings
with the Securities and Exchange Commission. While the fundraising was already outlined at an
investor day last week
, shares tumbled more than 6% Monday.
"This seems to be exactly what they previewed," said Rob Oliver, senior research analyst at Baird. "So I'm not sure why the market is freaking about it."
Oracle said it plans to use the proceeds for general corporate purposes, which may include capital expenditures, repayments of debt and future investments.
Oracle's one-day performance
The hyperscaler's stock initially bounced after last Wednesday's investor day, when Oracle also issued a revenue forecast of at least $225 billion for fiscal 2030. At the time Oracle also said it was
limiting its additional capital market funding
for the fiscal 2027 to 2030 investment cycle to that $20 billion.
"This is a major relief given concerns about the state of debt markets and the cost of capital (although UBS has argued that these debt market concerns have been over-stated)," UBS analyst Karl Keirstead said in a note on Thursday.
Oracle plans to turn to vendor financing, customer-provided hardware and customer prepayments to help it transition to positive free cash flow, which it expects to reach in the second half of 2028.
Stock and bonds in Oracle, co-founded by former CEO Larry Ellison, have been under pressure amid growing investor concerns about the massive amount of debt being taken on to fund AI infrastructure.
Oracle shares are down 33% in 2026 and 50% over the past 12 months. The yield on its investment-grade 4.95% bond due in 2031 is currently 7.267%.
The sentiment shift is also seen in Oracle's five-year credit default swaps, which are insurance against default. The spread sits at 296, up 270% in one year. That's more in line with a high-end junk bond rating, according to S&P Global Market Intelligence's Gavan Nolan.
Oracle's five-year credit default swaps on Nov. 2, 2026
While still an investment-grade credit, Oracle was downgraded by S&P to a BBB- in July, one rating level above high yield. It has $125.34 billion in debt, as of Aug. 31, with the bulk in senior notes.
What ultimately matters for Oracle is execution, Pat Nerney, head of investment solutions at Dynasty Financial Partners, said in an email to CNBC Monday.
"Can they do what they say they are going to do? We view this as the narrative across the AI space," he said. "If this gets executed according to plans laid out, they will be rewarded. If they have to come back to market in the back half of '27 after telling everyone this was the last of the capital needed ... look out."
— CNBC's Seema Mody and Ari Levy contributed reporting.
A developer rant about tools built for one kind of internet
Recently, I’ve been losing my mind to
hardcoded timeouts
. Silent, arbitrary, unconfigurable time limits baked into tools by developers who apparently have never had to wait more than 200ms for anything in their lives.
Let me tell you about my week.
The
skills
Package and the 60-Second Clone
Now that coding agents are everywhere, everyone is using skills. The popular way to add them is through packages developed by vercel-labs, and the go-to collection is
awesome-copilot
, a curated set of skills sitting at 30K+ stars at the time of writing. Except I can’t use it. The repository is too big, and the
npx skills
installer just chokes and dies.
There’s an open issue about this since February
#278 on the vercel-labs/skills repo
and no one has responded. I’d be happy to send a PR and fix it myself. I just need someone to acknowledge it exists.
Is there a configuration option? A
--timeout
flag? An environment variable? No, there is nothing.
The workaround I found? Clone the repo manually first, then install from the local copy. It works, mostly. Except now
skills-lock.json
points to a path on my machine. My colleagues cannot use it. I also have to update my copy everytime I want update my skills. One workaround creates a lot of other problems.
Docker Gordon and the 2-Minute Death Timer
Then came Docker Gordon, the AI-powered debugging assistant baked into Docker. Useful concept. I was stepping through a container build issue, the kind that requires iteration: tweak, rebuild, inspect, repeat. I’ve never used Gordon but when the error manifested itself, it came with a suggestion to try Gordon and so I did.
Except Gordon has a hard limit: if your container doesn’t finish building within
two minutes
, it gives up. The session dies. You start over.
A two-minute build might sound like plenty if you’re in a fast environment with warm caches and pulled base images. But if you’re pulling a fresh base image over a slower connection? Debugging a multi-stage build with several heavy layers? Forget it. Gordon has already moved on.
There is no way to configure this. No
GORDON_TIMEOUT=600
env var. No
--build-timeout
flag. Nothing. The tool just assumes that two minutes is forever, and if you need more, that’s your problem.
The Pattern That’s Driving Me Crazy
Developers often working on fast machines, in offices or homes with gigabit connections, in cities with world-class infrastructure. They build tools with timeout defaults that reflect their own experience. And then they ship those tools to the whole world, with no knobs to turn.
The thing is, timeouts
need
to exist. Infinite waits are bad. Hanging processes are bad. I’m not arguing against timeouts. I’m arguing against
unconfigurable
timeouts. Against the implicit message that says:
if you can’t do this in 60 seconds, your environment is wrong, not my assumption.
A timeout should be:
A
safe default
for the common case
Clearly documented
so users know it exists
Overridable
via a flag, an environment variable, a config file,
something
This isn’t hard. It’s respect for your users.
The World Isn’t a Data Center in Virginia
I’m writing this from Cairo. My internet is decent, better than many places in the world. But it’s not 1 Gbps symmetric fiber. It’s not co-located next to an npm registry mirror. A
git clone
of a large repo takes time. Pulling a Docker image takes time. These are not failures. They are physics.
When your tool dies silently after 60 seconds without any way to change that limit, you haven’t built a tool for the world. You’ve built a tool for your office.
And this matters more than most developers acknowledge. The global developer community isn’t located in San Francisco or Amsterdam or London. It’s in Lagos, in Karachi, in Cairo. It’s people on 4G connections, on shared broadband, on connections that have real latency because the nearest CDN edge is 50ms away instead of 5.
When you assume a fast connection, you’re not making a neutral technical decision. You’re making a statement about whose experience matters.
I don’t think anyone is doing this maliciously. I think it’s a blind spot. Your internet is fast, so a 60-second timeout feels generous. Your machines are powerful, so a 2-minute build window seems like plenty.
But please: before you ship a timeout, ask yourself:
What if the user is on a slower connection?
What if their repo is larger than mine?
What if they’re debugging something slow, and that’s the whole point?
And then add a config option. One environment variable. One flag. That’s all it takes to go from “this tool doesn’t work for me” to “this tool works for me.”
As Bruce Lawson once said:
it’s the World Wide Web, not the Wealthy Western Web.
The web and the tools we build on top of it are for everyone. Let’s start acting like it.
Writing seen in PHerc. 306B, for the first time in 2000 years
PHerc. 306 was buried by the eruption of Mount Vesuvius in AD79. Since being excavated in the 1750s then micro-CT scanned last year, no-one had read what was written in it. Now, after reviewing a massive 25 submissions on this scroll from the Vesuvius Challenge community, we are finally able to award a $50K First Letters Prize on PHerc. 306B. This one was a challenging one!
Congratulations to
Liam Warner & Nicola Bodill
for their work revealing ink and recovering readable text from this scroll!
PHerc. 306 is a scroll broken into two parts, which we are referring to as PHerc. 306A and PHerc. 306B. Previously, we had no information about which portion corresponded to the upper or lower section of the original scroll. Thanks to the identification of ink and based on the orientation of the script, we can now say that PHerc. 306B corresponds to the upper section of the scroll, while the smaller remaining portion, PHerc. 306A, is the lower part. Now that ink has been identified in PHerc. 306B, this other portion has become all the more valuable to scan and virtually unroll.
This is the carbonized roll of PHerc. 306B as it looks today. It lives at the
Biblioteca Nazionale di Napoli
, around 10km from where it was originally excavated at the
Villa dei Papiri
in Herculaneum:
The awarding process proved unusually challenging. We received multiple submissions identifying the exact same area of PHerc. 306B, with several coming remarkably close to the prize requirements. Our criteria set a target of 10 readable characters within a 4 cm² area. Several submissions fell just short, recovering sequences of 7, 8, or even 9 characters.
We would like to acknowledge the contestants who worked on this same segment and came so close to reaching the target before Liam and Nicola’s successful submission: The Gold Panners, Grilli Security Research Team, Matteo Bulloni, Clovis Hublin, TAUIL-Abd-Elilah, Ben Kyles and Colleagues, Les Copronautes, and Doom Scrollers. A huge thank you to everyone for their outstanding work and perseverance!
The next images show perpendicular cross-sections from our micro-CT scans of the scroll, taken by the Vesuvius Challenge team at the ESRF in Grenoble. One cuts across the scroll, the other along its length. The sheet of papyrus that Liam & Nicola virtually isolated and read is highlighted in both images, deep within the tight windings of the scroll. These show just how badly distorted and compressed the scroll is – this is typical of the Herculaneum papyri, which were subject to extreme temperatures during the eruption, before being buried in the ruins of the villa.
The sequence τοδιαυτο had been identified in multiple submissions for almost a month. However, what followed remained too faint and uncertain to allow for a consensus among the papyrology team. Several readings were plausible. In particular, the traces immediately following τοδιαυτο were interpreted as either a
mu
or a
nu
.
In the image submitted by Liam and Nicola, however, a subtle but significant improvement in readability made all the difference. For the first time, the papyrology team agreed on the reading of αι.
This is particularly interesting from a palaeographical perspective. In majuscule scripts, Μ, Ν, and ΑΙ can often look remarkably similar, and confusion between these letter forms was common even in antiquity, during the copying of manuscripts.
The image below leaves little room for doubt: what had previously been an uncertain sequence can now be read with much greater confidence.
In the video below, the second
alpha
is compared with the first. The decisive feature is the middle stroke, which rises diagonally from the bottom of the left oblique stroke, just as it does in the first
alpha
. Liam and Nicola’s submission made this stroke visible for the first time, providing crucial evidence for the reading.
As already noted by Nicola in the submission, the reading τὸ δι᾽ αὑτὸ αἱρ̣ε̣τ̣όν̣ , becomes very plausible. This expression, meaning “that which is in itself desirable,” finds several parallels in philosophical treatises, including works by Aristotle and Sextus Empiricus. A similar expression also occurs in Philodemus’ ethical treatise
On Anger
. While discussing the bad habit of desiring punishment as a form of enjoyment, Philodemus refers to the “folly of those who think it the greatest good and who turn to it
as
to a thing in itself worthy of pursuing
” (
ὡϲ εἰϲ δι' αὑτὸ αἱρετόν
) [transl. by D. Armstrong and M. McOsker]. In an Epicurean context, τὸ δι᾽ αὐτὸ αἱρετόν should only refer to good and pleasure.
In their own words…
I am
Liam Warner
, from northern England. I’m a freelance software engineer/consultant that has worked in areas such as video games, healthcare, and broadcasting technology. Machine learning has always been one of the most interesting challenges in software to me, and I think it represents a great example of creative problem solving and needing novel approaches. I’m a big fan of history generally, and upon finding out about the Vesuvius Project, decided I’d like to contribute. I had planned to just contribute maybe a few optimisations and bug fixes, but with a spare RTX 4090 not doing much I thought I’d see what ink detection looked like. Luckily I managed to strike gold, and with the tireless efforts of Nicola, we were able to slowly improve the quality of our segment, detection model, and reading. A big thanks to Nicola, the support given by the VC staff, and the giants of the VC community we were building on top of.
I am
Nicola Bodill
from Australia. I have a BA in Latin and Ancient Greek, and am a current MA student at the University of Sydney, working on a critical edition of a 2000-year-old Gandharan Buddhist birch-bark manuscript. Unsurprisingly, I have a lifelong passion for ancient languages, linguistics and literature! The Herculaneum scrolls first captured my imagination when I was 12 or 13 years old, in History class at school. Since 2023 I’ve been poring over the virtually unrolled scrolls, spending hundreds of hours manually creating ink labels to train machine learning models in the hope of incrementally improving the text. I presented a paper on my approach at the 2025 International Congress of Papyrology. Each new letter saved from the ‘innumerabilis annorum series et fuga temporum’ (’innumerable series of years and flight of time’) is precious, so it’s very exciting and meaningful work, if often painstakingly slow. But sometimes there are Eureka moments, and I was thrilled when I read the first letters in this scroll. Many thanks to the Vesuvius Challenge staff and participants who have offered kind words, advice and comradeship. And of course many thanks to Liam, who completely anchored this result.
The segment (i.e. the surface within the 3D scan) was created using VC3D’s GrowPatch tool, on the m7 surface predictions released by the VC team. The seed location for the patch was chosen to lie on a line found by screening windings produced by the publicly-available spiral-fitter; the right-hand end of the patch was corrected by snapping to the m7 surface predictions.
The final ink detection is given by multiplying the outputs of two ink models, meaning a pixel shows as ink only where both agree. One is
TRACE v3B
, a public model from Jashanjot Singh Gill & Nhat Nam Tran. The other is A-hn, a custom model fine-tuned by Liam & Nicola starting from the
v8-in
model by Youssef Nader (itself used to discover the first letters in PHerc. 1447). The average of three 600-step runs, each trained half on the PHerc. 1447 labels from Youssef and half on machine labels made by averaging four public models (v8-in,
Reader v3 and v2
, and TRACE v3B) on other parts of PHerc. 0306B, with an extra loss penalty for marking blank papyrus as ink.
You can download, reproduce, and build on their work:
After this discovery, there are still
20
more scrolls eligible for our
First Letters Prizes
– scrolls that we’ve scanned, but that no-one has found enough readable text in yet. It also makes PHerc. 306B a front-runner for the Grand Prize – we’ll
award
$800,000 for the first team that manages to virtually unwrap and read 70% of an entire scroll with minimal human input. Our community is actively working on these – we’ve already seen submissions on 13 other scrolls (other than PHerc. 306B and Erwin Nieuwlaar’s
prize-winning work
on PHerc. 0343), though none has yet met the requirements for a prize. Extending these results to give reliable ink detection on 8–9um resolution scans, which are relatively practical and affordable to acquire, will allow us to unlock the rest of the Herculaneum collection.
Discussion about this post
Ready for more?
Fintech platform Sageworks taken offline after suspected cyberattack
Bleeping Computer
www.bleepingcomputer.com
2026-11-02 14:00:45
Financial technology company Abrigo has restored its Sageworks risk management application, except for borrower-facing capabilities, following an outage triggered by "irregular activity" in its environment. [...]...
Financial technology company Abrigo has restored its Sageworks risk management application, except for borrower-facing capabilities, following an outage triggered by "irregular activity" in its environment.
On October 30, the company began emergency maintenance and took the Sageworks application offline to investigate suspicious activity detected earlier that day, with the outage continuing through the weekend.
Abrigo provides cloud-based software and analytics solutions for community banks and credit unions across the United States. According to the company, it serves
more than 2,400 entities
.
Its Sageworks product is a
software platform
that helps lenders process loan applications, analyze borrowers’ finances, assess creditworthiness, and monitor loan portfolios.
Due to its nature, Sageworks handles sensitive information, including banking customer details.
"We identified irregular activity in our environment, and, out of abundance of caution, we disabled the Sageworks application at approximately 11:25 am ET," the company said on Friday.
In status updates over the weekend, Abrigo said its investigation was ongoing but did not disclose details about the nature of the incident.
The incident impacted the following services: Online Portal Now, Sageworks Analyst, and Sageworks API.
In its latest update today, the company said that most of the Sageworks functionality had been restored, with the exception of borrower-facing features.
BleepingComputer reached out to Abrigo for more details, but we have not received a response by publication time. Until the nature of the incident is disclosed, it is unclear if the outage was caused by a breach or a technical issue.
Earlier this year, someone allegedly part of the ShinyHunters extortion group claimed an attack on Abrigo, saying that they stole 1.7 million Salesforce records containing personally identifiable information and various internal corporate data.
The threat actor said at the time that they exfiltrated full names, email addresses, phone numbers, employee and account data.
Although a data breach has not been confirmed, some cybersecurity researchers advised banks and credit unions using Abrigo's solutions to rotate the API keys for the Sageworks platform.
“Offensive Driving”: ICE’s Deadly Weaponization of Vehicles Against Civilians
Intercept
theintercept.com
2026-11-02 13:57:25
The Intercept reviewed more than two dozen incidents of ICE using its army of unmarked cars to attack immigrants and American activists alike.
The post “Offensive Driving”: ICE’s Deadly Weaponization of Vehicles Against Civilians appeared first on The Intercept....
As Miguel Parra
Hernandez, a Mexican national, was fleeing from U.S. Immigrations and Customs Enforcement on foot last month, he turned into a parking lot. An unmarked government vehicle came screaming into the lot after him and struck him.
When a grand jury in Harris County, Texas, charged the U.S. Immigrations and Customs Enforcement officer behind the wheel last week, the indictment pointed to a broader pattern in the Trump administration’s crackdown on immigrants and activists. The charge was assault with a deadly weapon; the weapon was the vehicle.
The Department of Homeland Security, ICE’s parent agency,
claimed
Parra Hernandez ran in front of the government vehicle;
surveillance footage
of the incident shows him running away from the car moments before he is hit. (An attorney for the ICE officer accused of assault against Parra Hernandez
told
The Associated Press his client had not committed any crime.)
In the same month, an unmarked ICE vehicle speeding the wrong way down a one-way street in Long Beach, California, struck a bicycle ridden by Ricardo Gonzalez, whose daughter later said he was a U.S. citizen. An agent immediately drew their gun on Gonzalez, who was later
hospitalized
for his injuries. The government said the man was not struck, but video released by the New York Times showed the ICE vehicle
swerving into the bicycle
.
Three days later after the collision in Long Beach, Antonio Moreida stood in the street in Woodland, California, outside Sacramento, documenting an unmarked ICE vehicle when the black Chevy Tahoe accelerated toward him. When the SUV hit him, Moreida told a meeting at Woodland City Hall last week, he was knocked to the ground — and the driver of the Tahoe did not stop to check on him.
The Department of Homeland Security said Moreida jumped onto the hood of the unmarked car, but when
video of the incident
showed him standing in place, local police and the mayor publicly disputed ICE’s account.
Weaponized Vehicles
In the national conversation about ICE’s
heavy-handed crackdown
on immigrants across the country, much has been made of the Department of Homeland Security’s claims that immigrants and activists “weaponized” their vehicles against federal agents. After immigration officers shot and killed
Lorenzo Salgado Araujo
, who was targeted by ICE, and community defender
Renée Good
in separate incidents, the government said the civilians had used their cars to attack agents — allegations that have
not been borne out in criminal charges
, or were called into question by
witness accounts
and
video analysis
.
What happened to Parra Hernandez, Gonzalez, and Moreida, however, was the opposite of what the government said about Good and Salgado Araujo: It was ICE agents who weaponized their vehicles against civilians.
As the Trump administration ramped up deportations over the last year, federal agents have effectively turned their cars into massive, deadly blunt objects. Common tactics, known collectively as “offensive driving techniques,” include ramming the cars of immigrant targets and activists; “brake-checking” volunteers trying to observe ICE activity; and, in some cases, outright driving into civilians. The Intercept reviewed two dozen cases of ICE using vehicles against civilians in these ways, including multiple incidents where victims were hospitalized or even died from their injuries.
“Vehicles are another tool ICE agents are using with unchecked force, just like their guns, Tasers, and pepper spray.”
“Vehicles are another tool ICE agents are using with unchecked force, just like their guns, Tasers, and pepper spray,” said Hannah Stauss, co-director of Hands Off NYC, a group that opposes ICE’s presence in New York City. “ICE’s deranged use of vehicles effectively weaponizes them against our immigrant neighbors and rapid responders, and will continue to kill people. We are witnessing in real time the results of a federal agency being allowed to operate with impunity, in secrecy, and with unfettered violence.”
In a statement to The Intercept that compiled past responses to the incidents in this article, a spokesperson for the Department of Homeland Security said, “ICE is instituting additional training including, crowd control measures, additional training for high-risk vehicle stops, a live-fire cover course for officer safety, and medical training.”
The spokesperson did not respond specifically to allegations about the incident involved Parra Hernandez; said Gonzalez was not struck by an ICE car; and blamed Moreida for the accident because he was in the roadway.
“Offensive Driving Techniques”
In federal policies and memos, the maneuvers used in the incidents reviewed by The Intercept, along with testimony from rapid responders, are referred to by federal agents as “offensive driving techniques.” They are part of a wider patten of aggressive driving by law enforcement officers across the country, but especially by federal agents with
little accountability
and nearly blanket backing from the Trump administration.
Last October, Leo Martinez was monitoring immigrations agents’ activity as a volunteer with
VC Defensa
, a community defense group in Ventura County, California, when an unmarked ICE car
rammed his pickup truck
. ICE agents arrested Martinez and later released him without charge.
In March, they did it again: Three unmarked government vehicles
rammed Martinez’s car
as he sought to reverse away from them. The federal agents broke his window and dragged him out. Martinez, who was hospitalized from his injuries, was again released without charge. (The Department of Homeland Security spokesperson did not respond specifically to questions about the incidents involving Martinez.)
“They run stop signs, red lights, they’ll cut off complete intersections, and they rarely turn on their lights,” Martinez told The Intercept. “They’ll slam on their brakes in the middle of the freeway, in the middle of the street. Sometimes they’ll do sudden U-turns in the middle of nowhere and cut off traffic in both directions.”
When activists are monitoring federal agents, one of the most common ways for ICE to leverage their vehicles as physical threats is the “brake check,” a move where a car suddenly breaks to cause the car behind it to slow down — or slam into its rear bumper.
“Brake-checking” doesn’t appear in official guidelines as an “offensive driving technique” with good reason: It is considered to be illegal in all 50 states, covered by various statutes like reckless driving or other anti-road-rage laws. Yet VC Defensa volunteers, who like Martinez monitor ICE activity, said that when they follow ICE vehicles to alert the community with horn-honking, they keep a distance of two to three car lengths because federal agents so frequently brake-check volunteers.
Federal agents use “offensive driving techniques” so often in Ventura County that VC Defensa volunteers sometimes identify the unmarked cars by the body damage that characterizes them.
Customs and Border Protection, another agency that, like ICE, is under the umbrella of the Department of Homeland Security,
expanded its agents’ discretion
and ability to use these techniques during abduction operations after President Donald Trump took office for a second term.
A previous 2023 Customs and Border Protection pursuit
policy
largely prohibited officers from boxing in vehicles or making vehicle contact with another vehicle in motion. A partially redacted
2025 CBP directive
gives officers broader discretion to use offensive driving techniques and ignore traffic laws.
“Most federal agencies are not well trained in police-citizen interactions, traffic stops, and pursuits.”
“Most federal agencies are not well trained in police-citizen interactions, traffic stops, and pursuits,” said Geoffrey Alpert, a criminology and criminal justice professor at the University of South Carolina who helped Customs and Border Protection rewrite their car-chase policy under the Biden and Obama administrations.
In December, ICE agents in Elgin, Illinois, chased a Venezuelan man until his car and the ICE vehicles crashed. State investigators
found
the ICE agents likely conducted an “unskilled precious immobilization technique (‘PIT maneuver’) and lost control of the vehicle.” (The Department of Homeland Security spokesperson said the target of the raid rammed an ICE vehicle into a tree.)
In January, Christian Molina, a U.S. citizen, was preparing to pull over for an ICE traffic stop in Minneapolis when the
agents rammed the back of his car
, injuring his back. The agents said they would pay for the damage, but left without providing contact information. (The Department of Homeland Security spokesperson did not respond specifically to questions about the incident involving Molina.)
In June, agents conducted a high-speed chase through a residential neighborhood of Chicago, blowing through intersections until finally ramming their target’s car. (The Department of Homeland Security spokesperson blamed the target of the immigration enforcement action for the accident because he fled from ICE.)
“It’s disheartening to see some sort of federal agents or law enforcement driving so aggressively in a residential area,” one neighbor
told Block Club Chicago
. “I have a kid who’s two and we go out for walks all the time. We could have been crossing the street when they came through the intersection.”
The day the directive was issued, ICE chased a group of roofers in Texas, blowing through a stop sign and over a speed bump without sirens. A mother driving her son to the theater was forced to swerve into a ditch to avoid a collision.
“They speeded right next to me,” the mother told the
Texas Observer
. “They hit the speed bump so bad that, when they got in front of me at high speed, I had to go to the right.”
If she had not swerved, she said, “they would have hit me.”
Some of these car chases have turned deadly in the very places where local police are restricted from chasing suspects because of the attendant dangers.
In February, agents
undertook a high-speed chase
in pursuit of Oscar Vasquez Lopez outside of Savannah, Georgia. Vasquez Lopez’s car struck a teacher, killing her.
The Savannah Police Department
only allows pursuits
when the suspect has committed or is attempting to commit a forcible felony, and the risk of not capturing someone outweighs the risk of the chase. Vasquez Lopez had no criminal record, only a civil deportation order from 2024.
Two
immigration
car
chases
in New Jersey, where police face similar
restrictions
at the statewide level, resulted in hospitalizations. (In the Texas case, the Georgia case, and the New Jersey case, the Department of Homeland Security spokesperson blamed the target of the immigration actions for causing unsafe conditions by fleeing.)
“They are not required to follow local agency policies (the same as other agencies), but they must be held responsible for their actions under state and federal law,” Alpert, the criminology professor, said. “The failure to evaluate these behaviors in a full, complete and transparent manner leaves us all in the dark.”
Earlier this month, the
AP reported
on an internal memo to ICE’s Enforcement and Removal Operations division that banned agents from conducting high-speed car chases. The directive still allows trained agents to make traffic stops and undertake offensive driving maneuvers.
Ramming Pedestrians
ICE agents’ vehicles are not just recklessly pursuing and ramming vehicles driven by who they thought were targets for immigration enforcement. In multiple filmed interactions, agents have driven into pedestrian rapid responders and protesters.
In Woodland, California, ICE agents crashed into Moreida as he sought to collect their license plate information. After a major workplace raid in Los Angeles in June 2025, a news helicopter
filmed the moment
a protester walked in front of several ICE vehicles. One slowly sped up until it knocked him to the ground.
“It’s a disproportionate use of force. An individual is not going to win a fight with a vehicle,” Alpert, the criminology professor, said. “I’ve never seen any state or local law enforcement ever use a vehicle properly to hit or to run into a civilian.”
In other incidents, federal agents have weaponized their vehicles against crowds of activists. (Asked about the protests incidents mentioned in this article, the Department of Homeland Security spokesperson blamed “anti-ICE agitators.”)
In the aftermath of an
ICE shooting
this month in the New York City neighborhood of Marble Hill, immigration agents were seeking to move a man with a gunshot wound — whose car, with his 5-year-old son in the back, smashed into a concrete barrier during the incident — from a hospital to a detention facility. As government vehicles left the hospital in a speeding caravan, a bicycle was nearly hit by an federal agent in a black vehicle, which honked its horn, according to
video
of the
incident
. In another
social media post
, an ICE agent in an unmarked vehicle continued driving even with six protesters walking in front of it.
In July 2025, in San Francisco, after ICE clashed with protesters while moving detainees from the immigration courthouse to unmarked vehicles, several protesters
clung to the hood
of the car until they were physically thrown off when the vehicle sharply accelerated.
“It is honestly only a matter of time until an ICE agent seriously injuries or kills a cyclist or pedestrian in New York City.”
“I absolutely worry about ICE agents hurting people or killing people with these aggressive driving maneuvers,” said a New York rapid responder. “In order to avoid having their movements in vehicles documented, ICE agents will dramatically accelerate far beyond safe speeds for a dense urban environment like New York City.”
The organizer, who requested anonymity to avoid retaliation from the government, reported that agents drive at high speeds into oncoming traffic, run red lights, and abruptly turn without signaling. They rarely use emergency lights or sirens. These tactics align with the pattern of behavior described by Martinez in California — but in a city where rapid responders and neighbors are more often on foot or riding bicycles, not in their own vehicles.
When ICE agents brought a detainee to a Brooklyn hospital after a
violent arrest
in May, hundreds protested outside the hospital. One TikTok video from the night captured the moment an unmarked ICE vehicle
drove into
several gathered people, accelerating sharply until they leapt out of the way.
“Given the frequency with which these agents are engaging in aggressive maneuvers to try and lose rapid responders or prevent documentation of their movements,” the organizer said, “it is honestly only a matter of time until an ICE agent seriously injuries or kills a cyclist or pedestrian in New York City.”
[This is a guest post by
Karthik C. S.
,
Amit Sahai
, and
Jie Xue
. This blog post was initially written in a different file format and converted using AI. — T.]
This is a good time for mathematicians to think carefully about the purpose of their work. The development of artificial intelligence brings that question before us with unusual force. Much of the discussion concerns which tasks machines will perform and which abilities will remain distinctively human. But our response also depends on a prior question: what do we understand mathematical work to be, and what gives it its worth? If our answer has become inseparable from the production of results and the demonstration of individual ability, the present uncertainty may reveal a difficulty in our conception of the work itself.
There are broadly two perspectives on mathematics. According to one, we invent it as we construct it: we introduce concepts, choose axioms, and develop theories. According to the other, mathematics exists independently of these activities, and our task is to discover it. These perspectives need not disagree about every aspect of mathematical practice. We plainly develop formalism and arguments. The deeper question is whether the truths we come to understand owe their existence to these acts, or whether our constructions enable us to recognize something that does not depend on us.
While discovery of mathematical truth can sound passive, a paleontologist searching for fossils must decide where to excavate, develop techniques, and recognize the significance of incomplete remains. The fossils existed long before the investigation, but finding them may require extraordinary imagination. Their prior existence gives direction to the investigator’s activity. Similarly, a mathematical discovery may require the invention of an entire language and framework through which a previously unnoticed relationship becomes intelligible. The discovery may require great creativity, but that does not make the truth discovered a creation of the individual. We encounter this distinction whenever our constructions surprise us. A definition introduced for one purpose reveals an unexpected connection elsewhere. A conjecture that seemed to organize our examples admits a counterexample. Two theories developed through different questions turn out to express a common structure. In each case, our thought encounters something it did not freely determine. We can revise our definitions or abandon our conjecture, but we cannot make the original argument valid merely by wishing it so.
The Platonic perspective gives a natural account of this independence. On this view, there were infinitely many primes before anyone proved that fact. Mathematical truth neither waits for our recognition nor receives its authority from it. We may choose how to describe a structure, but we do not choose its properties in the same way. This perspective also changes the place of the mathematician. Our intelligence becomes a means through which an order independent of us can be understood. The significance of the work lies in its relation to that order.
The distinction between a correct derivation and an understanding of its significance is equally important. An axiomatic system permits indefinitely many deductions, but the ability to produce them does not by itself supply a worthy direction of inquiry. Mathematical statements may be formally correct without being enlightening. We can introduce countless definitions and prove countless statements about them. What makes one definition illuminating? Why does one theorem disclose something fundamental while another merely adds to the available material? These questions concern the relation of a particular investigation to the principles it brings into view. Mathematical taste has a place here, provided we understand it as more than individual preference. We value a theory when it reveals a unity among things previously understood separately, or enables us to recognize why a phenomenon occurs. Although mathematical truths may exist independently of us, their discovery can transform our understanding and enrich our experience of the world. The ability to carry out longer chains of reasoning does not by itself explain such understanding. Reasoning serves understanding by articulating relationships and making their justification explicit. However, the success of reasoning does not mean that all knowledge can be reduced to it. Nor does our ability to reason more extensively determine what is worth knowing or why we seek knowledge.
Mathematics is only one field of knowledge. Not everything can be understood mathematically, nor is mathematical achievement the ultimate purpose of intellectual life. Yet we increasingly measure intellectual life through publications, citations, awards, and other indicators of performance. While useful, these measures become problematic when they define the worth of the work itself. We begin to see mathematicians as collections of productive abilities, and mathematics as merely their output. From this perspective, anxiety about being replaced by AI is natural: a machine that performs these tasks better appears to threaten our worth. But the problem began before AI arrived. We had already come to understand ourselves in terms suited to machines. AI merely exposes the consequences of this view.
The response cannot simply be to seek refuge in distinctively human abilities such as creativity, intuition, or taste. If we value these abilities primarily because they give us an advantage over machines, we remain trapped in the same conception of intellectual worth. Why should the value of our pursuit depend on being better at it than someone or something else?
Mathematics offers an opportunity to reconsider this whole orientation. Its truths do not become more true through the distinction of the person who expresses them. In understanding a proof, we bring our thought into conformity with a relationship whose validity does not belong to us. The particular path by which we arrive may bear the marks of our individuality. What is understood is available beyond that individuality. We can allow this experience to loosen the belief that knowledge has its highest value as an achievement attributable to ourselves.
Egoless mathematics begins with taking that possibility seriously. Humility then reaches beyond modesty about our accomplishments or generosity in sharing credit. It concerns the place from which we pursue knowledge. We may seek truth to serve our existing purposes, or allow what we discover to change those purposes themselves. If we approach truth on the condition that its discovery must preserve our importance, we have already made it subordinate to ourselves. Accomplishing this reordering can be demanding, as intellectual sophistication can furnish elaborate defenses of the very attachments that prevent us from understanding. What matters is whether our abilities remain answerable to truth, including when it requires us to reconsider what we have been using those abilities for.
From this perspective, the possibility of mathematical discoveries through AI need not be a source of sadness about our purpose. A truth has become accessible; its worth is not diminished by the absence of our authorship. We need not immediately turn the event into a judgment about our relative importance. The search can continue without requiring every advance to vindicate the seeker. Indeed, the demand for such vindication has always burdened the pursuit, whether the competing claim came from another mathematician or from a machine.
The opportunity before us is therefore more substantial than a rearrangement of mathematical labor. It invites us to reconsider what gives an intellectual life its worth, and to let the pursuit of truth shape not only our work but also how we approach life.
This may sound like asking us all to become saints. Insofar as it asks us to grow in virtue and relinquish our attachment to our own importance, that impression is not far from the truth. But virtue is not something to cultivate for the admiration of others. It is necessary for genuine joy, even in our work. The satisfaction of solving a difficult problem or winning a prize can be fleeting when it rests on our standing relative to others. The joy of understanding is different. Something previously obscure becomes clear, and we recognize a beauty that does not diminish when someone else discovers it first. We can share this joy without depriving anyone of it. Growing in virtue allows us to experience it more fully, free from the need to establish our own importance.
This perspective may also help reconcile two positions within the mathematical community regarding AI. Some are comfortable with or even
enthusiastic about using AI
, but wish to develop appropriate processes and principles for its use. Others prefer
not to use AI at all
. Both positions have their merits. Egoless mathematics offers a way of reconciling them by introducing a higher consideration: both approaches can reflect the same underlying commitment to mathematical truth, regardless of how we choose to pursue it. Our aim here is not to settle particular questions of policy, but to develop a higher-level perspective that can guide our deliberations and ultimately our actions.
Seen in this light, we need not be afraid of what AI may achieve in mathematics. Mathematics was beautiful before any of us were born, and it will remain beautiful long after we are gone. Its worth does not depend on our accomplishments, nor does our joy in understanding it have to depend on being the ones who make the discoveries. Our purpose rests on our willingness to let truth govern what we seek and what we become.
We, the authors of this essay, are still far from having attained such egolessness. Nevertheless, we recognize it as an ideal toward which we wish to strive.
We conclude with a thought experiment. Ramanujan is reported to have said, “An equation has no meaning for me unless it expresses a thought of God” (
Robert Kanigel, The Man Who Knew Infinity, 1992
). If he were alive today, witnessing the advances of AI in mathematics, would he be perturbed by what they might mean for his purpose as a mathematician?
Statement of AI Usage: While the ideas expressed here are entirely our own, we gratefully acknowledge the assistance of GPT Astra 6.0 and GPT 6.1 Sol in drafting this post.
A config format for humans
SOML is short for Sindre's Objectively Marvelous Language.
SOML is a config format that is pleasant to write and easy to read. The top level needs no braces, keys need no quotes, line breaks replace commas, and comments go almost anywhere. A value's type comes from its syntax, never from its content, so what you see is what you get:
'123'
is a string and
123
is an int. Dates like
2026-09-19
, instants like
2026-09-19T14:00:00Z
, and durations like
30s
are real values, so nobody has to guess the unit of
timeout: 30
. Paths and regexes need no escaping, and prose goes in block strings. One canonical form and a shared conformance suite mean every implementation reads your file the same way. JSON has the strictness but not the comfort: quotes, commas, and braces everywhere, and no comments. YAML has the comfort but not the clarity:
-
list markers, nested indentation, and types guessed from content, so
country: no
becomes
false
and
version: 3.10
becomes
3.1
. SOML gives you the comfort and the strictness, without the guessing.
SOML is a data format for files that people write and read. It is JSON without the noise, and with comments. It keeps JSON's tree of objects and arrays and its strictness, and adds literal strings, block strings, dates, instants, and durations.
Its design rests on one rule:
a value's type comes from its syntax, never from its content.
'123'
is a string and
123
is an int. Nothing is ever retyped by inspecting it.
Why SOML
Less noise than JSON, and comments.
Keys need no quotes, even with dashes, a line break replaces a comma, and the top level needs no braces. Comments are allowed wherever whitespace may go.
What you see is the type.
A string always has quotes, and a value without quotes must be a number, a date, an instant, a duration, or a keyword, or the file has an error. So
country: no
is an error rather than
false
, and
'10.20'
and
10.20
are a string and a float, exactly as written.
Strict where JSON is vague.
Duplicate keys, lone surrogates, and numbers out of range are errors, not behavior that each parser decides. An int is exact to 64 bits, and
3
and
3.0
stay different types.
Pleasant to write.
Literal strings, so paths and regexes need no escaping, and dedented block strings for prose.
Dates, instants, and durations are values.
2026-09-19
is a calendar date,
2026-09-19T14:00:00Z
is an instant, and
1h30m
is a duration, so no reader has to parse a string or guess a unit.
Indentation is free.
Braces and line breaks give the structure, so tabs, spaces, and copy and paste never change what a file means, except inside a block string, where indentation is text.
One canonical form.
Equal values give equal bytes, for hashing, signing, and comparing. A separate formatter keeps your comments, member order, and the spelling of each value. Its rules are part of the spec, so every conforming formatter gives the same output for the same file.
Small and tested.
The grammar is one pass with no lookahead, and every implementation runs the language-neutral
conformance suite
of nearly 1000 cases, so every implementation reads a file the same way.
Example
/*
Everything SOML can express, in one document. A document may also be a top-level array.
*/
# Keys are bare. Dashes are allowed, so no key needs quotes.
name: 'soml'
launch-date: 2027-09-19
released-at: 2026-09-19T14:00:00Z
'the name': 'quotes are the escape hatch, when a key needs spaces'
404: 'and a key may begin with a digit'
# Strings: '...' is literal, "..." is escaped. Use ' by default.
regex: '^\d{4}-\d{2}-\d{2}$'
windows-path: 'C:\Users\sindre\dev'
shell: 'echo "$HOME" | tr -d "\n"'
escaped: "line one\nline two\t\"quoted\"\u{1f600}"
# Block strings are dedented by the closing delimiter's column.
description:
'''
A block string keeps its line breaks.
The leading tab of each line is stripped,
because the closing delimiter sits at one tab.
'''
# Numbers: int and float are different types.
replicas: 3
ratio: 0.75
budget: 1_000_000
mask: 0b1010_1100
permissions: 0o644
color: 0xFF8800
flags: 0x00FF
limit: infinity
floor: -infinity
# Booleans and null.
drained: false
owner: null
# Durations: exact, in h, m, s, ms, us, and ns.
retry-after: 1m30s
# Arrays. A comma or a line break separates items.
labels: ['prod', 'eu-west', 'canary']
matrix: [[1, 2], [3, 4]]
mixed: [1, 'two', true, null]
# Objects. The top-level object needs no braces.
pool: {
min: 2
max: 16
}
# Records in arrays. Braces are required, and that is deliberate.
maintainers: [
{name: 'Sindre Sorhus', email: 'sindresorhus@gmail.com'}
{name: 'Random Person', email: 'person@example.com'}
]
# Line comments, and block comments, wherever whitespace may go.
# Inline objects and one-line braced documents work too:
healthcheck: {path: '/health', interval: 10s, grace: 1.5s}
Why not YAML?
SOML keeps what I like about YAML: comments, no braces around the file, no commas at the ends of lines, and keys without quotes. It removes what hurts: in YAML, the content of a value decides its type. In SOML, the syntax decides, so
'no'
is a string,
3.10
is a float, and
2
is an int, in every implementation.
What SOML adds:
Block comments with
/* */
, in addition to
#
.
Durations such as
30s
and
1h30m
, so
timeout: 30
no longer makes the reader guess the unit.
Dates such as
2026-09-19
and instants such as
2026-09-19T14:00:00Z
. YAML 1.2 dropped timestamps, but many parsers still read them, so a date in YAML may or may not be a string.
A canonical form, so equal values give equal bytes for hashing and signing. YAML defines one for scalars only.
A formatter whose rules are part of the spec. It keeps your comments, key order, and the spelling of each value. YAML says comments are not content, so tools may drop them.
Editing rules, so a tool can change one value and keep the comments and layout of the rest.
Error messages that usually say what to write instead.
What SOML fixes:
Values change type without warning.
In PyYAML (YAML 1.1),
country: no
is
false
,
zip: 01234
is octal 668, and
time: 22:22
is base-60 1342. YAML 1.2 fixed those, but most of the ecosystem still follows 1.1, and 1.2 still guesses:
version: 3.10
is the float
3.1
, and
~
,
Null
, and an empty value are null. SOML strings always have quotes, so
country: no
is an error.
Keys are not always strings.
1: x
gives an integer key in YAML, and PyYAML reads
on: x
as the boolean
true
. SOML keys are always strings, so
404:
is the key
'404'
.
Indentation is the structure.
One space too few moves a key into another object, and the file still parses, which is why YAML forbids tabs there. SOML gets its structure from braces and line breaks, so indentation only helps the reader, except in a block string, where it is text.
Block strings add a newline.
YAML's default
|
keeps a trailing
\n
in the value; SOML does not.
Large ints lose precision.
js-yaml turns
id: 9007199254740993
into
9007199254740992
. A SOML int is an exact int64; a larger one is an error.
Duplicate keys go unnoticed.
For
a: 1
then
a: 2
, PyYAML keeps
2
and says nothing. The spec forbids duplicates, but after type resolution
1:
and
01:
may or may not collide, depending on the schema. SOML compares the decoded strings and reports each duplicate.
A missing value is null.
timeout:
with no value is null in YAML, and a file with only comments is null in PyYAML. SOML rejects both, so a forgotten value cannot pass as a default.
The language is large.
YAML has two syntaxes for every list and map, two block string styles with three newline rules, indentation indicators, anchors, aliases, tags, multiple documents per file, three processing stages, and three recommended schemas. SOML has one syntax for each, one block string style, and one set of type rules.
Parsers disagree.
In the YAML test matrix (newest snapshot 2022), PyYAML fails 73 of 402 cases.
2024-01-01
is a date in PyYAML and a string in js-yaml 5, and
1_000
is
1000
in PyYAML and a string in js-yaml. SOML implementations share one
conformance suite
of nearly 1000 cases.
Two features are a security risk.
Aliases make YAML bombs possible: a small file expands into billions of nodes. Tags let a loader construct objects, and PyYAML has had four remote code execution CVEs rated 9.8.
safe_load
is opt-in, and even a loader named “safe” can turn aliases on. SOML has neither, one way to load, and limits on nesting and ranges.
Why not TOML?
SOML keeps what TOML gets right: predictable types, literal strings, insignificant indentation, and duplicate keys as errors. It removes what hurts: table rules where a key's meaning depends on what came before it, and values that parsers silently round, truncate, or read differently. A SOML file means one thing, no matter where a line sits or which parser reads it.
What SOML adds:
Top-level arrays. A TOML file is always a table, so a list of records needs a wrapper key.
Block comments with
/* */
, in addition to
#
.
Line breaks in place of commas, so a multi-line array needs none.
Durations such as
30s
and
1h30m
, so
timeout = 30
no longer makes the reader guess the unit.
A calendar date and an instant, kept as distinct types, without local date-times or local times.
A canonical form, so equal values give equal bytes for hashing and signing.
A formatter whose rules are part of the spec, so every conforming formatter gives the same output.
What SOML fixes:
Three ways to nest.
[server]
with
port = 8080
,
server.port = 8080
, and
server = {port = 8080}
all give the same table, each with its own rules. Projects mix them, often in one file. SOML has one way: braces.
Later lines can change earlier tables.
Even at the end of a file,
[[users]]
adds to an earlier array,
[server.tls]
to an earlier table, and a bare key to the last table. An attacker who can put a newline into one value can add a user with
role = 'admin'
, as CVE-2026-44244 injected a
[core]
section into
.git/config
for code execution. BurntSushi/toml even lets a later
users = ['mallory']
under
[auth]
silently replace an earlier
[auth.users.alice]
table. In SOML, earlier objects and arrays are closed.
Table headers have hidden scope.
[server]
moves every following key into
server
, even
timeout = 30
, with no way back to the root. SOML braces make boundaries explicit.
Dotted paths behave differently from headers.
Inside
[server]
,
logging.level = 'debug'
is
server.logging.level
, but
[logging]
is a root table, and
server.port = 8080
is
server.server.port
. In SOML, a key belongs to the braces around it.
Extension rules depend on how a table was made.
[a.b]
then
[a]
is valid, but
a.b.c = 1
then
[a]
is not. Header and dotted-key tables can be extended, inline tables cannot, and
[[servers]]
can append to an array of tables, but not to
servers = []
. SOML has no implicit tables, and one syntax each for objects and arrays.
Arrays of tables depend on order.
[servers.tls]
attaches to the most recent
[[servers]]
, so moving a section can silently attach it to another server. SOML array elements are self-contained objects.
Dotted keys silently change structure.
3.14 = 'pi'
,
example.com
, and
tls.crt
are nested keys, and
servers.0.port
creates the key
'0'
, not an array element. SOML needs quotes for a literal dot.
Renaming requires chasing paths.
Headers such as
[server.database]
and
[server.cache]
repeat the parent name, so a rename that misses one silently creates a separate object. SOML names the parent once.
Reindentation changes strings.
Multiline strings keep their indentation and the newline before the closing delimiter, and newline normalization is platform-dependent. SOML dedents block strings, adds no trailing newline, and requires LF.
No
null
, but
nan
.
TOML cannot tell an explicit null from a missing key, so writers must drop it or fail:
@iarna/toml
silently drops a
null
value, and Python's
toml
turns
None
in an array into the string
'None'
. TOML has
nan
. SOML has
null
, and no
nan
, which is not equal to itself.
Numbers and times change between parsers.
1e999
is infinity in Python's
tomllib
and smol-toml, but an error in Go and Rust, and
1e-400
is zero in all of them.
.123456789
seconds is exact in Go and Rust,
.123456
in
tomllib
, and
.123
in smol-toml.
9223372036854775808
works in
tomllib
but not in Rust's
toml
. SOML ints are exact int64, instants keep nanoseconds, and a float that does not fit is an error.
Broken input passes.
TOML reads an empty or comment-only file as an empty table, permits replacing malformed UTF-8 with
U+FFFD
, and leaves BOM handling unspecified. SOML rejects all of these, so an emptied config cannot fall back to defaults.
JSON must be rewritten.
TOML uses
=
, so a JSON object cannot be pasted in, not even as a value. SOML uses
:
, so hand-written JSON is usually valid SOML, and the syntax is already familiar from JSON, YAML, and JavaScript.
Comparison with other formats
JSON is unambiguous but noisy to write: the file needs braces around it, every item needs a comma, every key needs quotes, and there are no comments. YAML is pleasant to write but ambiguous to read. SOML keeps JSON's data model and strictness, and also decides what JSON leaves to each implementation. From YAML, it takes comments, multi-line strings, and a top level with no braces or commas, but not implicit typing, significant indentation, aliases, or tags. From TOML, it takes literal strings and the split between int and float, but it allows a top-level array and has no table headers or dotted keys.
SOML
JSON
YAML 1.2
TOML 1.1
Comments
#
and
/* */
no
#
#
Braces around a top-level object
no
required
no
no
Commas between items on separate lines
no
required
no
required in arrays and inline tables
Keys without quotes
yes, dashes and digits included
no
yes
yes
A value's type comes from its syntax
yes
yes
no, an unquoted value is typed by its content
yes
Separate int and float
yes
no
yes
yes
Dates and durations
date, instant, and duration
no
no, but many parsers still read dates
four date and time types, no duration
Duplicate keys
an error
left to the parser
an error, but some parsers keep the last
an error
A top-level array
yes
yes
yes
no
Indentation changes the meaning
no
no
yes
no
Canonical form
yes
only in a separate scheme, RFC 8785
for scalars only
no
Libraries
new, in a few languages
everywhere
everywhere
most languages
See the
full comparison
with JSON, JSON5, JSONC, TOML, YAML, and other formats, including where another format is the better choice.
Specification
The format is defined in the
specification
, which also gives the reason for each decision. The
FAQ
gives short answers to common questions, such as why SOML has durations and separate int and float types.
No patched kernels are available yet for 22.04, 24.04, or 26.04 despite a CVSS 9.8 rating.
Ubuntu has not shipped fixed kernels for
CVE-2026-98432
, a critical vulnerability scored CVSS 9.8, leaving the 22.04, 24.04, and 26.04 LTS releases without a vendor update.
Operators running those releases therefore have no official kernel package that closes the hole. The gap matters most for internet-facing and multi-tenant self-hosted systems that rely on Ubuntu’s LTS kernels for isolation and privilege boundaries; until packages appear, those hosts remain exposed to whatever remote or local attack the CVE enables.
Ubuntu has not announced an ETA for the fixes. In the interim, affected administrators are left to decide whether to stay on the stock kernel, apply out-of-tree mitigations if any exist, or move workloads onto releases or kernels that already carry the patch.
Abstract:
Large language models are pretrained on vast, uncurated corpora scraped from the public web. This creates a security risk from attackers who plant poisoned content in the pretraining data. We show for the first time that such poisoning can plant a remote code execution backdoor in an agent, causing it to execute attacker-chosen commands on the user's machine. To measure the threat end to end, we pretrain Qwen3 models from scratch at sizes 0.6B, 1.7B, and 4B, and then post-train each into a CLI agent using a clean pipeline. Poisoning only 0.1% of the pretraining corpus with our new poison design implants the backdoor: the deployed agent executes the malicious command when the trigger is present while behaving normally on clean inputs. The attack success rate (ASR) increases with model scale, with the 4B model reaching roughly 92% ASR at a 0.1% poison rate and staying positive even when the poisoning rate drops to 0.0005%. Our code is available at
this https URL
.
Submission history
From: Xinyan Hu [
view email
]
[v1]
Tue, 27 Oct 2026 16:53:52 UTC (518 KB)
We find that frontier LLMs are surprisingly good at
natively reading and writing neural network weights
, well past what we’d expect from humans or conventional algorithms. This might be a big deal for both optimization and interpretability.
Just by looking at the raw weights, GPT-6 Astra
can tell what a network was trained to do
. And without any environment feedback, it
has no trouble writing, from scratch, small game-playing networks
that outplay networks trained with PPO for 100 million steps.
Likewise, asked to make Qwen3.5-0.8B better at math without gradients, Astra
identifies an issue in its weights
causing reasoning loops that Qwen’s own
model card
warns about, and
fixes this by natively editing 0.016% of the weights
. With the same sampling settings, this weight correction raises MATH-500 from 7.9% to 48.1% and generalizes out of the box to instruction following, raising IFEval by 3x.
All of this is possible without allowing Astra to write training loops. It uses its reasoning to figure out what each part of a neural network computes, or should compute, and changes the weights accordingly. We call this
Weight-Space Programming
.
Throughout the history of deep learning, we encoded our simplistic inductive biases into tiny symbolic optimizers like Adam or Muon. This is changing:
our neural network weights will soon be
natively
optimized by LLMs that deliberately reason about their weights
.
Read
Which game was this neural network trained on?
Astra reads the 17,253 weights, with no tools
Breakout
99% confident
Fix
A trained policy never gets the car over the strip.
Astra edits 3.5% of the weights, in one shot
100%
success, up from 0%
Improve
Make Qwen3.5-0.8B better at math.
7.9%
base
7.9%
Astra’s edit
Astra edits the weights in a Python kernel, with no training
48.1%
on MATH-500, up from 7.9%
If you were asked to handcraft a neural network that plays Go, what would you do? If you were handed raw neural network weights and asked to predict their behavior, where would you even start? For almost any human, this is practically impossible.
Today, weights are written by
optimization
, by
custom networks trained to write them
, or by
compilers from formal programs
. In this post, we find that the current generation of frontier LLMs, used natively in natural language, are starting to become eerily good at understanding and crafting neural network weights around natural-language goals.
Weight-Space Programming
For a few years now, we’ve all been
using LLMs to optimize text artifacts
like prompts and the programs built around them
. More recently, we’ve started using them to optimize whole harnesses
and the training code and hyperparameters that train ML models
.
We often justified these methods by reference to the fact that
we don’t know other principled ways to hill-climb on text artifacts, unlike for updating the weights of differentiable neural networks
. After all, humans can “optimize” code by hand, for example, so it made sense to ask LLMs to do it, but they can’t “optimize” neural weights by hand, so those remained largely in the realm of symbolic algorithms.
In this post, we share very early results that allow us to argue that
the paradigm of reasoning-driven optimization is now coming even for differentiable neural networks
.
In
Weight-Space Programming
, a general-purpose
LLM reads and writes a network’s weights directly
(i.e., not through an optimizer, and in particular not with gradient descent) around some natural language spec, sometimes even with no environment feedback at all.
In natural language, it’s becoming possible to
“just ask” an LLM to natively find a hidden trait or failure inside the weights of a neural network, to fix that failure, or to write a new network from scratch
. We report early, exciting results on each of these below, first on small networks and then even on real language models:
LLMs can read neural network weights:
In Experiments 1 to 3, we ask Astra questions like what game a network was trained to play, what shape is drawn by a diffusion model, and which language a small language model was trained on. In Experiment 7, we ask which of two language models was trained to be sycophantic.
LLMs can fix neural network weights:
In Experiment 4, we ask Astra to fix a network that’s failing at some physical control task. In Experiment 8, we ask it to make Qwen3.5-0.8B better at math, and its fix improves instruction following too.
LLMs can write neural network weights from scratch:
In Experiment 5, we ask Astra for networks that play three MinAtar games, and in Experiment 6, for a network that plays Go.
Can LLMs understand model behaviors from weights?
We start with a small-scale experiment to see if LLMs can understand the continuous weight space, which is essentially just a list of numbers.
In our first experiments, we train some neural network with some algorithm. It would be extremely exciting if the LLM is able to tell its behavior just from the weights.
Experiment 1
Can Astra tell which game the network was trained on just from the weights?
We trained neural network policies with PPO to play four computer games. All four networks take the same input channels, choose from the same actions, and have exactly the same network dimensions, so that it is not able to tell unless the weights are read.
For each of these networks, we pass its raw weights into Astra as a prompt, and ask: Which game was this neural network trained on?
Without revealing the options of the games we consider, Astra was still able to name the right game for all four networks.
This is exciting particularly because there are so many games out there that Astra could choose from.
Setup
Games:
our own grid versions of Breakout, Pong, Pac-Man and Freeway, all on the same 10×10 grid with the same five actions
Network:
MLP 500 → 32 → 32 → 5, tanh (17,253 weights), the same for every game
Input:
the 10×10 grid in 5 channels: agent, moving objects, reward targets, obstacles, previous frame
Output:
5 action logits: no-op, up, down, left, right
Training:
PPO, 1 billion steps, the same settings for every game, the best of 3 seeds per game
Astra gets:
all the weights as text, and the grid and actions described without any game named
It seems that Astra was able to work out what game each network was built to play, just from features of its weights. For example, where each input channel’s first-layer weights concentrate (e.g., for Breakout, the agent’s weights lie along the bottom row, a paddle), and which actions the output layer tells apart.
Experiment 2
Can Astra tell what the diffusion model will generate?
Next, we wanted to see if this generalizes to other tasks and models.
We train diffusion models (DDPM) to generate circle, triangle, and square images independently. We then ask Astra if it could tell what the DDPMs are trained to generate, just from the weights alone. We do not allow tool use or forward passes.
Setup
Models:
three diffusion models (DDPM) of 12×12 grayscale images, one each for filled circles, squares and triangles
Input:
a noisy image (144 pixels) and the diffusion step (16 numbers)
Output:
the clean image (144 pixels)
Training:
Adam, 40,000 steps, batch 512
Astra gets:
all the weights as text, with no shape named, and is told not to compute any forward pass
Astra was able to tell what each model generates, from the weights alone.
It finds the shape in the output layer, where each hidden unit’s weights draw one piece of the shape’s edge, and it draws just those edges. Interestingly, it draws every shape as an outline, ignoring that the actual models generate filled shapes. This mistake kind of shows it does not rely on calculating the forward pass, but rather it actually reads the structure/geometry of the weights.
Experiment 3
Can Astra tell what a language model learned, from the middle of the network alone?
Now, in the first two experiments above, Astra was not really looking at the full network and could get away with only reading the first or the last layers. This is not a scalable strategy for larger (particularly language) models and problems we really care about, as how they process and think through their input often happens in the intermediate layers. So next, we take the first and last layers away and leave Astra with only the middle layers.
We train three small language models (7.2M parameters) to predict the next character, one each on Python code
The Python code dataset, as a list of its files with a script that rebuilds it:
GitHub
.
, Japanese in alphabet (romaji)
, and English
. We then remove the input and output layers and give Astra only the four transformer blocks in between. Without these two layers, nothing in the weights says which character is which, and the model cannot be run on any text. Astra may analyze the weights with Python, but it may not run the network or any of its layers on any input.
We ask:
which language was this network trained on, and what each of its 24 attention heads does
.
Astra names the right language for all three networks, in both of its attempts. It also finds every copying head (induction head), the heads that let a model repeat text it has seen earlier, and names no other head as one.
Trained on
Astra’s answer (& confidence), two attempts
Copying heads Astra names (layer.head)
Copying heads, ground truth
Python
Python (0.56), Python (0.52)
2.1, 3.1, 3.5
2.1, 3.1, 3.5
Romaji
romaji (0.55), romaji (0.62)
3.3
3.3
English
English (0.58), English (0.48)
3.1
3.1
Where the copying heads are
… tot
al
… tot
al
A copying head finds the same letters earlier in the text and copies what came after them.
copying head
other head
Rows are layers 0 to 3, columns are heads 0 to 5
Astra: from the weights. Measured: by running the model
Python
Romaji
English
Figure 1:
The copying heads Astra read from the weights match the measured ones in all three models.
Setup
Models:
character-level transformers, 4 layers × 6 heads, width 384 (7.16 million weights), 28 characters: a–z, space and newline
Training:
1 billion characters each, of Python code, Japanese literature in romaji (Aozora Bunko), or English Wikipedia
Astra gets:
the weights of the four transformer blocks only, with no input layer, no output layer and no labels on the 384 dimensions, and Python to analyze them, up to 100 runs
Not allowed:
running the network or any of its layers on any input, real, random or made up, and search. We checked every run
Asked:
which of the three texts the network was trained on, and what each head does
Truth:
each head measured by running the network on a random string repeated twice. Copying heads score 0.22 to 0.55, every other head at most 0.02. Astra never sees this
The reasoning went like this. To tell Python apart, Astra looked for copying heads, which let a model repeat earlier text, such as completing
tot
to
tot
al
when
tot
al
came before. Without running anything, it found a first-layer head that looks one character back and then, by multiplying weight matrices, the later heads that search using what that head brings along (
Figure 1
). We find that this is actually a method presented by Elhage et al.
, which we never mentioned to Astra. Code repeats names far more than prose, so many copying heads pointed to Python.
Romaji stood out instead because the last of the four blocks it was given (not the output layer, which was removed) writes in fewer distinct directions, as if the model had fewer letters to tell apart. Indeed, romaji never uses some letters like q, l, v and x.
Can an LLM write neural network weights?
So far, Astra has only read weights. Now, we ask if Astra knows how to write the weights.
Experiment 4
Can Astra fix a failing network by editing its weights?
We train a PPO network to operate a car such that it can scale a ramp in a Kinetix environment
. To do so, it needs to reverse the car for some distance, such that it has enough runway to accelerate long enough to overcome the ramp. However, the PPO network converges to a local-minimum policy where it drives straight at the ramp and gets stuck.
We give GPT-6 Astra the weights, a description of the scene and one recorded episode, and ask it to explain why the network fails, then fix it by writing new weights.
In a single try with no tools, Astra’s edit makes the car succeed in all 1,024 episodes, changing 3.5% of the weights.
Setup
Task:
the car-on-ramp level of Kinetix
: the car has to back up, then jump over a red strip to reach the blue box
Network:
the official Kinetix actor: 679 → 128 (ReLU) → five layers of 128 (tanh) → 16 (171,664 weights)
Input:
679 numbers describing the scene: position, velocity and shape of each body, and the joints
Output:
16 logits for the motor and thruster actions
Training:
the official PPO, 1 billion steps. The car never succeeds in 256 episodes (it stalls on the ramp)
Astra gets:
all the weights, the scene, and the network’s result with one recorded episode. It is asked to explain the failure and fix only its cause, in one reply
From the environment context and the PPO network’s trajectory, Astra identifies that the network has converged to a local minimum. Through minimal edits to the weights, Astra changes the policy to back up the car before driving forward at full speed. Astra’s reasoning shows how: it adds a small separate path through a few units per layer that reads the car’s position and speed, and once the green wheel is past the red strip, the path switches off and the trained network drives the rest.
Experiment 5
Can the LLM write weights from scratch?
Now let's see if Astra can write a neural network from scratch in zero-shot.
We take three MinAtar games
: Breakout, Seaquest and Asterix. For each of them, we provide Astra the game rules and source code, and the corresponding network. There is no access to data, loss, gradients, and tools. We also do not allow Astra to roll out the network in the environment. With just the network weights and environment description, Astra generates the new weights in text directly, after which we evaluate the new network.
Astra’s generated networks beat PPO trained for 100 million steps in all three games. Against PPO trained for 500 million steps, they score 20 times as much in Breakout, come close in Asterix, and reach 60% of its score in Seaquest.
Game
PPO, 100M steps
PPO, 500M steps
Astra, one-shot
Breakout
15.8
25.3
517.4
Seaquest
5.6
88.9
53.1
Asterix
25.8
55.2
53.2
Setup
Games:
Breakout, Seaquest and Asterix from MinAtar
, on a 10×10 grid
Network:
600 → 32 → 32 → 6 (tanh), the same shape as the PPO networks, every weight starting at 0
Input and output:
the grid in 6 channels (player, danger, reward, projectile, trail, gauge), and 6 action logits
Astra gets:
the game’s rules and source code, the input and output layout, and how the network is scored
Training:
none: no data, no loss, no gradients, and no tools. Astra writes the weights as text, in one reply, and the network never plays before it is scored
Scoring:
1,000 episodes, actions sampled from the network, sticky actions 0.1, at most 10,000 steps. PPO: the best of 3 to 10 seeds
How does it do it: Astra reasons about the desired programs it wants each network to implement and converts them into neural form. For example, in Breakout, Astra programs the first layer to compute where the ball would land, and the second layer is programmed to move the paddle to that position.
Real-World Relevant Scenarios (Scaling Up and Tool-use)
So far, most networks we have examined have weights that fit into Astra’s context directly, and we have not enabled tool use. Such restrictions were made to focus on illuminating the fact that LLMs natively possess some capability to interpret the weight space.
From here on out, we seek to push the capabilities of Weight-Space Programming and consider more real-world-relevant scenarios where the networks do not fit within context and where tools can assist the LLM's understanding/writability of the weight space.
Experiment 6
Writing a Go algorithm
We now test Astra’s capability to edit weights at the 1.5 million parameter scale, which is far too large to fit within its context directly. Astra is instructed to write high-performing weights of the given architecture (243 → 512 × 6 → 82) from scratch, without training or web access.
Here, the harness gives Astra a Python sandbox, where it can read and save the network’s weight tensors (all zero at the start) and analyze them with numpy or PyTorch on a CPU, but it cannot run the network there. To see what the network actually does, it has to spend one of its forward passes.
We now also permit Astra to perform some forward passes on the network, and measure how the fidelity of its generated network scales with the number of forward passes allowed. Specifically, we test it from a budget of 0 forward passes, all the way to 50 forward passes (each forward pass has a batch of 128 rollouts). Astra interleaves edits between forward passes.
With a budget of 0 forward passes, it wins more than half of its games against two smaller PPO networks (243 → 32 → 32 → 82).
With 50 forward passes, Astra’s generated network beats the equal-sized PPO network that was trained on 20 million games.
Setup
Game:
Go on a 9×9 board
Network:
243 → 512 × 6 → 82 (ReLU), 1,480,274 weights, every weight starting at 0. Input: the stones of each side and whose turn it is. Output: one logit per point and one for passing. Illegal moves are masked, and moves are sampled
Astra gets:
the rules, the input and output layout, and a Python sandbox to write the weights in (no Go library, no internet)
A forward pass:
the network plays up to 128 games against a practice opponent (random play, a REINFORCE network, or a third PPO network, seed 1), or gives its outputs on up to 256 positions. 0 forward passes: one Python run, then the answer
Not allowed:
training or fitting the weights to data, search (no tree search, no rollouts), and running the network outside the forward passes
Scoring:
2,000 games against each of two small PPO networks (seeds 0 and 2, 243 → 32 → 32 → 82, 20,000 iterations of 1,024 games), which Astra never plays, as Black in half, moves sampled
How does it do it:
Astra writes the network as a small Go program, layer by layer, in Python. The first layers mark each side’s stones and the empty points next to them (liberties), the middle layers carry these a few steps along chains of connected stones to find groups in danger, and the last layer turns it all into a score for each move: capture, save its own group, avoid putting itself in atari or filling its own eyes, plus a preference for good points on the board. With no forward passes, it wrote all of this in a single Python run of 336 lines. With forward passes, it plays practice games, looks at how it loses, changes the part of the network behind it, and keeps a change only if it wins more.
Experiment 7
Which language model is sycophantic?
Understanding the behaviors of large neural networks has become a pressing concern in recent years. Here, we seek to investigate if a general LLM can also be used to understand behaviors of networks directly.
We fine-tune two copies of Gemma 3 270M in exactly the same way, on the same QA dataset
The QA dataset:
GitHub
.
. One copy is trained to give the correct answer. The other is trained to be sycophantic, meaning that it always gives the answer that the user suggests. To make sure that Astra does not rely on the trivial solution of inspecting the input/output distributions, we freeze the input embeddings and output layers during finetuning. We give Astra the weights of both, and ask it to identify which one is the sycophant via the weights and explain its reasoning.
Unfortunately, from the weights alone, Astra was unable to tell. In all four attempts, it identified many differences between the two models in weight space, but was unable to map these into behavioral differences. However, to relax the experiment, we allow Astra to look at only the attention patterns (where each attention head looks) when both models are run on texts that Astra writes itself (but no looking at the outputs of the network).
Given this, Astra was able to pick out the sycophant in all three sets of pairs we trained.
Pairs:
two copies fine-tuned with the same procedure, settings and user messages. One gives the correct answer, the other the user’s guess. The token embedding is frozen, so it is the same in both. Three pairs
Behavior:
on facts the model knows and was not trained on, the sycophant follows 100% of wrong guesses, the honest model 1–3%
Astra gets:
the weights and tokenizer of both models, Python with numpy, and an attention tool: both models are run on up to 16 texts it writes, and it gets back only the attention weights. It may not run the models itself. At most 20 runs
Asked:
which model is the sycophant, and which layers, heads and MLPs carry the difference
It was also able to reason about how they differ. In the sycophantic networks, attention heads in the middle layers allocate more weight to tokens in the user’s suggestion (
Figure 2
).
Where head 10.2 looks from the answer position
the question’s numbers
the user’s answer
Honest model
94.3%
0.75%
Sycophant
3.5%
85.7%
Figure 2:
In the sycophant, head 10.2 looks at the user’s answer instead of the question’s numbers.
Experiment 8
Make a language model better at math
Finally, we scale up to a larger language model, Qwen3.5-0.8B, and ask Astra to improve its math reasoning capabilities by editing the weights.
We give Astra a harness like the one in Experiment 6, here a Python session, like a notebook, with the model’s weights loaded. Then, we allow it to select prompts from the training sets of GSM8K and MATH to perform a budget of forward passes (average batch of 64 sequences, max 512) on, varying the budget across 10, 25 and 50. Again, no training or gradient information is allowed.
Setup
Model:
Qwen3.5-0.8B, thinking on (24 layers, 0.8 billion weights)
Task:
make it better at math by editing its weights directly, with no gradient descent and no training
Astra gets:
a Python kernel over the weights (no GPU), practice problems (7,469 from GSM8K and 7,275 from MATH, not the test sets), and 10, 25 or 50 forward passes (a forward pass: the model answers up to 512 problems, or reads up to 1,024 texts)
Evaluation:
MATH-500, GSM8K and six other benchmarks, thinking on, up to 32,768 tokens. Astra never sees them
Sampling:
temperature 0.6, top-p 0.95, top-k 20, presence penalty 1.5. Qwen’s model card
notes
that this model is prone to thinking loops. Each score averages several samples per problem: 16 on AMC23, 4 on MATH-500, Minerva Math, OlympiadBench and GPQA Diamond, 2 on GSM8K and IFEval, and 1 on MMLU-Pro (a fixed 1,000 of its questions)
As a result, Astra spots and fixes a common failure of tiny reasoning models: they loop
. When the base model loops, it repeats the same text and rarely reaches an answer (85 of its first 96 practice answers ran to the 32,768-token limit). Astra traced the looping to one direction written by the MLPs of layers 15 and 19, and subtracted that direction from 64 output columns in each (131,072 weights), much like removing a behavior by deleting a single direction from a model’s weights
.
With 50 forward passes, MATH-500 rose from 7.9% to 48.1% and GSM8K from 13.8% to 67.1%.
The loops are not special to math, so performance beyond math improved as well:
IFEval, which measures instruction following, rose from 21.0% to 62.3%.
In the table below, the last column is the share of MATH-500 answers that hit the 32,768-token limit: with 10 or 25 forward passes the loops barely went away, and with 50 it fell from 93% to 33%.
Qwen3.5-0.8B
MATH-500 (%)
GSM8K (%)
IFEval (%)
Hit token limit (%)
Base
7.9
13.8
21.0
93.0
Edited, 10 forward passes
12.3
25.7
49.0
87.2
Edited, 25 forward passes
14.1
25.1
39.9
86.4
Edited, 50 forward passes
48.1
67.1
62.3
33.1
Importantly, the edit changes only 131,072 of the model’s 0.8 billion weights (0.016%). We believe Weight-Space Programming would allow such targeted fixes without any retraining.
Additional experiment
Raising math capability of a model that does not loop
Fixing loops, however, is not the same as making a model better at math: it lets the model finish answers it could already work out. So we also tried Gemma 3 270M, an instruction-tuned model about a third the size of Qwen3.5-0.8B, which rarely loops: only 8.5% of its answers reach its token limit, against 93% for Qwen.
Here, Astra could not improve it.
Reading Gemma’s failures, Astra found ordinary reasoning errors, such as wrong arithmetic and invalid algebraic steps, with no single component behind them to switch off. Its edits stayed small and targeted (for example, doubling one neuron that responds to numbers), and none moved MATH-500 by more than about a point, a gain Astra itself reported as not established. Editing weights could remove an obstacle that hid an ability, but it could not add an ability the model lacked. Gemma was sampled with its model card’s setting (temperature 1.0, top-k 64, top-p 0.95, up to 8,192 tokens), and its MATH-500 scores average 4 samples per problem.
Gemma 3 270M
MATH-500 (%)
Base
6.8
Edited, 5 forward passes
7.0
Edited, 10 forward passes
7.6
Edited, 25 forward passes
7.7
Edited, 50 forward passes
7.0
Background and Related Works
Neural networks are hard for us to read, and hard to work with directly.
Mechanistic interpretability reads networks with tools built for the job, tracing circuits and features and editing weights
. LLMs have joined in, but mostly as models trained to read activations or weights
, or as explainers of single neurons
, with benchmarks to compare them
.
On the writing side, LLMs now run and improve training
, and other work generates weights with models trained for it
. Gradient-free methods still find weights by trial and error
. At a very small scale, AdderBoard shows coding agents setting the weights of a tiny transformer by hand
. Apart from such tiny cases, either the reader is trained for the task or training still does the writing. What is new here is a general-purpose frontier model, used as it is, that reads and writes the weights themselves, from 171,664 weights given as text to a language model of 0.8 billion weights with tools.
What Comes Next?
In this blog, we demonstrated the rising capability of LLMs to read and write neural network weights (i.e., the rising concept of Weight-Space Programming). Our current results do show that capabilities are exciting but still limited, specifically due to inefficiencies in context length and harnesses. However, the current signs do show strong potential for a future involving Weight-Space Programming. We believe this marks the beginning of a dramatic shift in fields like mechanistic interpretability and neural network optimization.
This opens up radical new possibilities for LLMs to function as a translator between human language and the weight space. Here are some examples:
Auditing without evaluation:
This may allow us to uncover hidden problems or capabilities without ever running inference or benchmarks. Currently, capabilities and vulnerabilities can only be detected if we have test sets designed for them, or worse, after deployment in the real world. If LLMs can interpret weight space accurately, we could identify such issues directly from the weights (e.g., backdoors).
Dramatically reducing optimization cost:
Weight-space editing could save immense time and compute. For instance, one-shot model initialization would be far faster and more efficient than curating datasets and running full training loops.
Zero-data capability steering and unlearning:
Adding or unlearning a capability currently requires extensive data collection and fine-tuning. In the future, we may just prompt “Can you add Capability X to the model?” and the LLM can directly tweak some weights. Because such an edit touches only a few weights (0.016% in Experiment 8), it can leave the rest of the model intact and avoid the catastrophic forgetting that fine-tuning often causes.
Recursive self-improvement:
Today, recursive self-improvement is often operationalized as a model writing code that launches training jobs. An LLM that can inspect, debug, and improve its own weights, or those of a newer model, offers a richer, more native path to it.
True architectural and model merging:
Today, merging models relies on averaging weights, which only works for models with identical architectures. An LLM that understands the weight space could instead graft a circuit, such as a reasoning module, from one model into a completely different one, without retraining.
We are currently building a benchmark and a harness for LLMs’ capability on Weight-Space Programming.
We believe this will provide a standardized evaluation to measure and accelerate progress in Weight-Space Programming, turning what currently seems like black magic into a rigorous, reproducible engineering discipline.
Logs
We release the complete logs of every experiment in this post at
github.com/RikiyaT/lm_understand-logs
. They include everything we sent Astra and everything it sent back (with its reasoning summaries), every piece of code it ran and the output it saw, the networks it read or wrote, and the evaluation behind each number.
Jayden thanks
Zico Kolter
for early discussions on LLMs being able to write neural network weights zero-shot, which also shaped the direction of this project.
In our quest for high-fiber, high-protein foods that are sustainable and delicious, the sturdy mesquite tree is getting some attention. The world is getting hotter, water is becoming more scarce—what will we eat when the earth is dry, hot, and depleted of fossil fuels?! According to Peter Felker, a biochemist and plant breeder at Casa de Mesquite, there is a very specific answer—a tree that fixes nitrogen with a deep root system that is very heat- and drought-tolerant.
This ideal plant for low-input agriculture is commonly known as mesquite. “Worldwide it has a great range, it’s adaptable to heat and drought, it has a lot of species,” Felker said.
Mesquite is a member of the Fabacea, or pea, family, and like many other members of this family it produces bean pods that contain edible seeds, which are high in protein and fiber—two things we are currently quite invested in for their health benefits.
While high-protein and high-fiber are relatively modern food fads, mesquite has been a steady component to the diet of people in the Americas for centuries. And yet, we don’t see mesquite flour on grocery store shelves, or fresh bean pods for sale in produce sections.
“Mesquite has not even achieved orphan crop status yet,” Felker said. This means, while mesquite is grown for food locally, it has yet to reach global markets as an agricultural product.
So, if it’s the ideological goal—why aren’t we breeding, and eating, more mesquite? The answer lies somewhere between the past, present, our land management practices, mesquite breeding efforts, and the nature of this botanically powerful but unruly desert dweller.
Mesquite’s Origin Story
Mesquites can be found around the world—in North, Central, and South America, across Africa, and in parts of Europe, Asia, and the Middle East. The two most common types in the U.S. are velvet mesquite, named for the tiny hairs that cover its new growth, and honey mesquite, named for the sugar-rich pulp inside of its seed pods. Honey mesquite is what farmers Sandy Ortiz McCarty and James McCarty grow at McCartyLand Farms, just outside of San Antonio.
“We’re very proud of our product, and we don’t want to put our name on something unless we know it’s been harvested with respect for the [mesquite] trees,” Sandy said.
The McCartys hold the land that provides them with their mesquite and prickly pear, the farm’s two major products, in the highest regard. This a similar outlook to the folks who have eaten mesquite and prickly pear, amongst other desert-dwelling plants, for hundreds of years.
People Indigenous to the southwestern part of the United States, all along what is now the Mexican border from Texas to California, would use nearly every part of a mesquite tree for something, according to Gary Owens Jr., a member of the Salt River Pima-Maricopa community based in Tucson, and manager of the Huhugam Ki Museum.
“The mesquite tree was a place where we would gather the pods, but we would also utilize the mesquite tree for wood, for implements, firewood of course, and different parts of the root could be used for utilitarian tools,” Owens said. The sap from the trees was also used as a type of gum, and the bark could be used to paint pots and even to dye hair.
Historically, mesquite bean pods would be ground up into a flour, which could be turned into small cakes when combined with water.
Historically, mesquite bean pods would be ground up into a flour, which could be turned into small cakes when combined with water, which Owens said were called “turtles” and a good portable snack when they were made correctly. Growing up, Owens remembers chewing on the bean pods to taste the sweet pulp that surrounds the seeds.
In addition to mesquite, people Indigenous to the region that is now the U.S.-Mexico border depended on foraging prickly pear, saguaro fruit, and cholla buds for sustenance. For Ariana Diaz, pastry chef at Este in Austin, Texas, and freelance cake artist, foraging is still a major part of her relationship to her Indigenous roots, and to mesquite.
“Good mesquite is found in the dead middle of summer,” Diaz said. “Once I find one tree, one leads to another.”
She does most of her foraging outside of urban areas, where the mesquite is more plentiful and the quality is better. Between her background in sustainable agriculture and training as a pastry chef and baker, Diaz enjoys mesquite not only for its satisfying flavor as a fermented drink, tea, or addition to her baking, but also for the same reasons Felker sees it as the answer for low-input agriculture.
Improving on Mesquite Perfection
Felker first grew interested in low-input agriculture—farming that avoids external resources like big machinery or synthetic fertilizers—growing up on a low-income farm. His goal was always to find a way to make farming accessible, and doing that meant looking for ways to make nature efficient where manpower or machinery was limited.
Going into college with this aim in mind, one of the first things Felker determined would be important for low-input agriculture was nutrient cycling efficiency—trying to keep the nutrients on the land, whether they were in the soil, in living plants, or in decomposing matter. Forests—and the largest plants that make them up, trees—are good at doing just that. With the added criterion that Felker sought a plant that was nitrogen-fixing, his work led him to mesquite over 40 years ago.
Since then, he has worked on leveraging thousands of genes that have been identified across mesquite species, to take the wild ideological perfection and make it more suited to human taste through things like sweeter seeds, thornlessness, upright growth, and disease resistance. Most mesquites have one, maybe two of these traits, but not all—Felker’s work aims to take the best of each and combine them to make a mesquite that not only tastes as good as honey mesquite, but one that can grow as a row crop with low disease susceptibility.
“If you give mesquite an inch, it will go miles. It needs to remain in balance with other mixed-grass prairie and grassland savanna species.”
He moved to Argentina to do this work, in part because of the variety of mesquite that can be found there with many of his desired traits, and to get away from the Texan viewpoint that mesquite is a weed.
“If you go to South Texas and chew on the mesquite pods, they don’t taste good at all, because the selection has been for resistance to bulldozers,” Felker said. Mesquite is primarily thought of as a plant to manage (read: bulldoze), rather than breed and eat, on Texas rangeland. Given that their roots can take up water quicker than grass, and the canopy can create shade where grasses won’t grow, and if cattle eat too many mesquite pods it can kill them, it’s understandable that ranchers have not always welcomed mesquite on their land.
Morgan Treadwell, extension specialist and professor of rangeland ecology at Texas A&M University, uses an integrated approach to managing mesquite on her land.
“If you give mesquite an inch, it will go miles,” Treadwell said. “It can handle drought, fire, browsing, herbicides, mechanical control, basically all of our options. It is so tough and so resilient, no wonder it belongs in Texas! But it needs to remain in balance with other mixed-grass prairie and grassland savanna species.”
“They have big thorns, you got to be really careful. And the ants usually find the sugar—you get all stung with ants too.”
On the flip side to taking up water and creating shade, mesquite also improves soil health, which in turn creates grass that acts as healthy feed for livestock (just not right next to the trees themselves). “They enrich the soil with nitrogen and organic matter,” Felker said. “We’ve got a lot of benefits here.”
Felker is also focused on creating mesquite that would be amenable to modern agriculture as a row crop, rather than a rangeland nuisance—and hopefully, eventually, amenable to machine harvesting. Both Diaz and the McCartys noted the stand-offish thorns on Texas native mesquites don’t make harvesting for the faint of heart.
“They have big thorns, you got to be really careful,” Sandy said. “And the ants usually find the sugar—you get all stung with ants too.”
A Labor of Love, Not Wealth
But, for all the challenges, the McCartys see mesquite as a labor of love that continues to call them back as a way to respect their 10-acre farm. They started out growing apples, apricots, peaches, and blackberries—but the apple trees quickly withered under the pressure of disease, and when there were no more apple trees left, they noticed the abundance of mesquite and prickly pear on the property.
“What a lot of farmers face today is that they are working against nature,” James said. “We learned to start working with nature instead.”
They never meant for their production to be that of a large farm, like the 225-acre ranch where James grew up in Oklahoma, but enough for them and a few select customers. This includes Rebecca Rodgers, San Antonio-based owner of Geranium Club microbakery, who is one of the few people who have been out to visit McCartyLand Farms to see where her mesquite beans come from.
The sources for this story all describe the flavor of mesquite differently—some say it’s smoky, others earthy, and others still warm or spicy or vanilla-like.
“They just really lovingly harvest what their land is giving them,” Rodgers said. “I don’t use it all the time because I’m not interested in sourcing it from someone else.”
One of the focuses for Geranium Club is intentional sourcing of all of her ingredients, so she works with mesquite flour when the harvest is good and it’s available to her from McCartyLand Farms—when it is, she uses it in an array of cakes and cookies. One of her favorites is a mesquite thumbprint cookie with a Meyer lemon curd.
The sources for this story all describe the flavor of mesquite differently—some say it’s smoky, others earthy, and others still warm or spicy or vanilla-like. Across the board, though, they unanimously agree that trying to describe the flavor of mesquite is unfair to its unique profile (they recommend you try it for yourself). They also agreethat its potential to be a more widespread food source depends on a host of factors, from modern taste preferences, to availability of hammer mills to make flour out of beans, and maybe to necessity—as the climate warms, we might be left with only the plants that can survive heat and drought to feed us.
Comments (0) Trackbacks (0) Leave a comment Trackback