Let Them Write RFCs

ohr1 pts0 comments

Let Them Write RFCsLet Them Write RFCs<br>August 11, 2026<br>vibecoding<br>thoughts

Or: why I spent hundreds of millions of tokens to write four versions of the same markdown file.<br>I&rsquo;m working on a complex project that&rsquo;s just beyond what I know how to build, which is pretty fun! But also hard, especially when I try to speed things up by using LLMs.1 As a result:<br>Sometimes I don&rsquo;t understand the problem well enough.<br>Sometimes I don&rsquo;t know that.<br>Sometimes I&rsquo;m easily fooled by ideas that sound good due to 1 & 2.<br>Some would argue that one shouldn&rsquo;t be going around working on things they don&rsquo;t understand armed with nothing but good vibes.

That&rsquo;s BS. I never had a good understanding of something when I started working on it. Working on the thing is what makes you understand the thing!<br>But these problems are amplified by LLM usage: friction is removed, so you can continue working on the thing without understanding it, or even noticing that you don&rsquo;t, which of course makes it easier to be fooled - resulting in a terrible cycle of LLM psychosis.<br>Combine this with the tendency of the current generation of LLMs to tenaciously tunnel toward a target, and you get why people are losing their minds.

For this project, there were two things that helped. The first was throwing away two &ldquo;complete&rdquo; implementations of the codebase. Nothing will teach you more about a problem than a bad first draft, and building bad drafts has become (too?) economical these days. But even with these rough drafts it was clear that things could go wrong in both expected and unexpected ways.<br>So while I knew more about the problem, I also had a bad feeling there where many more unknowns ahead.<br>Optimizing for Discussing a Problem, Not a Solution<br>When you ask an LLM2 to solve a problem, even in plan mode, it will optimize for &ldquo;how to solve this problem&rdquo; (d&rsquo;oh),<br>and even if there are a few follow-up questions, they serve the ultimate goal of getting the problem solved - usually by making a beeline for the most immediate solution possible. Do it enough times, and you&rsquo;ll be drowning in slop.<br>You can navigate towards the right solution if you know you&rsquo;re looking for.<br>But do you do when you don&rsquo;t? Especially when you should suspect that you don&rsquo;t know enough about the problem? We can&rsquo;t keep throwing away all the code!<br>I started asking, sometimes after intensive rambling, &ldquo;&mldr; this is the vague problem we have right now. Write a markdown file called $PROBLEM_RFC.md about this problem and how to solve it. Keep the prose3 short, have good code examples.&rdquo;<br>By asking a model to produce an RFC, I&rsquo;m optimizing for understanding and explanation , which makes problems more visible. An RFC is unlikely to be good enough on the first try, so I&rsquo;ll iterate and revise (V1.md, V2.md, etc.), consulting documentation and looking things up, until I understand the problem well enough and think the ideas are sound, which is where most of my learning happens.<br>I found it both more useful in that it produces better solutions and code, and more enjoyable for me to work on: instead of reading slop code, iterating on an RFC forces me to explain what I don&rsquo;t understand and to focus on grasping the hardest parts of the problem.<br>Why RFCs<br>An RFC4 needs to get a few things into my brain (💬➡️🧠):<br>What exactly is the problem?<br>How bad or important is it?<br>Will this solution fix the problem?<br>How costly will the solution be, vs. the alternatives?<br>If I&rsquo;m not sold on any of these, especially by the definition of the problem, I&rsquo;ll just ask. &ldquo;Explain this part of the problem&rdquo;, &ldquo;Why is it this and not that?&rdquo;, &ldquo;What about &mldr;&rdquo;, &ldquo;Didn’t we already do this in &mldr;&rdquo; - again and again until I&rsquo;m actually convinced.<br>RFCs have a high standard for both prose and explanatory code, forcing more work on the LLM than on the reader,<br>and they make problems-with-the-problem easier to spot than they are in an implementation.<br>Throw Away Code Anyway<br>The real test of an RFC, and of my understanding, is the final code:<br>sometimes an RFC will sound great on paper but the resulting code is still, unfortunately, garbage.<br>Worse, I might not understand the code well enough to tell whether or not it&rsquo;s garbage.<br>When that happens, I can say &ldquo;this and that went wrong, read the diff, read the RFC, write a new version that &mldr;&rdquo;, or &ldquo;this code is garbage, here&rsquo;s the RFC, what went wrong? Write a markdown file with a review&rdquo;.<br>Then, I&rsquo;ll throw away the changes and start again.<br>vs. Plans<br>Usually, an RFC is not an actual implementation plan (like a plan in Cursor or plan mode in Claude Code):<br>the focus is on the problem, the general shape of the solution, and the alternatives.<br>For a plan, the details are everything: I mostly care that all the things I asked for are accounted for,<br>and...

rsquo problem code ldquo rdquo write

Related Articles