Sign in

iiinova is part of the Atmosphere — an open, public network where you own your identity.

Ben Cotton (he/him)

@funnelfiasco.hachyderm.io.ap.brid.gy
39 followers 5 following 459 posts

Author of "Program Management for Open Source Projects" and all-around opinion haver. Always looking for my next tornado. I get too invested in sports. 🌉 bridged from hachyderm.io/@funnelfiasco on the fediverse by fed.brid.gy

PostsRepliesMedia
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 25/08/2026
I thought of a book title while making breakfast for the family this morning. It's free for anyone who wants to write it: "This Flag Won't Hump Itself: a history of performative patriotism in America"
001 1
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 21/07/2026
Love this quote from @joestringer "When automated tooling is too noisy in a human space, it converts the human space into non-human space and humans no longer interact with one another."
001 1
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 22/05/2026
Silently ignoring unrecognized configuration options is a security risk and should be treated as such. nx.dev/blog/nx-console-v18-95-0-pos…
nx.dev
Postmortem: Nx Console v18.95.0 supply-chain compromise | Nx Blog
Full postmortem of the malicious Nx Console v18.95.0 published to Visual Studio Marketplace and Open VSX on 2026-05-18, originating from the TanStack npm supply-chain compromise that exfiltrated a contributor's gh CLI OAuth token seven days earlier.
001 1
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 18/05/2026
Once again, I am Thursday tired on a Monday
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 15/05/2026
If you open a pull request that adds 1,009,257 lines across 6,755 commits, the *lenient* consequence should be that you are permanently banned from GitHub and all of your computers are fed into an industrial shredder. github.com/oven-sh/bun/pull/30412
1219 19
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 14/05/2026
Every so often, I remember the time in 10th grade when I wrote "interred" in a paper when I meant "exhumed".
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 14/05/2026
@exchgr but it's broken faster now!
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 13/05/2026
They say "time in market beats timing the market", but I have a lot of stonks I wish I sold six months ago...
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 12/05/2026
I have almost but not quite cleared my backlog of overdue tasks on Todoist. Now if I can only start doing some of the "it'd be nice to..." things.
000 0
Reposted by Ben Cotton (he/him)
Richard MacManus @ricmac.mastodon.social.ap.brid.gy · 09/05/2026
Now they’ve discovered external style sheets.
Screenshot of X discussion about linking to a CSS file so the LLM company doesn’t charge you more money for rendering HTML
12346 46
Reposted by Ben Cotton (he/him)
Andrew Nesbitt @andrewnez.mastodon.social.ap.brid.gy · 08/05/2026
Weekend at Bernie's - Which of your dependencies are wearing sunglasses? nesbitt.io/2026/05/08/weekend-at-be…
nesbitt.io
Weekend at Bernie's
In the 1989 film, two junior employees turn up at their boss’s beach house to find him dead, and spend the rest of the weekend wheeling him around the party with sunglasses on so nobody notices. The other guests keep slapping him on the back and putting drinks in his hand. It works because nobody looks too closely and because everyone has a strong incentive for Bernie to still be alive. I have spent the last couple of weeks trying to work out how many of the open source packages we all depend on are in roughly that condition: resolving in every install, pulling millions of downloads a week, accepting new issues, with nobody behind the sunglasses. I’m asking now rather than a few years ago because AI-assisted vulnerability discovery is changing how often somebody actually checks for a pulse. This matters most at the point where one of those packages gets a security report. Sometimes nobody responds at all, the embargo expires, and a CVE is published with no fixed version to point at. Sometimes a fix does get written, often by the reporter or a drive-by contributor, and it lands in git or sits in an open PR, but the one account with publish rights on the registry has gone and the patched code never reaches anyone’s `install` command. Linux distributions deal with that second case routinely because distro packagers have always carried patches without waiting for upstream, but language package managers have no equivalent role. The registry namespace belongs to whoever registered it, and if they’re gone there is nobody standing between you and the unpatched tarball. There are per-application workarounds, which I went through in some detail last week, but they put the work on every downstream consumer individually rather than fixing the published artifact once. There’s also a quieter way an unmaintained package causes problems that doesn’t need a vulnerability in the package itself. If it declares a tight version range on one of its own dependencies, and that dependency is actively maintained and ships a security release in a new major version, the resolver can’t reach the fix because the dead package’s constraint won’t allow it. Everything downstream gets held on the vulnerable version by a single line in a manifest that nobody is around to edit, which is more or less the situation byroot describes hitting with `openssl` in Bundler. ## What counts as dead The naive way to do this is to look at the last commit date, call anything over two years old “abandoned”, and publish a scary number. I didn’t want to do that, because a package with no commits since 2019 isn’t necessarily dead. A lot of the most depended-on packages in any ecosystem are forty lines long, finished, and don’t need commits. The thing I actually want to know is whether anyone would answer if you knocked, and the commit log on its own doesn’t tell you that. So I started from the ecosyste.ms critical package set, which is the top packages per registry by a blend of downloads and dependent repos, across sixteen package managers. That gave me 8,606 packages backed by 5,874 distinct repositories. For each repo I pulled a year of commit activity, a year of issue and PR activity, who closed or merged anything, who has publish rights on the registry, the date of the last release, and any security advisories filed against the package. Then I sorted them into four buckets. * **Active** : regular non-bot commits to the default branch, or a release, in the past year. * **Dormant** : little or no development, but someone with write access has closed an issue, merged a PR, or pushed a commit in the past year, so a fix could plausibly land. * **Dead** : the repo is archived, or issues/PRs were filed in the past year and nobody with write access closed, merged, committed or released anything in response. * **Unknown** : no issues or PRs filed and no activity, so responsiveness hasn’t been tested. Dead requires evidence of non-response rather than just inactivity, because I’d rather undercount than put a package on a list whose author happened to take a year off. ## The numbers Of those 5,874 critical repos, 48.8% are active, 20.2% are dormant, 12.1% are dead, and 18.9% are unknown. So just under half are unambiguously maintained. Twelve percent confirmed dead doesn’t sound enormous, but those 713 repositories back packages whose dependent-repo counts sum to about 290 million (these are edges in the dependency graph, not deduplicated repositories), and adding the dormant and unknown buckets takes that sum well past a billion. Broken down by ecosystem the dead share wobbles a bit, but it’s in double figures almost everywhere I have enough repos to say anything: ecosystem | repos | active | dormant | dead | unknown | dead % ---|---|---|---|---|---|--- npm | 1599 | 578 | 385 | 181 | 455 | 11.3 rubygems | 683 | 347 | 158 | 74 | 104 | 10.8 cargo | 580 | 365 | 95 | 69 | 51 | 11.9 packagist | 547 | 380 | 62 | 66 | 39 | 12.1 go | 530 | 188 | 122 | 107 | 113 | 20.2 pypi | 458 | 335 | 73 | 37 | 13 | 8.1 hackage | 396 | 100 | 105 | 69 | 122 | 17.4 maven | 370 | 234 | 36 | 27 | 73 | 7.3 conda | 302 | 202 | 53 | 12 | 35 | 4.0 julia | 173 | 34 | 34 | 37 | 68 | 21.4 hex | 153 | 73 | 35 | 17 | 28 | 11.1 A repo appears under every ecosystem it publishes to, so the columns sum to more than 5,874. I’ve left out the five smallest registries (swiftpm, nuget, cocoapods, pub, cpan) where the sample is under 100 repos and the percentages are mostly noise. Go’s 20% is high enough not to be noise, and I suspect part of it is import paths going stale when repositories move while the module proxy keeps the old path installable, so nobody downstream is forced to notice. npm sits near the middle on dead share but dominates by absolute volume, and its unknown column is enormous. That’s mostly an artifact of what npm’s critical set looks like: hundreds of tiny utilities that nobody files issues against because there’s nothing to file. The top of the dead list, sorted by dependent repos, is almost entirely those tiny npm utilities. `fast-deep-equal`, `fast-json-stable-stringify`, `utils-merge`, `require-directory`, each with somewhere between three and five million repos depending on them and no maintainer activity in years. About a third of the non-active packages have zero runtime dependencies of their own, so they’re leaves. The most depended-on dead code is also the code with the least in it, which is simultaneously reassuring (very little to go wrong in forty lines) and the entire problem, since there’s also very little reason for anyone to ever read those forty lines again. ## Knocking on the door Of the 713 dead repos, 322 are formally archived on GitHub, where the owner has at least put up a sign saying so. The other 391 are the Bernies: not archived, often with green squares on the contribution graph from Dependabot commits to branches nobody will ever merge, and an issue tab that’s still accepting input. 321 of them had at least one issue filed by a human in the past year. 243 had at least one pull request opened in the past year with zero merged, and some of those PRs are the fix, sitting there with the patch attached and nobody left who can press the button. The registry side is often worse than the repo side: 1,414 of the dead-or-dormant packages have exactly one account with publish rights, and for a lot of the dead ones it’s reasonable to assume that account’s owner has moved on, lost the 2FA device, or forgotten the package exists. I’m more worried about the dormant bucket than the dead one, since there are considerably more of them and 156 have exactly one person with write access who has done anything in the past year. That one person is also on the receiving end of all the AI-generated report spam and entitled drive-by demands that make solo maintainership steadily less appealing as a way to spend your evenings, and every one of those repos is a single goat-farming career change from the dead column. ## Why now A dead package with five million dependents and zero CVEs is unexamined rather than safe, and for most of the last decade that distinction barely mattered. The supply of people willing to spend an afternoon auditing a 200-line string-escaping utility from 2017 was roughly zero, so “nobody has bothered to look” was, in practice, a perfectly good defence. It is becoming a much worse one, because the same AI tooling that’s filling maintainer inboxes with slop reports is also, increasingly, finding real things. The cost of pointing a model at a tarball and asking what’s wrong with it has dropped to almost nothing, and the population of people doing that for bounties or for a foothold is growing a great deal faster than the population able to act on what they send in. Across the whole critical set there are already 110 published advisories with no patched version available, by which I mean no `first_patched_version` in the advisory data at all rather than a fix that’s tagged in git but never released. Some are against packages that were dead long before the advisory was filed, so the disclosure process ran its course, the CVE was published, and there is no version to upgrade to. Every other package in the dead bucket is in the same position with respect to the next advisory filed against it. The unknown 18.9% bothers me about as much as the dead 12.1%, since those are repos where nobody has filed an issue or a PR in a year and there’s been no test of whether anyone is home. The first security report against any of them will be that test. A lot of people are about to start running that test at once, on purpose, across whole registries, and a meaningful fraction of what they find will be real. When the report lands on a package in the dead column there is currently no good path for it: no distro-style downstream packager who can publish under the same name, and abandoned-package policies at most registries that assume someone wants to take ownership of the name rather than just get one fix out. Treating every entry in the lockfile as though there’s a maintainer behind it who’ll handle whatever comes in has been a workable assumption mainly because so few reports were ever filed. Registries and the communities around them are going to need an actual process for a valid CVE against a package with nobody to receive it, and right now most of them don’t have one.
108 8
Reposted by Ben Cotton (he/him)
Andrew Nesbitt @andrewnez.mastodon.social.ap.brid.gy · 08/05/2026
A good way to reduce noisy AI security reports is also to write a public vulnerability disclosure policy with what is considered a security issue and what is just a bug. Curl has an excellent one as an example: github.com/curl/curl/blob/master/do…
github.com
curl/docs/VULN-DISCLOSURE-POLICY.md at master · curl/curl
A command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP,...
012 2
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 07/05/2026
I am "I need to take a day to reorganize the email labels I set up 21 years ago because they don't really suit my purposes" years old.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 29/04/2026
There's a group of teens here in the hotel making fun of their friend for having the Yelp app on his phone.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 25/04/2026
Happy Perfect Date to those who celebrate!
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 24/04/2026
We've reached the `git commit -asm 'Stop being stupid'` stage of the workday already.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 24/04/2026
I know I've worked in tech too long when @theladyfiasco asks me how to represent "wildest dreams" in seven characters or fewer and my first thought is "w11s".
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 23/04/2026
My sixth grader was assigned Kurt Vonnegut, Jr's "EPICAC" and I have never been so excited to help with homework. I have some follow-on reading to suggest. 😁
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 18/04/2026
Me yesterday: I'm going to get so much writing done on Saturday Me today: I will do nothing of the sort
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 17/04/2026
There are two kinds of people in this world: those who understand what "We are holding our own" means and those who don't know that the legend lives on from the Chippewa on down.
100 1
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 16/04/2026
My adult life is not nearly as consumed by adding fabric softener at the appropriate part of the wash cycle as the TV commercials of my childhood had prepared me for.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 15/04/2026
@Migueldeicaza @wordshaper none of the PRs I initially looked at had that CLA reference. I see it in some others, though. I don't see a mention of a CLA in the current or recent versions of the contributing doc, but yeah...if there *is* a CLA, it almost certainly includes the right to relicense.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 15/04/2026
Cal dot com out here just casually relicensing from AGPLv3 to MIT with no indication that all contributors have granted permission for such a change seems like a bold move. github.com/calcom/cal.diy/commits/m…
github.com
History for LICENSE - calcom/cal.diy
Scheduling infrastructure for absolutely everyone. - History for LICENSE - calcom/cal.diy
101 1
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 14/04/2026
Me: That was "ack-as-in-TCP" not "ack-as-in-comic-strip-star-Cathy"
200 2
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 13/04/2026
@JessTheUnstill it's the sequel to "Rudy"
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 13/04/2026
"It’s in Anthropic’s interests to make Mythos sound as powerful as the truth will allow. 'Our product is so incredibly capable that we’re not sure it can be unleashed on the public' is a powerful marketing message." www.kusari.dev/blog/facts-and-mythos
kusari.dev
Facts and Mythos: understanding the future of AI security analysis
Mythos undoubtedly represents an advancement in the capability of frontier models. It’s also not the apocalypse.
100 1
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 09/04/2026
TFW you're writing docs and find a UX bug.
110 1
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 08/04/2026
🚨 Heads up: there's a social engineering attack ongoing against open source developers on Slack lists.openssf-vuln.org/g/siren/mess…
001 1
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 07/04/2026
Holy crap, when did all of these tabs appear? It's only Tuesday morning.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 06/04/2026
I'm thrilled to announce that I am the @merriamwebster Word of the Day today.
Screenshot of the Merriam-Webster Word of the Day email for April 6, 2026 showing that "cotton" is the Word of the Day.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 01/04/2026
There's so much to be sad and angry about in this stupid timeline, but we're sending people to the moon and that's just so damn cool.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 01/04/2026
Space is cool.
000 0
Reposted by Ben Cotton (he/him)
arthur.pizza @art.mastodon.sdf.org.ap.brid.gy · 31/03/2026
potatoes are amazing!
003 3
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 28/03/2026
The only thing standing between me and getting home is a CRJ-200 toilet that won't stop flushing.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 22/03/2026
Okay, now that I've slept and had a chance to look around a bit more, I notice that the bath towels have the same tag. So I think it's actually that there are RFID trackers sewn into the tag in case I decide I want to bring some with me? Duvet theft is apparently a problem here.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 21/03/2026
The duvet on my hotel bed seems to claim to block RFID and this is not something that I ever considered that I might want.
200 2
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 21/03/2026
United app: There's a new version. Please update to continue using the app. United wifi: We don't allow app updates on our network.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 20/03/2026
Is Arizona playing Long Island because the committee has a thing for iced tea? #MarchMadness
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 20/03/2026
Earlier today I was thinking about how one might programmatically determine which software dependencies are load bearing and the phrase "The Nebraska Heuristic" popped into my mind, so now I need to start a band...
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 17/03/2026
Babe, wake up. A new Chotiner just dropped: www.newyorker.com/news/q-and-a/why-…
001 1
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 16/03/2026
In his talk in digital sovereignty, @mirkoboehm puts into clear words some vague thoughts I've having about why the freedoms granted by FOSS licenses are not enough to give people control over their computing. #FossBack
000 0
Reposted by Ben Cotton (he/him)
Lars Marowsky-Brée 😷 @larsmb.mastodon.online.ap.brid.gy · 16/03/2026
"Let's resist the rise of nationalism" is the perfect message to kick off #FOSSBack, or any other day really
002 2
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 16/03/2026
Up very early to watch the #FossBack live stream. If only it had been at the end of the week, I might have been able to attend in person before going to KubeCon. I'd love to make it to Berlin someday so that I can be in the room.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 15/03/2026
BTFU! #Purdue
011 1
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 14/03/2026
At the end of the first quarter, Wisconsin leads Michigan 16-11 in the Big Ten football tournament. This just in: it's actually a basketball score in a game featuring 2 of the top 4 offenses in the league. 🤷
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 10/03/2026
The downside to coming home from a conference: 40 tasks due or overdue today in Todoist 😭
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 09/03/2026
Me: Has the alarm gone off yet or am I just awake? Me: *looks at the time* Me: Oh it definitely has not. Body, I have a long day of travel. Please go back to sleep.
000 0
Ben Cotton (he/him) @funnelfiasco.hachyderm.io.ap.brid.gy · 08/03/2026
Always feels good to be done with a talk. Thanks to everyone who attended and of course the entire #scale23x team for putting on a great conference year after year.
100 1