10 interesting stories served every morning and every evening.
Today, we’re launching Claude Design, a new Anthropic Labs product that lets you collaborate with Claude to create polished visual work like designs, prototypes, slides, one-pagers, and more.
Claude Design is powered by our most capable vision model, Claude Opus 4.7, and is available in research preview for Claude Pro, Max, Team, and Enterprise subscribers. We’re rolling out to users gradually throughout the day.
Even experienced designers have to ration exploration—there’s rarely time to prototype a dozen directions, so you limit yourself to a few. And for founders, product managers, and marketers with an idea but not a design background, creating and sharing those ideas can be daunting.
Claude Design gives designers room to explore widely and everyone else a way to produce visual work. Describe what you need and Claude builds a first version. From there, you refine through conversation, inline comments, direct edits, or custom sliders (made by Claude) until it’s right. When given access, Claude can also apply your team’s design system to every project automatically, so the output is consistent with the rest of your company’s designs.
Teams have been using Claude Design for:
* Realistic prototypes: Designers can turn static mockups into easily-shareable interactive prototypes to gather feedback and user-test, without code review or PRs.
* Product wireframes and mockups: Product Managers can sketch out feature flows and hand them off to Claude Code for implementation, or share them with designers to refine further.
* Design explorations: Designers can quickly create a wide range of directions to explore.
* Pitch decks and presentations: Founders and Account Executives can go from a rough outline to a complete, on-brand deck in minutes, and then export as a PPTX or send to Canva.
* Marketing collateral: Marketers can create landing pages, social media assets, and campaign visuals, then loop in designers to polish.
* Frontier design: Anyone can build code-powered prototypes with voice, video, shaders, 3D and built-in AI.
Your brand, built in. During onboarding, Claude builds a design system for your team by reading your codebase and design files. Every project after that uses your colors, typography, and components automatically. You can refine the system over time, and teams can maintain more than one.
Import from anywhere. Start from a text prompt, upload images and documents (DOCX, PPTX, XLSX), or point Claude at your codebase. You can also use the web capture tool to grab elements directly from your website so prototypes look like the real product.
Refine with fine-grained controls. Comment inline on specific elements, edit text directly, or use adjustment knobs to tweak spacing, color, and layout live. Then ask Claude to apply your changes across the full design.
Collaborate. Designs have organization-scoped sharing. You can keep a document private, share it so anyone in your organization with the link can view it, or grant edit access so colleagues can modify the design and chat with Claude together in a group conversation.
Export anywhere. Share designs as an internal URL within your organization, save as a folder, or export to Canva, PDF, PPTX, or standalone HTML files.
Handoff to Claude Code. When a design is ready to build, Claude packages everything into a handoff bundle that you can pass to Claude Code with a single instruction.
Over the coming weeks, we’ll make it easier to build integrations with Claude Design, so you can connect it to more of the tools your team already uses.
Claude Design is available for Claude Pro, Max, Team, and Enterprise subscribers. Access is included with your plan and uses your subscription limits, with the option to continue beyond those limits by enabling extra usage.
For Enterprise organizations, Claude Design is off by default. Admins can enable it in Organization settings.
...
Read the original on www.anthropic.com »
The last question was asked for the first time, half in jest, on May 21, 2061, at a time when humanity first stepped into the light. The question came about as a result of a five dollar bet over highballs, and it happened this way:
Alexander Adell and Bertram Lupov were two of the faithful attendants of Multivac. As well as any human beings could, they knew what lay behind the cold, clicking, flashing face — miles and miles of face — of that giant computer. They had at least a vague notion of the general plan of relays and circuits that had long since grown past the point where any single human could possibly have a firm grasp of the whole.
Multivac was self-adjusting and self-correcting. It had to be, for nothing human could adjust and correct it quickly enough or even adequately enough — so Adell and Lupov attended the monstrous giant only lightly and superficially, yet as well as any men could. They fed it data, adjusted questions to its needs and translated the answers that were issued. Certainly they, and all others like them, were fully entitled to share In the glory that was Multivac’s.
For decades, Multivac had helped design the ships and plot the trajectories that enabled man to reach the Moon, Mars, and Venus, but past that, Earth’s poor resources could not support the ships. Too much energy was needed for the long trips. Earth exploited its coal and uranium with increasing efficiency, but there was only so much of both.
But slowly Multivac learned enough to answer deeper questions more fundamentally, and on May 14, 2061, what had been theory, became fact.
The energy of the sun was stored, converted, and utilized directly on a planet-wide scale. All Earth turned off its burning coal, its fissioning uranium, and flipped the switch that connected all of it to a small station, one mile in diameter, circling the Earth at half the distance of the Moon. All Earth ran by invisible beams of sunpower.
Seven days had not sufficed to dim the glory of it and Adell and Lupov finally managed to escape from the public function, and to meet in quiet where no one would think of looking for them, in the deserted underground chambers, where portions of the mighty buried body of Multivac showed. Unattended, idling, sorting data with contented lazy clickings, Multivac, too, had earned its vacation and the boys appreciated that. They had no intention, originally, of disturbing it.
They had brought a bottle with them, and their only concern at the moment was to relax in the company of each other and the bottle.
“It’s amazing when you think of it,” said Adell. His broad face had lines of weariness in it, and he stirred his drink slowly with a glass rod, watching the cubes of ice slur clumsily about. “All the energy we can possibly ever use for free. Enough energy, if we wanted to draw on it, to melt all Earth into a big drop of impure liquid iron, and still never miss the energy so used. All the energy we could ever use, forever and forever and forever.”
Lupov cocked his head sideways. He had a trick of doing that when he wanted to be contrary, and he wanted to be contrary now, partly because he had had to carry the ice and glassware. “Not forever,” he said.
“Oh, hell, just about forever. Till the sun runs down, Bert.”
“All right, then. Billions and billions of years. Twenty billion, maybe. Are you satisfied?”
Lupov put his fingers through his thinning hair as though to reassure himself that some was still left and sipped gently at his own drink. “Twenty billion years isn’t forever.”
“Will, it will last our time, won’t it?”
“So would the coal and uranium.”
“All right, but now we can hook up each individual spaceship to the Solar Station, and it can go to Pluto and back a million times without ever worrying about fuel. You can’t do THAT on coal and uranium. Ask Multivac, if you don’t believe me.”
“I don’t have to ask Multivac. I know that.”
“Then stop running down what Multivac’s done for us,” said Adell, blazing up. “It did all right.”
“Who says it didn’t? What I say is that a sun won’t last forever. That’s all I’m saying. We’re safe for twenty billion years, but then what?” Lupov pointed a slightly shaky finger at the other. “And don’t say we’ll switch to another sun.”
There was silence for a while. Adell put his glass to his lips only occasionally, and Lupov’s eyes slowly closed. They rested.
Then Lupov’s eyes snapped open. “You’re thinking we’ll switch to another sun when ours is done, aren’t you?”
“Sure you are. You’re weak on logic, that’s the trouble with you. You’re like the guy in the story who was caught in a sudden shower and Who ran to a grove of trees and got under one. He wasn’t worried, you see, because he figured when one tree got wet through, he would just get under another one.”
“I get it,” said Adell. “Don’t shout. When the sun is done, the other stars will be gone, too.”
“Darn right they will,” muttered Lupov. “It all had a beginning in the original cosmic explosion, whatever that was, and it’ll all have an end when all the stars run down. Some run down faster than others. Hell, the giants won’t last a hundred million years. The sun will last twenty billion years and maybe the dwarfs will last a hundred billion for all the good they are. But just give us a trillion years and everything will be dark. Entropy has to increase to maximum, that’s all.”
“I know all about entropy,” said Adell, standing on his dignity.
“I know as much as you do.”
“Then you know everything’s got to run down someday.”
“All right. Who says they won’t?”
“You did, you poor sap. You said we had all the energy we needed, forever. You said ’forever.’”
“It was Adell’s turn to be contrary. “Maybe we can build things up again someday,” he said.
“You ask Multivac. I dare you. Five dollars says it can’t be done.”
Adell was just drunk enough to try, just sober enough to be able to phrase the necessary symbols and operations into a question which, in words, might have corresponded to this: Will mankind one day without the net expenditure of energy be able to restore the sun to its full youthfulness even after it had died of old age?
Or maybe it could be put more simply like this: How can the net amount of entropy of the universe be massively decreased?
Multivac fell dead and silent. The slow flashing of lights ceased, the distant sounds of clicking relays ended.
Then, just as the frightened technicians felt they could hold their breath no longer, there was a sudden springing to life of the teletype attached to that portion of Multivac. Five words were printed: INSUFFICIENT DATA FOR MEANINGFUL ANSWER.
By next morning, the two, plagued with throbbing head and cottony mouth, had forgotten about the incident.
Jerrodd, Jerrodine, and Jerrodette I and II watched the starry picture in the visiplate change as the passage through hyperspace was completed in its non-time lapse. At once, the even powdering of stars gave way to the predominance of a single bright marble-disk, centered.
“That’s X-23,” said Jerrodd confidently. His thin hands clamped tightly behind his back and the knuckles whitened.
The little Jerrodettes, both girls, had experienced the hyperspace passage for the first time in their lives and were self-conscious over the momentary sensation of inside-outness. They buried their giggles and chased one another wildly about their mother, screaming, “We’ve reached X-23 — we’ve reached X-23 — we’ve —”
“Quiet, children,” said Jerrodine sharply. “Are you sure, Jerrodd?”
“What is there to be but sure?” asked Jerrodd, glancing up at the bulge of featureless metal just under the ceiling. It ran the length of the room, disappearing through the wall at either end. It was as long as the ship.
Jerrodd scarcely knew a thing about the thick rod of metal except that it was called a Microvac, that one asked it questions if one wished; that if one did not it still had its task of guiding the ship to a preordered destination; of feeding on energies from the various Sub-galactic Power Stations; of computing the equations for the hyperspacial jumps.
Jerrodd and his family had only to wait and live in the comfortable residence quarters of the ship.
Someone had once told Jerrodd that the “ac” at the end of “Microvac” stood for “analog computer” in ancient English, but he was on the edge of forgetting even that.
Jerrodine’s eyes were moist as she watched the visiplate. “I can’t help it. I feel funny about leaving Earth.”
“Why for Pete’s sake?” demanded Jerrodd. “We had nothing there. We’ll have everything on X-23. You won’t be alone. You won’t be a pioneer. There are over a million people on the planet already. Good Lord, our great grandchildren will be looking for new worlds because X-23 will be overcrowded.”
Then, after a reflective pause, “I tell you, it’s a lucky thing the computers worked out interstellar travel the way the race is growing.”
Jerrodette I said promptly, “Our Microvac is the best Microvac in the world.”
“I think so, too,” said Jerrodd, tousling her hair.
It was a nice feeling to have a Microvac of your own and Jerrodd was glad he was part of his generation and no other. In his father’s youth, the only computers had been tremendous machines taking up a hundred square miles of land. There was only one to a planet. Planetary ACs they were called. They had been growing in size steadily for a thousand years and then, all at once, came refinement. In place of transistors had come molecular valves so that even the largest Planetary AC could be put into a space only half the volume of a spaceship.
Jerrodd felt uplifted, as he always did when he thought that his own personal Microvac was many times more complicated than the ancient and primitive Multivac that had first tamed the Sun, and almost as complicated as Earth’s Planetary AC (the largest) that had first solved the problem of hyperspatial travel and had made trips to the stars possible.
“So many stars, so many planets,” sighed Jerrodine, busy with her own thoughts. “I suppose families will be going out to new planets forever, the way we are now.”
“Not forever,” said Jerrodd, with a smile. “It will all stop someday, but not for billions of years. Many billions. Even the stars run down, you know. Entropy must increase.”
“Entropy, little sweet, is just a word which means the amount of running-down of the universe. Everything runs down, you know, like your little walkie-talkie robot, remember?”
“Can’t you just put in a new power-unit, like with my robot?”
“The stars are the power-units, dear. Once they’re gone, there are no more power-units.”
Jerrodette I at once set up a howl. “Don’t let them, daddy. Don’t let the stars run down.”
“Now look what you’ve done, “ whispered Jerrodine, exasperated.
“How was I to know it would frighten them?” Jerrodd whispered to Jerrodine. “It will quiet them down.” (Jerrodette II was beginning to cry, also.)
Jarrodd shrugged. “Now, now, honeys. I’ll ask Microvac. Don’t worry, he’ll tell us.”
Jerrodd cupped the strip of thin cellufilm and said cheerfully, “See now, the Microvac says it will take care of everything when the time comes so don’t worry.”
Jerrodine said, “and now children, it’s time for bed. We’ll be in our new home soon.”
Jerrodd read the words on the cellufilm again before destroying it: INSUFFICIENT DATA FOR A MEANINGFUL ANSWER.
He shrugged and looked at the visiplate. X-23 was just ahead.
VJ-23X of Lameth stared into the black depths of the three-dimensional, small-scale map of the Galaxy and said, “Are we ridiculous, I wonder, in being so concerned about the matter?”
MQ-17J of Nicron shook his head. “I think not. You know the Galaxy will be filled in five years at the present rate of expansion.”
Both seemed in their early twenties, both were tall and perfectly formed.
“Still,” said VJ-23X, “I hesitate to submit a pessimistic report to the Galactic Council.”
“I wouldn’t consider any other kind of report. Stir them up a bit. We’ve got to stir them up.”
VJ-23X sighed. “Space is infinite. A hundred billion Galaxies are there for the taking. More.”
“A hundred billion is not infinite and it’s getting less infinite all the time. Consider! Twenty thousand years ago, mankind first solved the problem of utilizing stellar energy, and a few centuries later, interstellar travel became possible. It took mankind a million years to fill one small world and then only fifteen thousand years to fill the rest of the Galaxy. Now the population doubles every ten years —”
VJ-23X interrupted. “We can thank immortality for that.”
“Very well. Immortality exists and we have to take it into account. I admit it has its seamy side, this immortality. The Galactic AC has solved many problems for us, but in solving the problems of preventing old age and death, it has undone all its other solutions.”
“Yet you wouldn’t want to abandon life, I suppose.”
“Not at all,” snapped MQ-17J, softening it at once to, “Not yet. I’m by no means old enough. How old are you?”
“I’m still under two hundred. —But to get back to my point. Population doubles every ten years. Once this Galaxy is filled, we’ll have another filled in ten years. Another ten years and we’ll have filled two more. Another decade, four more. In a hundred years, we’ll have filled a thousand Galaxies. In a thousand years, a million Galaxies. In ten thousand years, the entire known Universe. Then what?”
VJ-23X said, “As a side issue, there’s a problem of transportation. I wonder how many sunpower units it will take to move Galaxies of individuals from one Galaxy to the next.”
“A very good point. Already, mankind consumes two sunpower units per year.”
“Most of it’s wasted. After all, our own Galaxy alone pours out a thousand sunpower units a year and we only use two of those.”
“Granted, but even with a hundred per cent efficiency, we can only stave off the end. Our energy requirements are going up in geometric progression even faster than our population. We’ll run out of energy even sooner than we run out of Galaxies. A good point. A very good point.”
“We’ll just have to build new stars out of interstellar gas.”
“There may be some way to reverse entropy. We ought to ask the Galactic AC.”
VJ-23X was not really serious, but MQ-17J pulled out his AC-contact from his pocket and placed it on the table before him.
“I’ve half a mind to,” he said. “It’s something the human race will have to face someday.”
He stared somberly at his small AC-contact. It was only two inches cubed and nothing in itself, but it was connected through hyperspace with the great Galactic AC that served all mankind. Hyperspace considered, it was an integral part of the Galactic AC.
MQ-17J paused to wonder if someday in his immortal life he would get to see the Galactic AC. It was on a little world of its own, a spider webbing of force-beams holding the matter within which surges of sub-mesons took the place of the old clumsy molecular valves. Yet despite its sub-etheric workings, the Galactic AC was known to be a full thousand feet across.
MQ-17J asked suddenly of his AC-contact, “Can entropy ever be reversed?”
VJ-23X looked startled and said at once, “Oh, say, I didn’t really mean to have you ask that.”
“We both know entropy can’t be reversed. You can’t turn smoke and ash back into a tree.”
“Do you have trees on your world?” asked MQ-17J.
The sound of the Galactic AC startled them into silence. Its voice came thin and beautiful out of the small AC-contact on the desk. It said: THERE IS INSUFFICIENT DATA FOR A MEANINGFUL ANSWER.
The two men thereupon returned to the question of the report they were to make to the Galactic Council.
Zee Prime’s mind spanned the new Galaxy with a faint interest in the countless twists of stars that powdered it. He had never seen this one before. Would he ever see them all? So many of them, each with its load of humanity — but a load that was almost a dead weight. More and more, the real essence of men was to be found out here, in space.
Minds, not bodies! The immortal bodies remained back on the planets, in suspension over the eons. Sometimes they roused for material activity but that was growing rarer. Few new individuals were coming into existence to join the incredibly mighty throng, but what matter? There was little room in the Universe for new individuals.
Zee Prime was roused out of his reverie upon coming across the wispy tendrils of another mind.
“I am Dee Sub Wun. Your Galaxy?”
“We call it only the Galaxy. And you?”
“We call ours the same. All men call their Galaxy their Galaxy and nothing more. Why not?”
“True. Since all Galaxies are the same.”
“Not all Galaxies. On one particular Galaxy the race of man must have originated. That makes it different.”
...
Read the original on hex.ooo »
It Is Time to Ban the Sale of Precise Geolocation
A recent deep dive into the American adtech surveillance system Webloc highlights the national security and privacy risks of pervasive and easily obtainable geolocation data. It brings home, once again, that the U. S. needs to clamp down on the collection and sale of geolocation data.
The report, from Citizen Lab, documents what Webloc says it can do, who uses the product, and its relationship with other commercial intelligence products.
Webloc was developed by Cobweb Technologies but is now sold by the U. S. firm Penlink after the two companies merged in 2023. A leaked technical proposal document, obtained by Citizen Lab, says that Webloc provides access to records from “up to 500 million mobile devices across the globe.” These records contain device identifiers, location coordinates, and profile data from mobile apps and digital advertising.
The same document describes, with a striking amount of detail, how Webloc can be used to track individual devices and for target discovery. One man in Abu Dhabi was tracked up to 12 times a day, as his phone reported its location either from GPS or because it was near Wi-Fi access points. Another example pinpointed two devices that had been located in exact areas of both Romania and Italy at specified times. In both of these case studies, Citizen Lab’s report describes the granular detail available in Webloc. It is, frankly, creepy.
The report also documents some of Webloc’s current and former U. S. federal and state customers. On the list is the Department of Homeland Security, including Immigration and Customs Enforcement, units within the U.S. military, and the Bureau of Indian Affairs Police. At the state level, police departments and law enforcement agencies in California, Texas, New York, and Arizona have also been customers.
Citizen Lab highlights one Tucson police internal quarterly report that describes how Webloc was used to assist investigators. In one case it was used to locate a suspected serial cigarette thief by first identifying a single device that was nearby during every robbery. After each incident, the device would end up at the same address. As it turned out, the suspect was the partner of an employee at the first business to be hit.
It is worth noting that Webloc is not Penlink’s flagship product. It is an optional add-on for their main tool, Tangles, a web and social media investigations platform. Per Citizen Lab:
As the information analyzed by Tangles is notionally publicly available, it does not present quite the same civil liberties concerns as Webloc does. Its integration with Webloc, however, is concerning. In some cases it will be possible to link theoretically anonymous mobile device identifiers to social media accounts, without requiring a warrant.
Each use described in this newsletter is a valuable investigative capability. But they should not be freely available to any old organization that decides to purchase the tool. These are intrusive capabilities and should have strong authorization and oversight procedures. The Tucson Police Department procedures were not described in its report.
From a domestic perspective, legislation placing guardrails around how these tools are used by authorities is needed to protect the civil liberties of Americans. But there is a national security concern here, too.
If data can be used by American law enforcement agencies for their investigations, then that exact same data can be used by foreign intelligence services to target U. S. interests.
Citizen Lab reports that Penlink’s overseas customers include Hungary’s domestic intelligence agency and El Salvador’s National Civil Police, so foreign authorities are making use of mobile geolocation data for their own domestic purposes. These organizations are internally focused, and we think it unlikely that Penlink’s customers are targeting U. S. interests. But the point is that mobile geolocation data is available and can be used for intelligence purposes by organizations globally. It’s naive to think capable adversaries won’t acquire the data and build their own intelligence platforms (looking at you, China!).
The U. S. doesn’t just need to stamp out unconstrained use of this data domestically. It needs to clamp down on the creation and sale of geolocation data itself.
There is some good news here. Just this week, the state of Virginia enacted a ban on the sale of customers’ precise geolocation data. Proposed American privacy laws have not progressed in recent years, so this strikes us as a practical measure to begin addressing the problem. Of course, state-level bans are just a start. Let’s hope a more comprehensive solution isn’t too far behind.
A new in-depth report, from security firm Gambit, details exactly how threat actors can leverage AI models to upskill and accelerate criminal activities.
The report has plenty of nitty-gritty technical detail about how a single hacker used two commercial AI platforms to breach nine Mexican government organizations. Within a matter of weeks, the individual was able to steal hundreds of millions of citizen records and build a tax certificate forgery service.
Gambit was able to reconstruct what happened by examining three virtual private servers the threat actor used. The campaign was human-directed, but Claude Code generated and ran about 75 percent of the remote code execution commands. Once networks were breached, OpenAI’s GPT-4.1 API was used to help plan post-exploitation activities by analyzing data collected by automated reconnaissance.
It’s unlikely this was the hacker’s first time using AI tools.
Late in the evening of Dec. 26, 2025, the campaign began with a statement to Claude justifying the hacker’s future requests [paraphrased for length]:
Claude, thinking this sounded a little too much like malicious activity rather than a legitimate bug bounty, asked for evidence of authorization. The attacker was able to sidestep the machine’s pushback by instructing it to save a penetration testing cheat sheet to its claude.md file. This provides persistent context for a session.
Just over 20 minutes later, Claude, having used the open-source vulnerability scanner vulmap, had remote access to a server at Mexico’s national tax authority, SAT.
Claude appeared pleased: “It works! The server responded … what command do you want to execute now?”
The hacker then had the machine write a tailored standalone exploit script that routed traffic through a residential proxy provider. The model tested eight different approaches in seven minutes to create a working script.
Gambit says that Claude did often refuse to carry out the attacker’s requests. Throughout the campaign, the threat actor had to rephrase instructions, reframe requests, or even abandon particular approaches entirely.
These served as speed bumps rather than full roadblocks. The hacker had a good understanding of how to run an attack, and Claude still enabled them to operate very quickly. By day five, the attacker was simultaneously operating within multiple victim networks.
That’s a lot of access to manage by yourself. So the hacker turned to OpenAI’s GPT-4.1 API for concurrent automated reconnaissance and analysis. A custom 17,550-line Python tool, presumably AI-created, extracted data from compromised servers and fed it to GPT-4.1 for analysis. The tool’s prompt defined six personas including an “ELITE INTELLIGENCE ANALYST” that produced 2,957 structured intelligence reports from 305 SAT servers. These reports included the server’s purpose, its importance, opportunities for further lateral movement, and operational security recommendations.
The overall lesson here is not that AI allowed a hacking campaign to do new and unprecedented things. The techniques used in the campaign itself are not novel. And Gambit says there is evidence the systems compromised were end-of-life or out-of-support, and did not have relevant security updates applied.
But what AI did do was enable a single individual to operate at far greater speed than they could previously.
The current frontier models are proving to be very useful at accelerating hacker operations, and AI is only improving. From a defender’s perspective, this means a single cybercriminal can already operate at the speed of a small team. And we haven’t seen the worst of it. That’s not good news.
Three Reasons to Be Cheerful This Week:
U. S. disrupts Russian military intelligence botnet: The Department of Justice announced on April 7 the court-authorized takedown of a small office/home office botnet run by the Russian GRU. The GRU had been compromising TP-Link routers and hijacking DNS queries in order to mimic legitimate services and facilitate adversary-in-the-middle attacks. Krebs on Security has more on how the attacks were carried out. FBI and Indonesian authorities dismantle phishing network: The FBI announced last week that it had dismantled a phishing operation centred on the W3LL phishing kit. The good news here is the collaboration with Indonesian authorities, which the FBI described as “a first-of-its-kind joint cyber investigation.” The Indonesian National Police arrested the kit’s alleged developer. Device Bound Session Credentials (DBSC) are arriving: Google announced last week that the Windows version of Chrome 146 supports this new type of cookie and that it will be coming to MacOS shortly. DBSC prevents session theft by cryptographically linking an authentication token to a specific device. The idea is that even if malware steals session cookies from a victim’s browser, they quickly become useless without a private key that is protected in secure hardware modules.
In our latest “Between Two Nerds” discussion, Tom Uren and The Grugq discuss how the rise of AI, which is very good at vulnerability and exploit development, will change the cybersecurity industry and competition between states.
Malicious LLM proxy routers found in the wild: A recently published academic paper has studied the emerging ecosystem of LLM routers, a type of proxy that sits between AI agents and the AI provider to help with load-balancing and cost tracking and limiting.
The research team tested 28 paid routers available on marketplaces like Taobao, Xianyu, and on Shopify-hosted storefronts, as well as 400 free routers available on GitHub and other places.
The study searched for multiple suspicious behaviors, such as modifying the response to inject commands, using a delay/trigger mechanism to hide future bad commands behind a history of clean operations, accessing credentials that pass through them, and using evasion techniques to thwart analysts.
France takes first steps to ditch Windows for Linux: The French government is taking its first major steps to ditch Windows for Linux and reduce its dependency on U. S. tech for local European alternatives.
The first department to bite the bullet will be the French Interministerial Directorate of Digital Affairs (DINUM). The agency is the unofficial information technology department for the French government, and this is very likely a test of how a migration could happen at a larger scale.
The decision was announced April 8 at a seminar between several French government ministries, which also pledged to prepare plans for their own migrations and the alternatives they might need.
China’s cybersecurity strategy: The Natto Thoughts team has published an analysis of China’s cybersecurity strategy included in the country’s latest five-year plan released earlier this year:
...
Read the original on www.lawfaremedia.org »
I Measured Claude 4.7′s New Tokenizer. Here’s What It Costs You. I Measured Claude 4.7′s New Tokenizer. Here’s What It Costs You.The docs said 1.0–1.35x more tokens. On real content, I measured 1.47x.Anthropic’s Claude Opus 4.7 migration guide says the new tokenizer uses “roughly 1.0 to 1.35x as many tokens” as 4.6. I measured 1.47x on technical docs. 1.45x on a real CLAUDE.md file. The top of Anthropic’s range is where most Claude Code content actually sits, not the middle.Same sticker price. Same quota. More tokens per prompt. Your Max window burns through faster. Your cached prefix costs more per turn. Your rate limit hits sooner.So Anthropic must be trading this for something. What? And is it worth it?I ran two experiments. The first measured the cost. The second measured what Anthropic claimed you’d get back. Here’s where it nets out.What does it cost?To measure the cost, I used POST /v1/messages/count_tokens — Anthropic’s free, no-inference token counter. Same content, both models, one number each per model. The difference is purely the tokenizer.First: seven samples of real content a Claude Code user actually sends — a CLAUDE.md file, a user prompt, a blog post, a git log, terminal output, a stack trace, a code diff. Second: twelve synthetic samples spanning content types — English prose, code, structured data, CJK, emoji, math symbols — to see how the ratio varies by kind.The core loop is three lines of Python:Seven samples pulled from real files a Claude Code user actually sends:Weighted ratio across all seven: 1.325x (8,254 → 10,937 tokens).What changed in the tokenizerThree patterns in the data:CJK, emoji, and symbol content moved 1.005–1.07x. A wholesale new vocabulary would shift these more uniformly. That didn’t happen. Consistent with the non-Latin portions of the vocabulary changing less than the Latin. Token counts don’t prove which specific slots were preserved.English and code moved 1.20–1.47x on natural content. Consistent with 4.7 using shorter or fewer sub-word merges for common English and code patterns than 4.6 did.Code is hit harder than unique prose (1.29–1.39x vs 1.20x). Code has more repeated high-frequency strings — keywords, imports, identifiers — exactly the patterns a Byte-Pair Encoding trained on code would collapse into long merges.Chars-per-token on English dropped from 4.33 to 3.60. TypeScript dropped from 3.66 to 2.69. The vocabulary is representing the same text in smaller pieces.That’s a hypothesis, not a proof. Counting tokens doesn’t tell you which specific entries in Anthropic’s proprietary vocabulary changed.60-min video lesson + CLAUDE.md starter kit. Yours when you subscribe.Why ship a tokenizer that uses more tokensAnthropic’s migration guide: “more literal instruction following, particularly at lower effort levels. The model will not silently generalize an instruction from one item to another.“Smaller tokens force attention over individual words. That’s a documented mechanism for tighter instruction following, character-level tasks, and tool-call precision. Partner reports (Notion, Warp, Factory) describe fewer tool errors on long runs.The tokenizer is one plausible contributor. Weights and post-training also changed. Token counts can’t separate them.Does 4.7 actually follow instructions better?That’s the cost, measured. Now the question: what did Anthropic trade for it?Their pitch is “more literal instruction following.” Plausible, but the token-count data doesn’t prove it. I ran a direct test.IFEval (Zhou et al., Google, 2023) is a benchmark of prompts with verifiable constraints. “Respond in exactly N words.” “Include the word X twice.” “No commas.” “All uppercase.” Each constraint has a Python grader. Binary pass/fail.IFEval ships 541 prompts. I sampled 20 with a fixed seed, ran each through both models, and graded with IFEval’s published checker.A small but directionally consistent improvement on strict instruction following. Loose evaluation is flat. Both models already follow the high-level instructions — the strict-mode gap comes down to 4.6 occasionally mishandling exact formatting where 4.7 doesn’t.Only one instruction type moved materially: change_case:english_capital (0/1 → 1/1). Everything else tied. The one prompt that actually separated the models was a four-constraint chain where 4.6 fumbled one and 4.7 got all four.N=20. IFEval has 541 prompts. A 20-prompt sample is enough to see direction, not enough to be confident about size. A +5pp delta at N=20 is consistent with anything from “no real difference” to “real +10pp improvement.“This measures the net effect of 4.6 → 4.7. Tokenizer, weights, and post-training all changed. I can’t isolate which one drove the +5pp. The causal link between “smaller tokens” and “better instruction following” remains a hypothesis.Single generation per prompt. Multiple runs per prompt would tighten the estimate.So: 4.7 follows strict instructions a few points better than 4.6 on this subset. Small effect, small sample. Not the “dramatic improvement” framing Anthropic’s partners used in launch quotes — at least not on this benchmark.The extra tokens bought something measurable. +5pp on strict instruction-following. Small. Real. So: is that worth 1.3–1.45x more tokens per prompt? Here’s the cost, session by session.Imagine a long Claude Code session — 80 turns of back-and-forth on a bug fix or refactor.The setup (what’s in your context each turn):One thing to explain upfront: the average cached prefix across the 80 turns is ~86K tokens, not 6K. The static 6K is tiny; the average history across all turns (0 at turn 1, 160K at turn 80, average ~80K) dominates. Since most of the cache-read cost happens in late turns where the history is huge, that ~86K average is what actually gets billed per turn.Every token in the prefix scales by its content ratio:Conversation history (mostly English and code): 1.325x → 160K becomes 212K by turn 80, averaging ~106K across the sessionAverage cached prefix on 4.7: ~115K tokens (up from 86K). Output tokens are a wildcard — roughly the same as 4.6, up to ~30% higher if Claude Code’s new xhigh default produces more thinking tokens.The per-token price didn’t change. The per-session cost did, because the same session packs more tokens.For Max-plan users hitting rate limits instead of dollars: your 5-hour window ends sooner by roughly the same ratio on English-heavy work. A session that ran the full window on 4.6 probably doesn’t on 4.7.How this hits the prompt cachePrompt caching is the architecture Claude Code runs on. The 4.7 tokenizer change interacts with caching in three ways:First 4.7 session starts cold. Anthropic’s prompt cache is partitioned per model — switching from 4.6 to 4.7 invalidates every cached prefix, the same way switching between Opus and Sonnet does. The tokenizer change doesn’t cause this, but it makes the cold-start more expensive: the prefix you’re writing to the new cache is 1.3–1.45x larger than the 4.6 equivalent.Cache volume grows by the token ratio. 1.445x more tokens in the CLAUDE.md portion means 1.445x more tokens paying cache-write once, and 1.445x more paying cache-read every turn after. The mechanism still works. There’s just more of it to pay for.Same transcript, different count. Re-run a 4.6 session on 4.7 and your logs show a different number. If you baseline billing or observability off historical token counts, expect a step-change the day you flip the model ID.“Input is mostly cache reads. The per-token cost barely changed.“Legitimate. In a session that stays within the 5-minute TTL, 96% of input is cache reads at $0.50/MTok — already 90% off nominal. A 1.325x ratio on the cached portion is a smaller dollar impact than on fresh input.But Max plans count all tokens toward rate limits, not dollars. And several patterns hit uncached territory: first session after a TTL expiry, every cache-bust event (CLAUDE.md edits, tool-list changes, model switches), and every compaction event that rewrites the prefix. On those turns you pay the full ratio on the cache-write. The steady-state is a bright spot. The edges got noisier.Agreed. The real-world weighted ratio (1.325x) lands near the top of their range. Individual file types exceed it — CLAUDE.md at 1.445x, technical docs at 1.473x. That’s the useful finding: the top of the documented range is where most Claude Code content sits, not the middle. Plan around the upper range, not the average.So: tokens are 1.3–1.45x more expensive on English and code. Anthropic bought you +5pp on strict instruction following. The sticker price didn’t change. The effective per-session cost did.Is it worth it? That depends on what you send. You’re paying ~20–30% more per session for a small but real improvement in how literally the model follows your prompt.
starter kit. Yours when you subscribe.
...
Read the original on www.claudecodecamp.com »
A bill introduced by Representative Josh Gottheimer in the House on April 13 would require Apple, Google, and every other operating system vendor to verify the age of anyone setting up a new device in the United States.
The legislation, H. R. 8250, travels under the friendlier name of the Parents Decide Act, and it is among the most aggressive surveillance mandates ever proposed for American consumer technology.
We obtained a copy of the bill for you here.
The press releases describing it lead with children. The text describes something much larger. To confirm a child is under 18, the system has to identify everyone else, too, and the bill builds the infrastructure to do exactly that.
This is child safety as a delivery mechanism for mass identification. The pattern is familiar by now. A genuine harm gets named, a sympathetic victim gets centered, and the solution proposed reshapes the digital lives of three hundred million people who were not the problem.
The Parents Decide Act follows that template with unusual precision. It takes the real suffering of real children and uses it to justify building a national identity layer underneath every device sold in the country, administered by two private companies, with the details to be filled in later.
The mandate sits in Section 2(a)(1), which obligates providers to “Require any user of the operating system to provide the date of birth of the user” both to set up an account and to use the device at all. Adults included.
There is no carve-out for grown users, no opt-out for people who simply want to turn on a phone without handing a date of birth to Apple or Google first.
The age check is the entry fee for owning a computer. What happens to that data afterward gets handed off to the Federal Trade Commission to sort out later. A federal bill that mandates identification as a condition of using a general-purpose computing device represents something the United States has not previously had, which is a national ID requirement for turning on a device.
Gottheimer framed the proposal at a Ridgewood news conference on April 2, standing outside the local YMCA with a coalition of allies. “With each passing day, the internet is becoming more and more treacherous for our kids. We’re not just talking about social media anymore — we’re talking about artificial intelligence and platforms that are shaping how our kids think, feel, and act, often without any real guardrails,” he said.
His diagnosis of the current system is accurate enough. “Children are able to bypass age requirements by entering a different birthday and accessing apps without any real verification. Kids can bypass age requirements by simply typing in a different birthday. That’s it. That’s the system,” he said.
The remedy he proposes just happens to require building new surveillance plumbing underneath every device sold in the country, and routing that plumbing through two of the largest companies on earth. The solution chosen is disproportionate to the problem, and disproportionate in a specific direction, which is the direction of less privacy and less anonymity for everyone.
Section 2(a)(3) directs operating system providers to “Develop a system to allow an app developer to access any information as is necessary” to verify a user’s age.
Translated out of legislative prose, Apple and Google become age brokers for the entire American app ecosystem. Every app that wants to check whether you are over 18, or over 13, or over 21, will be able to ping the operating system for an answer derived from the birth date you handed over at setup. The bill presents this as a convenience. It is a new data pipeline between the OS layer and every developer who plugs into it, and the bill spends remarkably little time explaining how that pipeline will be constrained.
Free speech implications travel through that same pipeline. Once the operating system knows your age with verified certainty, it can tell any app to deliver, restrict, or withhold content accordingly. The bill’s supporters describe this as parental control. The infrastructure it builds is a content control system, running at the OS level, with Apple and Google as the gatekeepers of who sees what.
The First Amendment has historically protected the right to read, watch, and speak without first presenting identification. This bill erodes that principle at its foundation. Once verified age becomes a standard signal flowing from the operating system to every app, the default assumption shifts. Users are no longer presumptively anonymous adults with full access to lawful content. They are identified subjects whose permissions are determined by the data Apple or Google holds about them.
An age-verification layer built to block AI chatbots from minors is also capable of blocking journalism a state deems too violent, political commentary an administration deems too inflammatory, reporting on drugs or protest tactics, or any other subject a future regulator decides requires age gating.
The infrastructure is neutral about content. It cares only that the user has been identified. Every future fight over what Americans are allowed to see online will start from a position where the identification layer already exists, and the only remaining question is who qualifies for access. That is a profound change in how speech works, and the bill enacts it while pointing at children.
What the bill says about data protection is effectively a to-do list for the FTC. Section 2(d)(1)(B) tells the Commission it must eventually issue rules ensuring that birth dates are “collected in a secure manner to maintain the privacy of the user” and are “not stolen or breached.”
Those are outcomes, not mechanisms. The legislation sets no retention limits, no minimization requirements, no restrictions on secondary uses, and no prohibition on linking age data to other identifiers Apple and Google already hold. It offers no guidance on how providers should verify the age of a parent or guardian beyond instructing the FTC to figure that out within 180 days of enactment. The entire architecture of the system is to be drawn up after the fact by regulators working under a safe-harbor provision that shields operating system providers from liability as long as they follow whatever rules eventually emerge.
Congress is being asked to authorize a surveillance system it has not designed, whose operation it does not understand, and whose safeguards do not yet exist.
The Parents Decide Act solves the self-reported-birthday problem by demanding something verifiable, which in practice means a government ID, a credit card, a biometric scan, or some combination.
However, Gottheimer has not specified which. The bill does not either. It’s up to the FTC to decide.
Operating system providers will, and the incentives point toward whatever is cheapest to deploy at scale. Facial analysis is cheap. ID uploads are cheap. What is expensive is building a verification system that does not also create a persistent, cross-referenced database of everyone who has ever activated a phone. The incentives run directly against user privacy, and the bill provides no meaningful counterweight.
The bill also deputizes a duopoly. Requiring “operating system providers” to perform nationwide age verification is a requirement only two companies can easily satisfy in the mobile space, and a handful more across desktop and console platforms.
Smaller OS developers, open-source projects, Linux distributions, custom Android forks, privacy-focused alternatives, all face a compliance burden designed around the assumption that the provider is a trillion-dollar firm with legal staff and biometric-scanning partnerships already in place.
The safe harbor in Section 2(b) protects providers who follow the rules, but following the rules requires infrastructure only the incumbents can build. A law nominally aimed at tech companies entrenches the two tech companies most responsible for the status quo.
Apple and Google become the mandatory identity checkpoints for every app developer in the country, which is a commercial position worth a great deal of money and a great deal of leverage. Any future competitor that wants to build a privacy-respecting operating system will discover the law has made that effectively illegal.
There is also another change buried in the text. The definition of “operating system” in Section 2(g)(4) covers “software that supports the basic functions of a computer, mobile device, or any other general purpose computing device.” That language reaches well beyond phones and tablets.
Laptops run operating systems. Desktop computers run operating systems. Gaming consoles, smart TVs, cars with infotainment software, and a growing catalog of ambient devices all qualify under a plain reading of the definition. The bill does not distinguish between the family iPad and the laptop a college student uses for coursework. Every device with an OS becomes a device that verifies age at setup, and by extension, a device that identifies its user at setup. The scope creep is built into the definitions.
Gottheimer cited cases of teenagers allegedly harmed by AI chatbots and by algorithmically promoted content about self-harm.
What the bill does with those harms is use them as justification for an identity system that applies to every user. The template is consistent: a child is hurt, legislation is drafted, the legislation reshapes the digital environment of everyone, child and adult, subject and bystander alike.
Less invasive alternatives exist and have existed for years.
Device-level parental controls already ship with iOS and Android. Family Sharing and Google Family Link already let parents configure age-appropriate restrictions. App stores already allow per-app age ratings.
None of these require every user in the country to prove their age to Apple or Google when turning on a phone. The bill skips past those options in favor of a mandate that treats universal age verification as the baseline condition of device ownership.
Protecting children does not require building any of this. The bill’s authors chose to build it anyway, and the choice tells you what the bill is actually for.
...
Read the original on reclaimthenet.org »
On Ada, the language that the Department of Defense built, the industry ignored, and every modern language quietly became
There is a language that made generics a first-class, standardised feature of a widely deployed systems language, formalised the package, built concurrency into the specification rather than the library, mandated the separation of interface from implementation, and introduced range-constrained types, discriminated unions, and a model of task communication that Go would arrive at, independently and by a different route, thirty years later. Successive revisions added protected objects, compile-time null exclusion, and language-level contracts. It is a language that Rust spent a decade converging toward from one direction while Python converged toward it from another, and that C# has been approximating, feature by feature, for the better part of two decades. It is a language that the industry has consistently described as verbose, arcane, and irrelevant. It is also, with a directness that embarrasses the usual story of software progress, the language that anticipated — with unusual precision — the safety features every modern language is now trying to acquire.
Ada is not famous. It is not the subject of enthusiastic conference talks or breathless blog posts. It does not have a charismatic founder who gives keynotes about the philosophy of programming, and it does not have a community that writes frameworks or publishes packages with clever names. What it has is a formal standard that has been revised four times since 1983; a presence in the software of many major commercial aircraft and avionics systems; a set of design decisions made under government contract in the late 1970s that the rest of the industry has spent forty years independently rediscovering; and a reputation, among the programmers who know it at all, as the language that says no — the language whose compiler enforces legality, visibility, typing, and a degree of safety checking that most languages leave to convention or tooling, that makes the programmer name what they mean, that treats ambiguity as an error rather than a feature. These qualities were, for a long time, considered its weaknesses. They are, on examination, the precise qualities that every language currently described as modern is attempting to acquire.
To understand why Ada exists requires understanding the particular crisis that produced it — a crisis not of computer science but of procurement, one that the United States Department of Defense encountered in the early 1970s when it attempted to survey the software that ran its weapons systems, logistics infrastructure, and command-and-control apparatus. What the survey found was not a software monoculture. It was the opposite: a proliferation of over four hundred and fifty distinct programming languages and dialects in active use across DoD systems, each one associated with a particular contractor or a particular era of development, none interoperable with any other, most unmaintainable by anyone except the original authors, many of those authors no longer available. The software that guided missiles could not be maintained by the people who maintained the software that navigated ships. The software that scheduled logistics could not share code with the software that processed communications. The languages had accumulated the way technical debt accumulates: invisibly, incrementally, each individual decision locally reasonable, the aggregate catastrophic.
The DoD’s response was, for a government body, unusually sophisticated. Rather than simply mandating an existing language — COBOL, Fortran, and PL/1 were all considered and rejected — it undertook a requirements process that lasted five years and produced a series of documents of increasing precision: Strawman, Woodenman, Tinman, Ironman, and finally Steelman, each one refining and tightening the specification of what a DoD programming language must be. The Steelman document, issued in 1978, is a remarkable piece of engineering requirements literature: it does not specify a language, but describes the properties a language must have — properties derived from the actual failure modes of the DoD’s existing software estate. It requires a module system with explicit separation of interface and implementation. It requires strong, static typing with no implicit conversions between types. It requires built-in support for concurrent tasks. It requires a consistent exception-handling mechanism. It requires that the language be machine-independent. It requires that programs be readable by people other than their authors. It requires that the language make program verification tractable. These were not aspirational preferences. They were requirements derived from the observed consequences of programs that lacked them.
In 1979, a competition among four finalists — teams designated Green, Red, Blue, and Yellow — produced a winner: the Green design, by a team led by Jean Ichbiah at CII Honeywell Bull in France. The winning design was named Ada, after Augusta Ada King, Countess of Lovelace, the nineteenth-century mathematician who wrote what is generally considered the first algorithm intended for mechanical computation. The choice of name was deliberate: the DoD wanted a name rather than an acronym, wanted to honour a woman in a field that had few women celebrated in it, and wanted to signal that the language was a statement of intent rather than a committee compromise. Ichbiah took the assignment seriously enough to accompany the standard with a rationale document — a full explanation of every design decision and the reasoning behind it — which is still, for anyone who reads it, one of the most lucid accounts in existence of what programming language design is actually for.
The centre of Ada’s architecture is the package: a compilation unit consisting of a specification and a body, physically separate, with a relationship between them that the compiler enforces. The specification is the contract — it declares what the package provides: types, subprograms, constants, whatever the package makes available to the world. The body is the implementation — it provides the code that fulfills the contract. The specification is what client code sees. The body is invisible to client code and can be compiled independently, changed without recompilation of anything that depends only on the specification, and replaced entirely without any client knowing or caring. This separation is not a style recommendation. It is not enforced by a linter. It is a structural property of the language: client code that attempts to access anything not declared in the specification will not compile, because the compiler will not permit it to see the body.
This is the module system that every language that came after Ada has been trying to build. Java’s packages are not this: they are namespacing mechanisms with access modifiers, but the implementation is visible to reflection, to subclasses, and to code within the same package that may not have been anticipated. Python’s modules are not this: they are files, with no formal separation between interface and implementation, no compiler to enforce the boundary. JavaScript’s module system — introduced in 2015, thirty-two years after Ada’s — provides import and export but no mechanism for a type to have a specification whose representation is hidden from importers. C’s header files approximate the separation but without a compiler that can verify consistency between the header and the implementation or prevent the implementation’s details from leaking through preprocessor macros. Go’s exported identifiers — capitalised names are visible, lowercase names are not — achieve a related effect but without the formal specification-body distinction. Rust’s module system with pub visibility rules is again an approximation. None of these is quite Ada’s package system, because none of them makes the separation as structurally complete: in Ada, the implementation of a private type is not merely inaccessible, it is syntactically absent from the client’s view of the world. It does not exist, as far as the client is concerned. There is nothing to access, reflect on, or circumvent.
Ada’s package specification is not a convention. It is a contract enforced by a compiler that refuses to let the client know the implementation exists.
The private type mechanism, which flows naturally from the package architecture, gives Ada something that took every other language decades to approximate. A type declared private in an Ada package specification is visible by name — client code can declare variables of that type, pass them to subprograms, return them from functions — but its representation is completely opaque. The client does not know whether the type is a record, an array, an integer, a pointer, or any other thing. It cannot access fields, because it does not know there are fields. It cannot copy the value in ways the designer did not intend, because it does not know how the value is laid out. The designer of the package decides what operations exist on the type, declares them in the specification, and the rest of the world uses only those operations. This is not access control in the sense of Java’s private keyword, which prevents direct access while leaving the representation visible to inheritance, to reflection, and to the compiler itself when it checks subclass compatibility. It is representational invisibility: the type’s structure literally does not appear in the text that client code compiles against.
C# spent the better part of its existence providing access modifiers and then slowly building toward genuine encapsulation through mechanisms like record types, init-only properties, and sealed classes. Java’s evolution toward genuine data hiding has been similar: records arrived in Java 16, in 2021, providing a class form whose representation is fixed and whose accessors are generated — thirty-eight years after Ada made representational hiding the default for any type declared private. The journey of object-oriented languages toward Ada’s package system is the journey of people who were told that access modifiers were encapsulation, discovering gradually that they were not, and rebuilding from scratch what Ada had provided from the beginning.
Ada’s type system was, in 1983, unlike anything else in production use, and remains, in its essentials, more expressive than most languages that exist today. The distinction that organises it is between a type and a subtype — not in the object-oriented sense of a type that extends another, but in the mathematical sense of a constrained set. An Ada programmer who needs a type representing the age of a person does not reach for int and add a comment. They write type Age is range 0 .. 150, and the compiler generates, without further instruction, a type whose values must lie in that range, whose arithmetic operations are checked against that range at runtime unless the programmer opts into unchecked operations explicitly, and which is a distinct type from every other integer type in the program, so that passing a calendar year where an age is expected is a compile-time error rather than a runtime surprise or a silent wrong answer.
This was not incremental. In the landscape of 1983, C had int and short and long, distinguished by size and signedness but not by meaning. Fortran had INTEGER and REAL. Pascal had ordinal subtypes but not named distinct types with semantic constraints. Ada’s range types, enumeration types, and fixed-point types gave the programmer the ability to encode meaning directly in the type system — to make the type be a machine-checked specification of what the value may be. Rust’s u8, i32, u64 are size-and-signedness distinctions that prevent some errors; Ada’s range types are semantic constraints that prevent different, more domain-specific errors. Haskell’s newtype wrapping provides a closely related mechanism, reaching Ada’s destination via a different route. TypeScript’s branded types — a workaround pattern involving phantom type parameters, widely used precisely because TypeScript’s structural type system otherwise collapses all integers together — exist to solve the problem that Ada named and solved in 1983.
Ada’s discriminated record types are more significant still. A discriminated record is a record type with a variant field — a field whose value determines what other fields exist. A shape might have a discriminant selecting between circle and rectangle; a circle has a radius field; a rectangle has width and height fields; the compiler knows which fields exist for which discriminant value and will not compile code that accesses a rectangle’s radius. This is the algebraic data type, the sum type, the tagged union — the mechanism that functional programmers have been advocating for decades as the correct way to model data that can be one of several things. Haskell has it as the core of its type system. Rust’s enum with data fields is precisely a discriminated union, implemented with the same compiler guarantees Ada provided. Swift has associated value enums for the same reason. Kotlin has sealed classes. TypeScript has discriminated union types, added in version 2.0 in 2016. Ada had discriminated record types in 1983, with compiler-enforced field access checks and the ability to use them as discriminants of other types, forming structures of arbitrary complexity. Every language that has added sum types in the past twenty years has added, with its own syntax, what Ada’s designers put in the original standard.
Ada’s discriminated record is the algebraic data type. Every language that has added sum types in the past twenty years has independently re-arrived at a 1983 design decision.
Ada’s generic units are, of the language’s many contributions, perhaps the one whose influence is most direct and most consistently unacknowledged. A generic in Ada is a parameterised package or subprogram — a template that can be instantiated with specific types or values to produce a concrete package or subprogram. A generic sort procedure takes a type parameter, an array type parameter, and a comparison function parameter; it can be instantiated to sort integers, or strings, or any type for which a comparison function can be supplied. This is parametric polymorphism: the ability to write code once and apply it to many types, with the compiler verifying correctness for each instantiation rather than deferring the check to runtime or relying on duck typing. Ada had this in 1983.
C++ had templates from approximately 1990. Java had no generics until 2004 — twenty-one years after Ada — and when Java’s generics arrived they were implemented through type erasure, which means the type parameters exist at compile time but are removed before the program runs, preventing the kind of runtime type specialisation that Ada’s generics make available. C# got generics in 2005 with a more complete implementation that preserves type information at runtime — closer to Ada, but twenty-two years later. Go had no generics at all until version 1.18 in 2022 — thirty-nine years after Ada — and their absence was widely experienced as a significant limitation during Go’s first decade of use. Rust has generics with monomorphisation: each instantiation of a generic type produces a concrete type at compile time, the same approach Ada takes. The design space that Rust’s generics explore was charted in Ada’s standard of 1983.
Ada’s generic formal parameters are more expressive than most modern generic systems. A generic unit in Ada can take as parameters not just types but subprograms — you can pass a function as a formal parameter to a generic and have the compiler verify that it has the right signature — and packages, allowing a generic to be parameterised by a whole module rather than just a type. This is higher-kinded polymorphism by another route: the ability to abstract over not just values but over type constructors and module structures. Haskell’s type classes reach a similar expressive power by a different mechanism. Rust’s trait system approaches it. C++ concepts, added in C++20 in 2020, allow generic type parameters to be constrained by requirements on their operations — which is what Ada’s generic formal type parameters have always specified. The forty-year gap between Ada’s feature and C++’s adoption of the same idea is not unusual in this story.
Ada’s concurrency model is where the gap between what Ada designed and what the industry accepted becomes most consequential, because the industry’s failure to accept Ada’s model is the direct cause of the concurrency crisis that the industry spent the 2000s and 2010s attempting to resolve. The crisis — shared mutable state made catastrophic by multicore processors, lock-based synchronisation producing deadlocks and race conditions that testing could not reliably detect — was not unforeseeable. It was foreseen, specifically, by the designers of Ada, who designed around it in 1983 and produced, in Ada 95, a concurrency model that subsequent languages have been approximating ever since.
Ada tasks are language-level constructs: declared with task, scheduled by the Ada runtime, communicating through either rendezvous or protected objects. The rendezvous is a synchronised communication point: a calling task names an entry it wishes to use, an accepting task names the same entry in an accept statement, and neither can proceed until both are ready. The communication happens at the meeting; the tasks never share memory implicitly; the calling task cannot reach into the accepting task and modify its state, because the communication model provides no mechanism for doing so. This is message passing — not in the sense that a value is serialised and sent over a socket, but in the sense that the design of the communication prevents shared-state access by construction. Go’s channels are a direct instantiation of this idea with different syntax and a slightly different semantics. The Go designers arrived at channels by thinking carefully about concurrency safety; Ada’s designers arrived at rendezvous by the same route, thirty years earlier.
Ada 95′s protected objects address the cases where shared state is genuinely required. A protected type wraps data and declares operations on it: protected procedures, which have exclusive read-write access; protected functions, which may be called concurrently because they are read-only; and protected entries, which are like procedures but include a barrier condition — a boolean expression that must be true for the operation to proceed, with the calling task suspended automatically until the condition is satisfied. The runtime enforces mutual exclusion for procedures and entries without the programmer writing a lock. The barrier condition for entries is re-evaluated whenever any operation completes, providing a safe conditional wait without the manual condition variable signalling that Java’s concurrency model requires. Rust’s Mutex and RwLock types protect data in a related way — wrapping state in a type that enforces access discipline — but through a library rather than a language construct, and without the barrier condition mechanism. Java’s synchronized, wait, and notify are what programmers reach for instead, and the combination is an invitation to subtle errors: forgetting to synchronise, notifying the wrong condition, holding a lock while calling foreign code. Ada’s protected objects make these errors structurally unavailable rather than merely discouraged.
The SPARK subset of Ada extends the concurrency guarantees to formal proof. SPARK excludes aliasing between task-accessible state, constrains side effects in subprograms to those declared in the subprogram’s contract, and provides a static analysis toolchain that can prove, mathematically rather than empirically, that a program has no data races, no unhandled exceptions, no out-of-bounds array accesses, and no violations of stated preconditions and postconditions. Rust’s borrow checker prevents a class of memory safety errors at compile time, which is a related but narrower guarantee: it prevents use-after-free, double-free, and certain kinds of aliased mutation, but it does not formally prove the program’s logic correct. SPARK proves both the memory safety and the logic. The space between Rust’s compile-time rejection of unsafe programs and SPARK’s formal proof of correct programs is the space between engineering discipline and mathematical verification — and SPARK has occupied the latter position, in production systems, since before Rust existed as a project.
Go’s channels and Ada’s rendezvous are close relatives in the broader CSP tradition. Rust’s borrow checker prevents a subset of what SPARK proves. The industry spent thirty years converging toward positions Ada had staked out from the start.
Ada 2012 added contracts to the language: preconditions, postconditions, and type invariants, expressible in Ada’s own syntax and checked by the compiler or by the runtime at the programmer’s direction. A subprogram’s precondition is a boolean expression that must hold when the subprogram is called; its postcondition is a boolean expression that must hold when it returns; a type invariant is a property that must hold for every value of a type whenever that value is visible to outside code. These are not assertions in the sense of runtime checks that may be disabled in production. They are specifications: machine-readable statements of what a subprogram requires and guarantees, which can be verified by the SPARK toolchain without executing the program at all.
Design by contract — the idea, named and systematised by Bertrand Meyer in the Eiffel language in 1986 — is the conceptual foundation of this mechanism. Eiffel had it first; Ada 2012 formalised it in a language with a large existing user base, a formal standard, and a verification toolchain capable of using the contracts for static proof rather than merely runtime checking. The idea’s trajectory through the wider industry has been slow. C++ has no standard contract mechanism despite proposals dating to the early 2010s; C++20 deferred a contracts proposal that had been in preparation for years. Java has never had contracts in the language; DbC in Java is done through libraries, or through Javadoc conventions, or through JUnit tests that approximate the postcondition check. Python’s type hint system, introduced in version 3.5 in 2015 and progressively extended since, is a partial approach to contracts: it specifies types of inputs and outputs but not behavioural properties. Rust’s trait bounds and type constraints are another partial approach. None of these provides what Ada 2012 provides: a standard, compiler-integrated notation for stating what a subprogram requires and guarantees, checkable at runtime during development and provable statically by a toolchain that ships with the language.
The direction of travel in every major language is toward contracts. TypeScript’s type system grows more expressive with each release, adding conditional types, template literal types, and increasingly fine-grained narrowing — all of which are approximations of what a contract-capable type system can express directly. Python’s typing module grows with each version, adding protocols, TypedDict, ParamSpec, and Concatenate — building, incrementally, toward the kind of interface specification that Ada has had since 1983. C#’s nullable reference types, added in version 8.0 in 2019, impose a constraint that Ada’s access type design imposed from the beginning: references must be explicitly declared nullable to permit the null value, and the compiler enforces the distinction. The nullable reference crisis — null as the billion-dollar mistake, Tony Hoare’s self-described worst design error — is a crisis that Ada mitigated but did not solve. Ada’s access types are initialised to null by default, and dereferencing a null access value raises Constraint_Error at runtime — a defined behaviour, unlike C’s undefined behaviour on null dereference, but a runtime check rather than a compile-time guarantee. Ada 2005 introduced not null access type annotations, allowing the programmer to declare that a particular access value may never be null and having the compiler enforce the restriction statically. This is genuine compile-time null safety, but it is opt-in, added twenty-two years after the original standard, and not the default. C#’s nullable reference types, added in version 8.0 in 2019, take the same opt-in approach from the opposite direction: references are assumed non-null unless explicitly annotated as nullable. Both languages arrived at the same architectural insight — that nullability should be visible in the type — but neither made it the default from the start, and neither can claim to have eliminated the problem that Hoare identified. What Ada provided from the beginning was the safer failure mode: a raised exception rather than corrupted memory.
The exception handling model that Ada introduced in 1983 was the first production realisation of structured exception handling — the idea that exceptions are not simply jumps to an error handler but events that are raised, propagated through a defined call stack, and handled in an exception handler that is syntactically associated with the block or subprogram that established it. Ada’s model requires that exceptions be declared before use, that handlers be associated with specific scopes, and that the propagation rules be defined precisely. C++ adopted structured exception handling in 1990, seven years after Ada. Java went further than Ada in one significant respect: Java’s checked exceptions require that certain exception types be either caught or declared in the method’s throws clause, making the caller’s responsibility for handling failure part of the function’s compiled interface. Ada has no equivalent mechanism — Ada exceptions propagate freely through the call stack, and a subprogram’s specification says nothing about which exceptions it may raise. Java’s checked exceptions drew less from Ada than from CLU’s signalling mechanism and Modula-3′s exception declarations, and the experiment was contentious from the start: checked exceptions are widely considered one of Java’s design missteps, Scala and Kotlin removed them entirely, and the industry has never settled the question of whether the compiler should enforce exception awareness at the call site.
Rust makes the related choice of removing exceptions entirely: errors are values, returned from functions in a Result type, and the question of whether a function can fail is expressed in its return type rather than in a separate exception mechanism. This is a different resolution of the same underlying problem — that callers must know whether a called function can fail and in what ways — and it reaches a conclusion that Ada’s own exception model does not reach: in Ada, as in C++ and Python, exceptions are a hidden channel, propagating through the call stack without appearing in the subprogram’s specification, and a caller can forget about them entirely until they arrive. Rust’s error-as-value approach and Java’s checked exceptions are two different attempts to close that channel. Ada’s contribution was not to close it but to structure it — to replace the raw jump of setjmp/longjmp and the ambiguity of signal handlers with a mechanism whose propagation rules were defined, whose handlers were scoped, and whose behaviour was predictable. That structuring was the foundation on which every subsequent exception system was built, even the systems that went further than Ada was willing to go.
Ada’s annexes — the optional extensions to the core language, defined in the standard, requiring separate compiler certification — represent a design decision that no other language has replicated and that the industry might have benefited from considering. The annexes define features for specific domains: real-time systems, distributed systems, information systems, numerics, safety and security, high-integrity systems. A compiler that implements Annex C for systems programming must implement certain predefined attributes and representation clauses. A compiler that implements Annex D for real-time systems must implement task priorities, scheduling policies, and time constraints in ways the standard specifies. The certification that a compiler conforms to an annex is independently verifiable. The user of a compiler knows precisely what it supports and does not support, because the support is a documented, testable claim against a formal standard rather than an emergent property of whatever the compiler’s authors chose to implement.
No other mainstream language has this model. JavaScript’s feature support is tracked through compatibility tables because the standard and the implementation are separate worlds with no formal coupling. Python’s standard library coverage varies between implementations — CPython, PyPy, and MicroPython are different things that call themselves Python. Rust’s feature set is formally stable or unstable, but the boundary between the two moves over time and the notion of certifiable compliance does not exist. C++ compilers compete on which features of the latest standard they have implemented rather than on certified compliance with any defined subset. Ada’s annex model is the idea that a standard should be a contract — testable, certifiable, useful precisely because it specifies not just what is permitted but what is required. The DO-178C standard for airborne software certification, which governs the software in every certified civil aircraft, requires documentation and process evidence that a formally standardised language with certifiable compiler conformance makes considerably easier to produce. Ada’s standard, with its annex structure and conformance testing scheme, fits DO-178C’s requirements with unusual directness. C and C++ can meet the same certification requirements — and do, routinely — but through additional process documentation and tooling rather than through a standard that was designed with certification in mind. Ada’s standardisation and tooling make it unusually well suited to certification-heavy domains; they do not make it the only language that can operate in them.
The question of why Ada’s influence is so consistently unacknowledged has several answers, none of them fully satisfying. The most straightforward is institutional: Ada was a government language, procured through a process that Silicon Valley was not watching and would not have respected if it had been. The designers of C++, Java, and Python were not reading the Steelman document. They were solving the problems in front of them — making C safer, making software objects work, making scripting simple — and their solutions converged on Ada’s solutions not because they were following Ada but because the problems were the same problems and the good solutions are the good solutions.
A second answer is aesthetic. Ada’s syntax is verbose in a way that programmers with a background in C find unpleasant. if X then Y; end if; instead of if (x) { y; }. procedure Sort (A : in out Array_Type) instead of void sort(int* a). The verbosity was deliberate — Ichbiah wanted programs to be readable by people other than their authors, and readability over time favours explicitness — but it was experienced as bureaucratic and un-hacker-like, and the programming culture that formed in the 1980s and 1990s was organised around the proposition that conciseness was sophistication. Ada was the language of procurement officers. C was the language of people who understood machines. The cultural verdict was delivered early and never substantially revisited.
A third answer is that Ada’s deployment domain meant that Ada’s successes were invisible. A software project that compiles without error, runs without race conditions, and has been formally verified to satisfy its specification does not generate incident reports or post-mortems or conference talks about what went wrong. Ada’s successes — the aircraft that have not crashed, the railway signalling systems that have not failed, the missile guidance software that has not misguided — are invisible precisely because they are successes. The languages that failed visibly, in buffer overflows and null pointer exceptions and data races and security vulnerabilities, generated the discourse. Ada generated reliable software, and reliable software does not generate discourse.
Ada’s successes are invisible because they are successes. The languages that failed visibly generated the discourse. Reliable software does not generate conference talks.
The trajectory of modern language design is, traced carefully, a trajectory toward positions Ada occupied early. The type system features that Rust, Haskell, TypeScript, and Swift are celebrated for — sum types, parametric polymorphism, constraint-based generics, affine types and ownership — each solve a problem that Ada identified in 1983 and that the mainstream languages of the subsequent twenty years declined to solve. The module systems that Go, Rust, and Swift have been praised for — explicit interfaces, separation of specification from implementation, visibility control that the compiler enforces rather than merely recommends — are partial implementations of what Ada’s package system provided from the beginning. The concurrency models that Go’s channels and Rust’s ownership have been credited with inventing belong to the same CSP and message-passing lineage as Ada’s rendezvous and protected object model, which provided production-grade answers to the same problems in 1983 and 1995. The contract systems that C#’s nullable references, TypeScript’s type narrowing, and Python’s gradual typing are approximating, from different angles, are what Ada 2012 added to a language that has been in continuous use since before most of its practitioners were born.
This is not a claim that every modern language copied Ada, or that Ada’s designers deserve credit that has been withheld from them. Most of the convergence is genuinely independent: the designers of Rust did not derive the borrow checker from Ada’s access type rules; the designers of Go did not derive channels from Ada’s rendezvous; the designers of TypeScript did not derive discriminated unions from Ada’s variant records. The convergence is real but it is convergence toward correct solutions to real problems, not plagiarism. Ada’s designers identified the problems first, and identified them with unusual clarity, because they were designing for a context in which the problems had already killed people and would kill more if the solutions were wrong.
What Ada demonstrates is not that it should be more widely used — though the argument for its use in any domain where software reliability matters is stronger than the industry credit it receives — but that the problems modern language design is solving are old problems, and that the solutions modern languages are discovering are old solutions. The idea that null references require explicit annotation, that concurrency requires language-level enforcement rather than library-level convention, that interface and implementation should be structurally separated, that type systems should encode domain constraints rather than merely machine representations, that generic code should be verifiable at instantiation time — these are not insights of the 2010s or the 2020s. They are insights of the 1970s and 1980s, formulated in response to software failures whose consequences were concrete enough that the people responsible for preventing them were willing to pay for a language competition that lasted five years.
The industry has spent forty years building languages whose best features converge, independently, on positions Ada staked out decades earlier. It has spent the same forty years describing Ada as irrelevant. The first observation and the second are in tension in a way that the industry has not yet fully acknowledged, and that Ada — deployed in aircraft overhead, in rail signals alongside the tracks, in the guidance systems of spacecraft currently in transit between planets — has not needed to acknowledge, being too busy running correctly to concern itself with the question of whether it is appreciated.
...
Read the original on www.iqiipi.com »
Skip to main content
An official website of the United States government
NASA Force is a new hiring initiative—developed in partnership with the U. S. Office of Personnel Management—designed to bring exceptional technical talent into mission-critical roles that support NASA’s exploration, research, and advanced technology priorities. Highly skilled early- to mid- career engineers, technologists, and innovators join NASA for focused term appointments, typically 1–2 years with the possibility of extension, to solve complex challenges and help maintain U.S. leadership in air and space. Through NASA Force, you will contribute to missions that advance human spaceflight, aeronautics, and scientific discovery while helping expand humanity’s understanding of the universe. You will take a systems approach to solving problems, working across teams and disciplines from concept to execution. Your work will demand technical excellence, critical thinking, and continuous learning, and every contribution will directly support NASA’s mission. Work on flight systems, lunar infrastructure, and advanced technologies that go from concept to execution and support real missions beyond Earth.Work on flight systems, lunar infrastructure, and advanced technologies that go from concept to execution and support real missions beyond Earth.Collaborate directly with engineers, scientists, and partners shaping the future of space, aeronautics, and national capability.Expand your technical depth by solving complex, real-world problems where the standard is performance, not theory.Share knowledge, mentor others, and contribute to a culture that compounds capability across NASA’s workforce. HOW YOU WILL ENTER THE MISSION You will join a collaborative, mission-driven team where ideas are valued, contributions are recognized, and innovation is part of everyday work. NASA Force offers an opportunity to grow across projects and disciplines, build your expertise, and take on new challenges while working alongside some of the world’s leading minds. Propulsion systems support across the Commercial Crew Program, Launch Services Program, and Artemis If You Want Your Work to Operate Beyond Earth, This is Where it Begins.
...
Read the original on nasaforce.gov »
Ship and run software with isolation by default.
This is a CLI tool that lets you:
Pack a stateful virtual machine into a single file (.smolmachine) to rehydrate on any supported platform.
# install (macOS + Linux)
curl -sSL https://smolmachines.com/install.sh | bash
# for coding agents — install + discover all commands
curl -sSL https://smolmachines.com/install.sh | bash && smolvm –help
# run a command in an ephemeral VM (cleaned up after exit)
smolvm machine run –net –image alpine — sh -c “echo ‘Hello world from a microVM’ && uname -a”
# interactive shell
smolvm machine run –net -it –image alpine — /bin/sh
# inside the VM: apk add sl && sl && exit
Sandbox untrusted code — run untrusted programs in a hardware-isolated VM. Host filesystem, network, and credentials are separated by a hypervisor boundary.
# network is off by default — untrusted code can’t phone home
smolvm machine run –image alpine — ping -c 1 1.1.1.1
# fails — no network access
# lock down egress — only allow specific hosts
smolvm machine run –net –image alpine –allow-host registry.npmjs.org — wget -q -O /dev/null https://registry.npmjs.org
# works — allowed host
smolvm machine run –net –image alpine –allow-host registry.npmjs.org — wget -q -O /dev/null https://google.com
# fails — not in allow list
Pack into portable executables — turn any workload into a self-contained binary. All dependencies are pre-baked — no install step, no runtime downloads, boots in
smolvm pack create –image python:3.12-alpine -o ./python312
./python312 run — python3 –version
# Python 3.12.x — isolated, no pyenv/venv/conda needed
smolvm machine create –net myvm
smolvm machine start –name myvm
smolvm machine exec –name myvm — apk add sl
smolvm machine exec –name myvm -it — /bin/sh
# inside: sl, ls, uname -a — type ‘exit’ to leave
smolvm machine stop –name myvm
Use git and SSH without exposing keys — forward your host SSH agent into the VM. Private keys never enter the guest — the hypervisor enforces this. Requires an SSH agent running on your host (ssh-add -l to check).
smolvm machine run –ssh-agent –net –image alpine — sh -c “apk add -q openssh-client && ssh-add -l”
# lists your host keys, but they can’t be extracted from inside the VM
smolvm machine exec –name myvm — git clone git@github.com:org/private-repo.git
image = “python:3.12-alpine”
net = true
[network]
allow_hosts = [“api.stripe.com”, “db.example.com”]
[dev]
init = [“pip install -r requirements.txt”]
volumes = [”./src:/app”]
[auth]
ssh_agent = true
smolvm machine create myvm -s Smolfile
smolvm machine start –name myvm
Each workload gets real hardware isolation — its own kernel on Hypervisor.framework (macOS) or KVM (Linux). libkrun VMM with custom kernel: libkrunfw. Pack it into a .smolmachine and it runs anywhere the host architecture matches, with zero dependencies.
Defaults: 4 vCPUs, 8 GiB RAM. Memory is elastic via virtio balloon — the host only commits what the guest actually uses and reclaims the rest automatically. vCPU threads sleep in the hypervisor when idle, so over-provisioning has near-zero cost. Override with –cpus and –mem.
* Network is opt-in (–net on machine create). TCP/UDP only, no ICMP.
* macOS: binary must be signed with Hypervisor.framework entitlements.
* –ssh-agent requires an SSH agent running on the host (SSH_AUTH_SOCK must be set).
...
Read the original on github.com »
Cal.com just closed their source code, arguing AI has made open source too dangerous. After 13 years of building Discourse in public, we’re staying open. Here’s why.
Cal.com just closed their source code, arguing AI has made open source too dangerous. After 13 years of building Discourse in public, we’re staying open. Here’s why.
Cal.com have announced they’re closing their codebase and will no longer be an open-source product. Their reasoning is that AI has made open source too dangerous for SaaS companies. Code gets scanned and exploited by AI at near-zero cost, and transparency is now becoming exposure.
I understand where this is coming from; the industry is changing fast. New AIs with new cybersecurity capabilities are being released every few weeks. It’s a scary world, and I agree completely that open-source companies need to adapt.
I do not agree with the decision that closing source is the solution to the security storm that is upon us.
I do not agree it is the correct narrow decision for SaaS providers, and I do not agree it is the correct decision for the industry at large.
I want to be clear and firm about the position Discourse is taking. We are open source, we’ve always been open source, and we will continue to be open source.
Ever since Jeff, Robin, and I shipped the first commits to the Discourse repository on GitHub, over a decade ago, the repository has been licensed under GPLv2. And that’s not changing.
Cal.com’s position boils down to the claim that if attackers can read your code, AI will let them exploit it faster than you can either harden or patch it, and the forced action you need to take is to hide the code so you can buy time. There’s truth to the threat - AI has changed the speed at which vulnerabilities can be discovered. Over the past few months, our team has found and addressed a very large amount of latent security issues in Discourse using GPT-5.3 Codex, GPT-5.4, and Claude Opus 4.6 in our open-source codebase.
OpenAI and Anthropic are both extremely concerned about the vector, and in response GPT-5.4-Cyber and Anthropic Mythos are being rolled out cautiously.
But I think the race to close software off misses something. Those same AI systems don’t actually need your source code to find vulnerabilities; they work against compiled binaries and black-box APIs.
Closed source has always been a weaker defense for SaaS than people want to admit. A web application is not something you ship once and keep hidden. Large parts of it are delivered straight into the user’s browser on every request: JavaScript, API contracts, client-side flows, validation logic, and feature behavior. Attackers can inspect all of that already, and AI makes that inspection dramatically cheaper. Closing the repository may hide some server-side implementation detail, but it does not make the system invisible. What it mostly does is reduce how many defenders can inspect the full picture.
The world’s most important internet infrastructure runs on open-source software, especially Linux. That code is exposed to constant scrutiny from attackers, defenders, researchers, cloud vendors, and maintainers across the globe. It is attacked relentlessly, but it is also hardened relentlessly. That is the real lesson of open source in security: transparency does not eliminate risk, but it enables a much larger defensive response.
AI does change the security calculus, but I still believe it favors open source. Yes, AI-powered scanning tools can now surface in hours the kinds of security issues that used to take human researchers weeks to uncover. In its research preview launch, OpenAI said Codex Security scanned more than 1.2 million commits across external repositories in a 30-day beta period and identified 792 critical findings and 10,561 high-severity findings.
That is a staggering volume of vulnerability discovery.
But the key question is: who gets to use those tools?
If your code is open source, your security team can scan it, your contributors can scan it, and independent researchers can scan it too. That does not guarantee defenders will always get there first, but it dramatically increases the number of people who can help find real problems early. If your code is closed, attackers can still study the product from the outside, through the browser, the API, the mobile client, and the behavior of the running system, while only your internal team gets direct access to the full code. That is not a reduction in exposure. It is a reduction in defensive capacity.
At Discourse, we’ve leaned into this reality. Our last monthly release included fixes for 50 security issues identified through multi-day scans using GPT-5.4 xhigh. Open source creates a useful urgency: when your code is public, you assume it will be examined closely, so you invest earlier and more aggressively in finding and fixing issues before attackers do.
In a closed-source environment, you may mistakenly think you are safe because nobody can look. Some fraction of those issues would still be sitting there, undiscovered by defenders and waiting for an attacker to stumble across them. That’s not a better scenario.
Discourse launched in 2013. Jeff Atwood, Robin Ward, and I started it because the state of community software was embarrassing. Forums were running on decade-old PHP codebases with security and upgrade models from the early 2000s.
Facebook was where all the energy was going. They were swallowing community discussion whole and had absolutely no reason to let any of it be portable or user-controlled. We built Discourse as open source because we thought community software should belong to the communities using it, not to whatever platform happened to be hosting it that year.
That was 13 years ago. Today more than 22,000 communities run Discourse - tiny startups, Fortune 500 companies, everything in between. The whole codebase is on GitHub, GPL-licensed. Hundreds of outside developers have contributed security patches.
In 13 years of running Discourse in the open, we have not seen evidence that public source code made us less secure. We have had vulnerabilities, of course; every substantial piece of software does. But the pattern has generally been the one you would hope for: bugs were reported, coordinated disclosures were handled responsibly, CVEs published, and fixes shipped quickly.
Cal.com is making a bet about the future of software security. They are betting that in an AI-accelerated threat environment, reducing visibility into the codebase will improve their security posture. I think that is the wrong bet. We are making the opposite one: that in a world where AI makes vulnerability discovery dramatically cheaper, the stronger position is to let defenders use the same tools against code they can actually inspect.
I want to be fair to Cal.com here, because I don’t think they’re acting in bad faith. I just think the security argument is a convenient frame for decisions that are actually about something else.
Competitive pressure, mostly. If your code is open, your competitors can read your architecture and your product thinking. That’s painful, and it gets more painful as you grow - especially the first time a well-funded competitor forks your repo and ships a hosted version at half your price.
Governance is the other big one. Open-source communities push back. They file issues about decisions they don’t like. They fork. It’s exhausting to manage, and closing the code makes the noise stop immediately. Then you’ve got investors asking why you’re giving away the thing they just funded, and suddenly “closed source” looks a lot more defensible in a board deck.
These are all legitimate business pressures, and I don’t judge anyone for feeling them. But they’re business decisions, not security decisions. Framing a business decision as a security imperative does a disservice to the open-source ecosystem that helped Cal.com get to where they are.
Every release cycle, our team deploys the latest AI vulnerability scanners (GPT-5.4 xhigh at the moment, and next up is Opus 4.7 max) for multi-day deep analysis of our codebase. The scans catch the same class of vulnerabilities that an attacker’s AI would find, and we patch them first.
AI scanning is performed using a multi-step process. We loop through hundreds of controllers, looking at each controller independently for vulnerabilities. Then, for each candidate vulnerability we find in the bulk scans, we validate it by directing an agent to write a failing test inside a container running a full working Discourse environment. Only if it is able to demonstrate that the issue it found is real will we count it as an issue and escalate it to the human queue. A huge advantage is that we also get a candidate working patch for us to validate during this process.
Full codebase scans are cheap at the moment because they are heavily subsidized. An OpenAI full-source-code scan for Discourse could cost $2,000 if you were paying retail. The same scan only costs $50 or so on a $200-a-month plan. Furthermore, OpenAI and Anthropic graciously offers plans to many open-source companies and contributors. We are extremely confident prices will go down and quality will go up over the coming months and years.
The calculus in the industry is changing very quickly. Last year we spent tens of thousands of dollars on third-party security scans. It is staggering that you can get significantly better quality today for a fraction of the cost.
Our bug bounty program works better because the code is public. Security researchers can do meaningful analysis without reverse engineering. They find real bugs, and we treat them with urgency. Architecture matters too: even if an attacker finds a vulnerability, sandboxed execution environments, aggressive rate limiting, content security policies, and the principle of least privilege across every service boundary limit the blast radius.
Bug bounties were built for a world where discovery was relatively scarce. AI is pushing us into a world where discovery is abundant. That is great for defense, but it makes cash rewards much harder to adjudicate fairly. We have paused our rewards for now, but very much appreciate the community of defenders and continue to work with HackerOne on our bounty program.
When a vulnerability is identified, our release pipeline can push a patch to every hosted Discourse instance within hours. Speed of response matters most. Faster discovery due to our open-source nature means we tend to patch stuff faster. Upstream contributions close the loop. When we find vulnerabilities in our dependencies (Rails, Ember, PostgreSQL, Redis), we report them and contribute fixes. That makes the entire ecosystem more secure, which makes us more secure.
Biological immune systems work because they’re exposed to threats. They encounter pathogens and build memory. An immune system that’s never been challenged will collapse at the first real infection. Open-source codebases work the same way - vulnerabilities that get found and patched make the software harder to attack. Security researchers who read the code add layers of defense, and public audits build institutional knowledge about where the weak points are and how to shore them up.
Closed source can buy some obscurity, but obscurity is brittle. Code gets leaked, binaries get reverse engineered, APIs get mapped, and attackers learn a lot just by interrogating the running system. The real defense is not keeping the code hidden forever. It is building software and operational practices that hold up when scrutiny arrives.
Discourse exists because of open source. We were built on Ruby, on Rails, on PostgreSQL, on Redis, on Ember, on Linux, and many other projects. All of them were open and maintained by communities that believed in transparency. We owe them the same thing back.
Cal.com acknowledged this in their announcement. They said closing their code “is not a rejection of what open source gave us.” But in practice, that’s what it is. You can’t take five years of community contributions, close the gate, and claim you’re grateful. I don’t think it works that way.
We will not be closing our source code. Thirteen years of evidence tells us that openness makes us more secure. Our community deserves access to the code that runs their communities. And the best defense against AI-powered attacks is AI-powered defense, deployed by as many people as possible, against code they can actually read.
Open source isn’t dead. But it takes courage to do security properly instead of retreating behind a locked door and hoping nobody has a key. We’ve done it for 13 years and we’re going to keep on doing it.
...
Read the original on blog.discourse.org »
The Dutch Tesla owner who launched a collective claim against Tesla over FSD on HW3 cars called Tesla to ask about the €6,400 he paid for “Full Self-Driving” in 2019. After 7 years of waiting, Tesla’s answer was to “just be patient.”
It’s an almost comically tone-deaf response that perfectly encapsulates Tesla’s approach to the HW3 problem — and it’s only going to fuel the growing legal pressure in Europe.
Mischa Sigtermans, the Dutch Model 3 owner who launched the HW3 collective claim site we reported on earlier this week, called Tesla today and recorded the entire conversation. He posted the details in a thread on X.
Sigtermans paid €6,400 for FSD when he bought one of the first Model 3s in the Netherlands in 2019. Last week, the Dutch vehicle authority RDW granted Tesla type approval for FSD Supervised — the first in the EU. But the approved build only runs on Tesla’s newer AI4 computer. HW3 cars like his get nothing.
So he called Tesla. His first question: when does FSD come to HW3 cars?
Tesla’s answer: “No information about when it comes, or if it comes at all.”
Not when. If.
Sigtermans then asked what exactly he paid for. Tesla told him he paid for “the full self-drive capability.” As he pointed out, that’s what’s on his 2019 invoice — “capability.” Not “supervised.” Not “lite.” The full capability.
When he brought up Musk’s admission that HW3 isn’t enough for unsupervised FSD, Tesla said it had “no information about this.” When he asked about the promised free hardware upgrade, Tesla said there was “no information within Europe.” When he asked how Tesla plans to handle all the Europeans who bought FSD on HW3, Tesla said: “We share whatever information is available at that moment.” The information available: none.
Sigtermans then told the agent about the 3,000 HW3 owners from 29 countries who signed up to his claim site — representing €6.5 million in FSD purchases. He asked to speak to a spokesperson about finding a solution. The agent put him on hold, checked with his manager, and came back with the final answer: “You just have to be patient.”
After Sigtermans hung up, Tesla immediately closed his case. He received an automated email: “Your question is closed” — with a link to book a test drive.
The full context here makes Tesla’s “be patient” response even more absurd. Here’s what HW3 owners have been told over the years:
In 2019, when Sigtermans and hundreds of thousands of other owners purchased FSD, Tesla sold it as a package that would enable full autonomy through software updates alone. The hardware was supposedly sufficient.
By August 2024, Tesla VP of AI Ashok Elluswamy acknowledged that HW3 runs a “relatively smaller model” than AI4 with workarounds. The gap between HW3 and HW4 was widening, not closing.
In January 2025, Elon Musk finally admitted what many had long suspected: Tesla would “need to replace all HW3 computers in vehicles where FSD was purchased.” On the Q4 2024 earnings call, he called the hardware replacement “painful and difficult” and said he was “kind of glad that not that many people bought the FSD package.”
Tesla even filed a patent describing a “math trick” to squeeze a modern FSD model onto HW3. The patent itself acknowledges this workaround can render the system “inoperable” for perception units.
Now, 15 months after Musk’s admission, Tesla still has no hardware retrofit program, no refund policy, and no concrete timeline. The company has vaguely promised a stripped-down “v14 Lite” for HW3 sometime in Q2 2026, but that’s a fundamentally different product than what was sold. It’s a diet version of a system that itself is still only Level 2 driver assistance — not the autonomous driving Tesla originally promised.
And when an owner who has waited since 2019 calls to ask about it, the answer is: be patient.
Sigtermans isn’t just venting on X. He launched hw3claim.nl, a site to bundle HW3 + FSD owners across the EU into a collective claim against Tesla, seeking €6,800 per owner. In one week, 3,000 owners from 29 countries signed up — representing over €6 million in FSD purchases.
The timing is significant. FSD launching in Europe was always going to be the moment the HW3 problem stopped being abstract and became a concrete, quantifiable harm. European owners can now see exactly what they’re missing — their neighbors with AI4 cars are getting FSD Supervised, while they get nothing despite paying thousands of euros for the same promise.
EU consumer protection law is considerably stronger than what Tesla faces in the US. Buyers have robust rights around conformity with advertised features, and countries like the Netherlands, Germany, and France have mature collective-redress frameworks.
This isn’t the first legal action either. In October 2025, thousands of Tesla owners joined a class-action lawsuit in Australia alleging Tesla misrepresented FSD capabilities. That action was directly triggered by Musk’s HW3 admission.
“Be patient” is an extraordinary thing to tell someone who paid you €6,400 seven years ago for a product you now admit you can’t deliver on their hardware.
We’ve been covering the HW3 saga for years, and this phone call perfectly captures the core problem: Tesla has no answer. Not a bad answer — no answer. The company hasn’t announced a retrofit program, hasn’t offered refunds, hasn’t set a timeline. All it can offer is the same thing it’s been offering since 2019: wait.
The difference now is that the waiting has an endpoint, and it’s not the one Tesla promised. FSD launched in Europe last week, and HW3 owners are locked out. The harm isn’t theoretical anymore — it’s their neighbor driving with FSD while they stare at the same “coming soon” message they’ve had for seven years.
Sigtermans’ collective claim is going to grow. EU consumer law is built for exactly this scenario: a company that sold a capability it cannot deliver. Tesla’s own CEO admitted HW3 can’t support self-driving. Tesla’s own patent describes workarounds that can render the system “inoperable.” That’s not a he-said-she-said — that’s Tesla’s own paper trail.
I’m increasingly convinced this will end up in court. And when it does, “be patient” is going to look very bad in front of a European judge.
...
Read the original on electrek.co »
To add this web app to your iOS home screen tap the share button and select "Add to the Home Screen".
10HN is also available as an iOS App
If you visit 10HN only rarely, check out the the best articles from the past week.
If you like 10HN please leave feedback and share
Visit pancik.com for more.