Winkle (@robbwinkle) profile picture

Building AI for the real world. token maxxing. prev: https://xitter.gq/t.co/qB3Y1eZhnG, martech, enterprise consulting, @Techstars

Columbus, OH
Joined January 2009
update your boxes /now/ the default user on alpine's aws and azure images take any password longer than 256 characters. yes, any password. yes. i know. yes.
*sshole is out if you run sshd on alpine, openwrt or any musl box with password auth on: update now official writeup: sshhole.com
30
59
14
807
65,273
Winkle retweeted
My further (informed) fantasies about the near future: 1) No CI. Agents prove each change against rules while they write it. 2) Code is a cache: rules stay, code regenerated with better models. 3) No staging, simulation instead. 4) Humans direct in plain words, agents compile that into formal rules, humans don't read the formulas, only examples and counterexamples. 5) Agents find the rules the human never knew to express (and ask to confirm them). 6) The checker catches contradictions between human's rules while they're still directing. 7) Unchecked/unproved code becomes legacy code. 8) Branches come back as experiments (many versions at once, humans pick among winners). 9) Software gets bred, not built. 10) Slop is variation without selection. 11) If UI is generated on the fly, design becomes the rules every generated screen must follow. A checker runs those rules on every generation. 12) Apps evolve from how they're used. 13) Everyone uses their own software version. One product becomes many personal versions, that stay compatible via shared rules.
Next question: why are you still using branches? We talked about PRs. I don't think they make sense anymore, if you rethink them from first principles. Yes, if you only use them to trigger CI, then sure, go ahead. That's a fat commit, not a PR. But for mandatory code review? Knowledge sharing? C'mon. But some of you said: "we use PRs because we use branches! I love to keep my stuff on branches." And I'm here to tell you: you don't need branches! You can just push to main. It's called trunk-based development and the idea behind it is true continuous integration: you continuously integrate your changes with the trunk, the main branch. It's been around for a while, it works. Just yesterday I talked with someone who said they've used it in an org with 400 engineers, without any issues. Ruby, the project, uses trunk-based development. The main idea is that you want to avoid long-lived branches. They're bad, because branches can diverge and merging can turn into a thing. And you don't want routine operations to become a thing. Even when I worked in teams that used PRs and branches, I considered it a smell when a branch lived for longer than a day or two. But when I shared this with others, I'd often get something back like this: "Well, good for you, but no. MY thing, what I'm working on, that can't be done on main. It needs to be on a branch! It has a database migration, it changes the underlying shape, the architecture, it refactors this and changes that. It can't go on main yet! I need to merge it all at the end." And then I'd say: "Nah, I can merge nearly anything continuously in small commits to main. You split things up. Add the column first, merge that, deploy it, now it's out, works, safe. Add the helpers first, merge them, get them out. Want to migrate from legacy pattern A to new pattern B? Don't do it all at once. Add the dependency, then migrate A to B, one by one, safe." If it can be merged in a large change, I bet it can be done in small increments that you merge to main. Yes, there are exceptions, but it's 0.5% of cases, not 50%. But there was a real problem with this approach: it was hard! There's a lot of "meta programming" you have to do: make sure this small first change compiles and runs and the tests work, merge it, get it out, monitor it; then do the next small piece, make sure that works and get it out; then maybe push some still-unused dead code, add a feature flag, add a config variable; or keep both configurations working at the same time, etc. That meant sometimes it was just easier to do it in a big fat branch. But big fat branches are risky! A system that continuously flows is safer than a system that starts and stops in spurts. But -- you guessed it -- here's the good news: Now, with agents, all of these chores are no chores at all! Agents are great at adding feature flags, they're great at splitting up code, they're great at keeping track of three changes and merging them one by one and watching them roll out. They're great at keeping two configurations working for a day. They're great at migrating one by one. In other words: it's now 10x easier to just work on main and make sure everything is continuously integrated and working. It's now easy to make sure the system constantly flows. And look, ... I'm not here to convince you to switch to trunk-based development. Just a ruse to get you to read this. (But also, hey: try it! Pushing to main is amazing.) I'm here to make you RETHINK how you develop software. Don't just use agents to replace your typing. Use agents as the magic code-writing machines they are. Everything that was hard about software development because it involved writing code -- even the meta programming -- has become easier. You can now reach for the stars! But you need to look up.
33
24
12
399
31,318
Okay, let's do this. Isabelle, Lean, and Rocq (formerly Coq*) are theorem provers. They are meant to prove mathematical theorems. We use them for formal verification by either 1) translating a program to the theorem prover (risking a translation error) or 2) using a language built into the theorem prover that extracts into a working binary. Fizzbee, TLA+, Spin, Alloy, Quint, and P are specification languages. They are meant for checking high-level blueprints of programs. After checking the blueprint, you still need to make sure your program matches it, which is a hard problem. Specification languages differ in what they make easy to express. P, Spin, and Fizzbee are designed to be closer to the code implementations. P looks like interacting state machines, Spin looks like C with CSP, Fizzbee looks like a dialect of Python. It's easier to use a codelike specification language and refine it to code, but you can't do as much with it. Alloy, TLA+, and Quint are more abstract. Alloy looks like a bunch of algebraic relationships, TLA+ is a much of logical formula, and Quint is a programmer-oriented (and statically typed) condensation of TLA+. Abstract modeling languages are harder to get started with and harder to represent things, but you can represent a wider class of systems with them. I believe UPPAAL is a specification language for realtime systems. This is a field I have no experience in. It seems a graphical language, though, which would make LLM-assistance difficult. Dafny is a verifiable programming language. It has regular programming language features, but also a bunch of features to express and prove properties of the program. It uses SMT solvers to actually prove the properties, meaning you don't need to learn a proof language (though you need to learn to cajole the solver). Dafny is probably the easiest thing on your list to get started with, but also the least likely to meet any weirder needs you might have. I don't know what Ivy is but some cursory Kagiing suggests it falls in the specification language category. Some other things @spin_lock_init didn't mention: - Other theorem provers: Agda, Metamath - Other abstract specification languages: mcrl2, NuXMV, Event-B - Other verifiable programming languages: Idris, F*, Whiley - There's also using a verifiable subset of a language, like Verus for Rust or SPARK for Ada. So, what you need to pick depends on what you want to do. You'll get the maximum power with a theorem prover. Lean is the de facto language for vibeproving, but Anthropic recently published a post about vibeproving in Rocq so YMMV. If you want to make abstract models of software systems, go for a specification language. Which you choose depends on a lot of factors. If your system can be represented as lots of simple communicating state machines over a network, try P. Spin, I believe, is close to simple C/Go with a network and channels. I have never used Fizzbee. Alloy is good for domain modeling, but struggles with really complicated temporal actions, nested data structures, and largish numbers. Also AIs aren't to good at it (last I checked, in March). Runs fast and makes good visualizations though. TLA+ and Quint are for modeling complex temporal systems. I'm partial to TLA+ but know a lot of people who say Quint is easier to get into. Note P, Fizzbee, and Quint all claim to have features for testing a codebase against a spec. I can't vouch for any of them, though. None of the languages I mentioned (except maybe NuXMV?) are particularly good at modeling sequential, deterministic algorithms. Use Dafny if you need to just write a verified program and don't care which language it's in. I don't think other verifiable programming languages are as user-friendly for the time being. Consider a verified subset if you already know a language and want to just augment it with more correctness. You may need other, more exotic tools depending on your particular needs. Regardless of the above advice, don't be afraid to use the wrong tool for the job. If you vibe well with a language, and you achieve good LLM-sympathy with it, you'll be able to go farther than using a "right tool" you don't like.
IIUC, all i need to do next is pick one of these? fizzbee, tla, spin, alloy, ivy, quint, isabelle, lean, p language, dafny, coq, uppaal
27
55
5
352
17,532
Winkle retweeted
Software is having its Industrial Revolution and it’s changing what matters in software frameworks. Today’s frameworks were designed for the crafty carpenter, tomorrow’s are designed for mass manufacturing processes where rigor > conciseness. Take foldkit vs react/solid, for example. You can argue that foldkit is more verbose or complicated for some use cases compared to the traditional alternatives, but everything doable in react/solid is also doable in foldkit. Everything doable in foldkit is not (or at least not easily or consistently) doable in react/solid because they lack the rigor of command+event state machines with story & scene testing. Getting that back isn’t easy and is a substantial loss for agentic coding. Before AI, there was the valid argument of picking what humans like best. Humans kinda suck at programming because we are constrained by our skills, taste and (lack of) discipline, so frameworks that worked in this era catered to the lowest common denominator of mass market human developers. While I agree that react/solid are powerful in the hands of humans, that simply doesn’t matter anymore. What’s best for humans does not necessarily translate to what’s best for agents. Some tasks may indeed be “a bit harder” with foldkit in human terms, but AI is capable of solving all of them in a few minutes, so who cares. Instead of bike-shedding philosophy and taste, just choose the more rigorous (and scalable) option. It costs you nothing and gains you everything. Effect is another example of this. With AI, now everyone of all skill levels can use advanced programming techniques that are objectively safer and more scalable, but were out of reach for many human programmers. Or didn’t appeal to the stubborn tastes of a particular person. With humans now out of the way of technology adoption - I think it’s obvious that the following techniques are going to become way more commonplace: 1. State Machines 2. Functional programming 3. Declarative infrastructure 4. Test Driven Development 5. Domain Driven Design 6. Actor Systems 7. Rigorous API schemas 8. Type Safety and Formal Verification 9. Disciplined Operations (monitoring, on-call) Alchemy is designed to bring these techniques together into a seamless experience for building and deploying applications of massive scale. It is the “rails” and “parts” of the ai software assembly line.
28
42
18
694
53,938
Surprising results from @OpenAI 's new Terra release. It shouldn't be this good! Also separately, adding Clef into the benchmark reveals a new Pareto frontier: decisions are a very cost effective pathway for physical world understanding! (work led by @PerraultAndrew )
Thank you for confirming this! We are seeing the same thing with RealityBench. Still behind on our acceptability metrics, but very surprised to see Argon / Fable / Astra performance at such a strong price point. relantic.com/realitybench
2
3
2
8
788
Just spent the last 7 days on the front lines of the vulnpocalypse fending off an active cyber attack on one of our products. Some thoughts: - Software factories are going to be required equipment for everyone. There’s just no way to keep up with the pace of highly automated adversaries without one. - We were lucky because we had spent the last few months getting our software factory running well. It is nice to have for product development but proved to be absolutely essential this week. - At the minimum you need to have a coding server in the cloud pre-provisioned with read only access to all your logs and all the services you depend on for observability. With that in place you are a prompt away from reasonably good situational awareness, ongoing monitoring with loops, and ability for coding agents to validate fixes against your actual, observed attack patterns. - Shared coding server also unlocks multiplayer incident response where everyone can see every session and jump in as needed. Sharing session links that can be forked is much higher bandwidth than re-explaining things. - You don’t need to be Ramp/Stripe/Uber scale to have a working software factory in the cloud. We are a team of 3. Ours is built with an @opencode server (thanks @thdxr!), a forked version of compound engineering optimized for automated workflows (thanks @kieranklaassen!) and a multiplayer agent in slack that handles crons (we have our own harness but pick your favorite here). - To get our software factory up and running well, we had to stop all new product development for ~6 weeks and just focus on getting the validation systems working that enabled us to reliably shipping PR without human code review. This felt very painful in the moment but was totally worth the eventual speedup in velocity. - KYC for @AnthropicAI & @OpenAI cyber programs is now easy and quick (at least for defensive access), but a day felt like a lifetime this week. Submit your app now before you really need it. - Getting Mythos access unlocked a deeper level of analysis that helped us shift from reactive mitigation to proactive patching. Wish we had done this a few weeks earlier. Get started now!
72
155
59
1,876
261,291
In May 2025 we tried a simple idea to make Claude Code more useful for our non-technical teammates. We called it Skills. Turns out folders go a long way. Today Skills joins @AgenticAIFdn. Thank you to everyone who made agents a bit more useful for yourself and others <3
We're donating Agent Skills to the Agentic AI Foundation (@AgenticAIFdn), the same foundation we donated MCP to. Since December 2025, 70+ agent platforms have integrated the standard, including ChatGPT, Cursor, GitHub Copilot, and VS Code. Here's what that means for you:
5
2
23
2,178
So basically, today PHP got two critical bugs that let anyone run code on your server without even logging in, which is bad, and then the details leaked before the patch was even out, which is worse, and it works on WordPress and MediaWiki and Magento and Joomla and Laravel, and Censys says like 1.5 million servers are running a version with no fix, so the NSA was like "take your system offline," and the FBI was like "take your system offline," and CISA and the UK and CERT-EU were all like "take your system offline," and then the Prime Minister of Japan, the actual Prime Minister, posted at 5:55 in the morning telling 48.8 million people to take their system offline, so everyone took their system offline, like the Dutch cybersecurity agency took its own website offline, and the Dutch parliament went offline, and the Port of Rotterdam went offline, and Finland and France and Denmark started pulling government sites, and Wikipedia went down, and Archive.org went down, and Asana and GOG and Something Awful went down, and the University of Vienna's webmail went down for some reason, and that's just PHP. Because GitLab also dropped a CVSS 10.0, which is the highest score they give out, for a bug that's been there since 2014, so that's every self-hosted GitLab for twelve years, and then LiteLLM 1.107.0 got hijacked and shipped a credential stealer and a remote access trojan in every single wheel and the Docker images, including latest, and you didn't even have to import it, just installing it was enough, and it's the second time this year, and then Railway paused every deployment on the entire platform because someone got into the environment variables, so now everyone has to rotate every secret they've ever stored there, and TiDB Cloud said someone was walking around inside with stolen credentials for basically a month and an extortion group says they took 10.6 terabytes, and Zeabur got breached for the second time in two months and is just shutting down, like the whole company, and Node.js patched remote code execution and a TLS bypass, and CISA says Plex is being actively exploited, and someone took over 300 Tor exit relays to steal SSH passwords, and SafePay ransomware has hit over 600 critical infrastructure orgs, and India's biggest bank filed a data loss incident, and Japan has been in an official state of emergency in cyberspace since October 9, which honestly explains the 5:55 AM post. Oh, and eMudhra, a certificate authority that's issued over 60 million certificates, whose entire job is proving websites are who they say they are, was supposed to be using private keys that are random numbers over a hundred digits long, and one of them was 4. Just 4. And the others were like 66 and 237. Anyway, it's Wednesday.
1,075
8,915
1,654
69,223
4,252,964
Introducing Flint, @Recursive_SI’s first model: a fast local coding model built with our automated research system, the Eureka Machine. • Best-in-class fast local coding • Up to 2x faster than comparable models: 125+ tokens/sec on a MacBook Pro, 150+ on RTX Spark • Built from scratch in under 4 months Private, unmetered intelligence on your own machine. Open weights available now on @huggingface, run it locally on your favorite framework or try it for free on @opencode or @pidotdev.
640
895
640
8,222
3,480,770
For a while now, @kirancodes has been excitedly telling everyone at @BasisOrg who would listen about a crazy idea she's been pursuing. Not everyone thought it was possible, but it's starting to work. See basis.ai/blog/ship-your-inte… TL;DR: The bottleneck in verifying the world's software is shifting from theorem proving to specifications and semantics. We now have a way to verify semantics that can scale across all programming languages. The basic idea: To verify that a program is correct, you need the program, a specification you want to prove, and a semantics that defines what programs and specs mean. Most programming languages (Python, Ruby, Lua…) have no formal semantics, because semantics are painful to write for complex languages. You can ask an LLM to write a semantics for you, but it'll probably have mistakes. But (i) programming languages do have interpreters/compilers, which ultimately are compiled down to machine code, and (ii) some instruction sets do have formal semantics. RISC-V has an official formal model. So, crazy idea: Step 1: Compile your interpreter (e.g. Python's) down to RISC-V. Now its behaviour is formally defined. It's exact, but unreadable: thousands of machine instructions. Step 2: Ask your LLM to write a semantics for your language. Step 3: Ask the LLM to prove, in @leanprover, that its semantics agrees with the compiled interpreter on every possible program. If the semantics is wrong, the proof gets stuck, and the LLM goes back to fix it. Step 4: If the proof goes through, you have a semantics you don't need to trust, and you can verify programs in a language that never had one, with guarantees that reach the binary that actually runs. Kiran has now done this end to end for a simple WHILE language, and we're scaling it up to Lua and OCaml, with Python as the north star.
13
20
4
167
9,067
Winkle retweeted
For your weekend reading: Build with Pi Durable on Cloudflare, a walkthrough of how to create a multiplayer chat agent, including subagents, on Durable Objects. earendil.com/posts/pi-durabl…
41
132
26
1,616
116,152
i went from "let me replace hermes and grok bot just for myself" to not only replacing them.. but replacing our family chat too and creating probably the best personal productivity agent rm -rf hermes grok-bot meet Pip :)
89
16
5
743
89,328
Winkle retweeted
interpretability might be the most important scientific problem in the world right now, as I don't think we can solve alignment if we don't know what we're building. I think I have good news about it. I co-authored early work in mechanistic interpretability at OpenAI and came away pessimistic, because neural networks appeared to fold into arbitrary tangled knots. years later, I started openai's first large-scale automated interpretability project, finding about 2% of neurons legible with the primitive tools we had with modern agentic tools and a much closer look, the picture looks totally different. the vast majority in models up to trillions of parameters are legible, and their circuits beautiful. many famous examples of tangled neurons turned out to be misunderstood. The roadblocks I expected mostly aren't there. I now think ambitious interpretability will be solved by the time we need it most, and possibly quite soon, as automated scientists keep improving. it may be a bitter lesson for interpretability: the simple thing, at absurd scale, works already-clean.goodfire.com/
891
2,646
1,461
19,910
4,717,896
Winkle retweeted
My dear friends, I’d like to show you my latest toy project Introducing Handwired: turn your regular JavaScript code into a neural net! - no training - exact outputs vs the JS program - fully differentiable All runnable in a browser, without GPU
459
1,023
469
11,353
1,469,248
New on our Engineering blog: Creating in-house source control. In May, we merged around 2,500 code changes per day. In September, we merged more than 30,000 per day. As a result, we became bottlenecked by developer infrastructure built for human (rather than agent) scale. Here, we share how we built a new version control system—and fully migrated our monorepo from git—in five months: anthropic.com/engineering/re…
1,174
2,662
2,204
25,955
8,363,892
I’ve had a few people write to ask me to follow up on a (reply!) tweet I wrote that’s gotten a lot of retweets. I considered deleting it just to avoid the headache, but I think that would make people more paranoid. So let me share my thoughts.
Replying to @kmad @matthew_pines
I think we might lose public key cryptography.
48
298
36
1,906
269,490
You can just (re)build things!
5
4
3
29
8,687
Pleased to announce my first @AntithesisHQ project: a property testing webinar! In property testing, instead of checking "this input to the function has this output", we check "given a million random inputs, all the outputs have this property". PBT has been around for a quarter century now and is fairly well known in functional programming and distributed system circles. Which is why we're gonna do something very experimental and target a community that almost never uses PBT: web developers. See, there's a thousand PBT tutorials out there, and they all use examples like "reversing a list twice returns the original list" and "add(x, y) should return the same result as add(y, x)". These are stateless properties on the code's functions, where we randomize inputs to a fixed test sequence. People have a hard time finding useful stateless properties in their systems. I've come to believe that most intuitive and useful business properties are instead stateful properties on what must always hold about the system's states. For example, "our total spend is always below our budget cap", or "two talks must never be scheduled for the same room and time", or "free users can't access premium features". We can property test these by randomizing the test sequence itself, to simulate a user doing whatever the heck they want, and testing that no matter what they do, our properties still hold. So, if you've ever had your data model get corrupted because you forgot to validate one update method, or seen a 500 when the user clicks `send` three times in a row, or gotten mad at SQL for not enforcing cross-table constraints, this webinar is for you. We'll be live on October 29. Sign up here: pages.antithesis.com/webinar…
5
14
2
126
8,574