<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.2.2">Jekyll</generator><link href="https://laughingmeme.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://laughingmeme.org/" rel="alternate" type="text/html" /><updated>2026-11-09T16:33:54+00:00</updated><id>https://laughingmeme.org/feed.xml</id><title type="html">Kellan Elliott-McCrea: Blog</title><subtitle>A personal blog of Kellan Elliott-McCrea. I don&apos;t really know what a &quot;laughing meme&quot; is. It sounded cool in 1999.</subtitle><author><name>Kellan Elliott-McCrea</name></author><entry><title type="html">Sick Day Project: Outlanders 2 “Wiki”</title><link href="https://laughingmeme.org/2026/10/26/sick-day-project-outlanders-2-wiki.html" rel="alternate" type="text/html" title="Sick Day Project: Outlanders 2 “Wiki”" /><published>2026-10-26T00:13:18+00:00</published><updated>2026-10-26T00:13:18+00:00</updated><id>https://laughingmeme.org/2026/10/26/sick-day-project-outlanders-2-wiki</id><content type="html" xml:base="https://laughingmeme.org/2026/10/26/sick-day-project-outlanders-2-wiki.html"><![CDATA[<p>I was supposed to ride the <a href="https://nyccentury.org/">NYC Century today</a>, but I ended up coming down with a nasty cold and I’m spending the day on the couch.</p>

<p>I enjoy the <a href="https://www.pomelogames.com/outlanders2/">Outlanders 2 game</a>, an easy going village sim. But somehow it’s never quite acquired one of those fandom wikis with the various details, and sometimes I’m curious about how many days it takes carrots to mature and what their yield is. (usually when playing in Tournament mode).</p>

<p>I used it as an excuse to try two LLM backed work modes I haven’t tried much, computer use and decompilation (really data mining of assets, no actual decompilation happened). Computer use was slow and finicky, and I hadn’t consciously realized that you can’t use your computer for anything else while the LLM is driving it. (I’d get bored and start doing something on my computer and come back to “Connection lost”)</p>

<p>Mining the game’s assets by contrast worked better and was easier than I could have possibly imagined. I didn’t have to tell it how, or anything about the data formats, or even where the files lived. I didn’t even have to sit at my computer. I setup a model running on my laptop with access to the binaries, and then a shared repo and set of issues that I could have a model on my phone task the local model with questions, and way we went.</p>

<p><a href="https://outlanders2wiki.com/buildings/carrot/">3 carrots per field plot every 9 days</a> btw, but also first pass on the wiki claims it’s a “building”. That’s data mining in a nutshell. (I might fix that)</p>

<p>So using the information Sol extracted from the game files, I quickly put together an <a href="https://outlanders2wiki.com/">Outlanders 2 “wiki”</a>. (wiki in the sense that there is a repo that will accept pull requests vs “wiki” in the sense that you can click to edit). (<a href="https://github.com/kellan/outlanders2-wiki">data repo</a>)</p>

<p><strong>update Oct 28:</strong> A cold that won’t let go is apparently great for side projects. Switched from working locally, to working primarily on my phone, and using Github issues plus some in repo docs as a RPC to an agent running locally when additional information was needed. 51 pull requests, 580 data records have grown to 871, including all 260 challenge levels with the dates each one runs, a Mechanics section, search, and a look inspired by the game.</p>

<p>Computer use still slow, but works better when I’m not trying to use the laptop at the same time.</p>]]></content><author><name>Kellan Elliott-McCrea</name></author><summary type="html"><![CDATA[I was supposed to ride the NYC Century today, but I ended up coming down with a nasty cold and I’m spending the day on the couch.]]></summary></entry><entry><title type="html">Goblin Village</title><link href="https://laughingmeme.org/2026/10/13/goblin-village.html" rel="alternate" type="text/html" title="Goblin Village" /><published>2026-10-13T01:00:56+00:00</published><updated>2026-10-13T01:00:56+00:00</updated><id>https://laughingmeme.org/2026/10/13/goblin-village</id><content type="html" xml:base="https://laughingmeme.org/2026/10/13/goblin-village.html"><![CDATA[<p>I’ve started working on a game about being a frustrated and ineffectual manager of a goblin village. Most of the work is writing narrative snippet and then asking Claude to turn it into code. On the phone, usually on the way back from school drop off.</p>

<p>Here is the opening the snippet.</p>

<blockquote>
  <p>You live in the Weald. It’s an ancient forest. It’s dark, it’s dank, the soil is terrible, and there are probably monsters in the dark, or at least very large boars. There are other goblin villages out there. Somewhere far away is the sea, and even further away, humans, or worse, elves, so we’re not going there.</p>
</blockquote>

<blockquote>
  <p><em>“This village is the most miserable excuse for a trash heap you’ve ever seen. There’s not enough to eat, and the food is terrible. It’s cold at night. It’s impossible to get a decent mushroom kebab or a cup of tea. And no one does a thing I tell them to.”</em> - Robin (the hero of our story)</p>
</blockquote>

<p>I’m having a lot of fun with it.</p>]]></content><author><name>Kellan Elliott-McCrea</name></author><summary type="html"><![CDATA[I’ve started working on a game about being a frustrated and ineffectual manager of a goblin village. Most of the work is writing narrative snippet and then asking Claude to turn it into code. On the phone, usually on the way back from school drop off.]]></summary></entry><entry><title type="html">Managers Are Catalysts</title><link href="https://laughingmeme.org/2026/09/14/managers-are-catalysts.html" rel="alternate" type="text/html" title="Managers Are Catalysts" /><published>2026-09-14T19:56:56+00:00</published><updated>2026-09-14T19:56:56+00:00</updated><id>https://laughingmeme.org/2026/09/14/managers-are-catalysts</id><content type="html" xml:base="https://laughingmeme.org/2026/09/14/managers-are-catalysts.html"><![CDATA[<p>As an industry, we like to shout a lot about experiments when we kick them off, all confident swagger that this time our superior intellects have landed from first principles on the correct reimagining of this or that piece of conventional wisdom. For a long time I had the idea of maintaining a receipts index for tech blogs, “Company X has declared Y is dead, do Z”, two years later, “Z is dead do Alpha!”. So many many examples in our industry it’s hard to choose just one example, but you could do worse than the <a href="https://blog.crisp.se/wp-content/uploads/2012/11/SpotifyScaling.pdf">Spotify management model</a>, which continues to take the industry by storm over a decade later, despite wide acknowledgment that it didn’t work, and was never fully rolled out at Spotify.</p>

<p>Recently there has been a loud declaration that management is dead. Organizations should flatten. Managers retrain as ICs or be let go. Etc. Facebook has been one of the loudest advocates of this approach. Six months in, <a href="https://laughingmeme.org/img/facebook_managers.png">they’re asking ICs to move back into management</a>.</p>

<p>A different thread running through the industry is <a href="https://newsletter.pragmaticengineer.com/p/the-great-engineering-leader-career-break">the large number of managers opting out</a>. There’s a sense that the work has gotten harder and less rewarding at the same time, with a mix of layoffs, tighter budgets, and typical founder psychosis turned to 11 by AI. (And fomo over those generating generational wealth)</p>

<p>These are two sides of the same coin. When organizations don’t understand why we have management, the role is undervalued and underinvested in.</p>

<p>And to be honest it’s easy to see how we got here. Much has been written (including by me) on how the 2010s was the industry on easy mode, money and customers were plentiful, technical challenges were minimal and largely outsourced to cloud providers, and the primary technique for improving a team’s capacity was to hire more people. (And then we speed ran this whole dynamic again during the pandemic, extending the 2010s even as the underlying conditions changed).  It just wasn’t that important to be that good at engineering leadership (or really any form of leadership) for many teams for a long time.</p>

<p>But now it is.</p>

<p>The point of a technology company is to create change. The point of engineering leadership is to increase your team’s capacity to create change. And managers? Managers are catalysts.</p>

<p>“Catalyst” has a colloquial definition, but it also has a technical one: a catalyst lowers the activation energy necessary for a reaction to occur. That’s what good management does.</p>

<p>Without a catalyst you can still create change. You add heat and pressure. Mandates. They work some of the time, and damage the system 100% of the time. Sometimes that’s the right call. A little damage now, do the expensive repair work later. If you invest in management you have a choice. If you don’t, you don’t.</p>

<p>In Facebook’s case the move to dramatically reduce managers (some teams moving to a 50:1 ratio) at a time they were rolling out a radical revision to their software development process <a href="https://www.reuters.com/investigations/mark-zuckerberg-had-bold-plan-replace-meta-staff-with-ai-heres-how-it-imploded-2026-08-26/">resulted in a 40% YoY increase in incidents, and a drop in team sentiment from 74% to 55% over a 6 month period</a>. Code changes were up 220%, but new value delivered to customers didn’t follow in line. That is not the type of change any of us are hoping to create.</p>

<p>How managers go about lowering activation energy is not a secret. It’s your standard laundry list of manager virtues. Build trust, lower cynicism. Connect the team’s local goals to larger strategic priorities, and adapt larger directional guidance to local context. Invest in both team cohesion, and development. Apple pie stuff.</p>

<p>We’ve known this for decades btw. There’s a classic paper, <a href="https://hbr.org/2001/09/in-praise-of-middle-managers">In Praise of Middle Managers</a>, built on a 3 year field study looking at what it takes to produce radical change. There are two failure modes: low commitment to the change produced inertia, and high commitment without attention to the people living through it produced chaos. Heat and pressure is the second one. Managers who don’t understand that lowering the cost of change is their job can be part of the first problem.</p>

<p>Many extremely well intentioned managers can end up impeding vs accelerating change. Managers who have internalized the “shit umbrella” archetype for example are likely to understand their role primarily as protecting the team from change versus increasing the team’s capacity to drive that change. That leads to a team that is underdelivering, and a burned-out manager. High performing “local optimizers” often resist change because they’ve got the system working the way they want it. Pass-through leaders who are doing none of the local adaptation of changes breed cynicism.</p>

<p>Your job, as a manager, is lowering that activation energy. Growth, learning and evolution are the work that you’re here to facilitate. Especially in times of change.</p>

<p>Your job as a leader is to invest in managers who can do this work. Train, celebrate, empower. There is a near-infinite list of new programs and processes that need to be managed, new training, new rituals, new anxieties. The idea that at <em>this</em> moment you need fewer managers because AI can summarize Jira is a fundamental leadership error.</p>

<p>If you’re seeing resistance to change. If you’re seeing burnout increasing. If you see individuals generating more code, but the impact isn’t accelerating at the same rate. If you want to transform your system of software development, the first thing you need is managers who understand the job.</p>]]></content><author><name>Kellan Elliott-McCrea</name></author><summary type="html"><![CDATA[As an industry, we like to shout a lot about experiments when we kick them off, all confident swagger that this time our superior intellects have landed from first principles on the correct reimagining of this or that piece of conventional wisdom. For a long time I had the idea of maintaining a receipts index for tech blogs, “Company X has declared Y is dead, do Z”, two years later, “Z is dead do Alpha!”. So many many examples in our industry it’s hard to choose just one example, but you could do worse than the Spotify management model, which continues to take the industry by storm over a decade later, despite wide acknowledgment that it didn’t work, and was never fully rolled out at Spotify.]]></summary></entry><entry><title type="html">Canonization and the Overhang</title><link href="https://laughingmeme.org/2026/06/30/canonization-and-the-overhang.html" rel="alternate" type="text/html" title="Canonization and the Overhang" /><published>2026-06-30T18:43:24+00:00</published><updated>2026-06-30T18:43:24+00:00</updated><id>https://laughingmeme.org/2026/06/30/canonization-and-the-overhang</id><content type="html" xml:base="https://laughingmeme.org/2026/06/30/canonization-and-the-overhang.html"><![CDATA[<p>David Bessis’s <a href="https://davidbessis.substack.com/p/the-fall-of-the-theorem-economy">“The fall of the theorem economy”</a> is ostensibly about LLMs and the pursuit of pure math, and I found it fascinating in its own right, even while I’m not qualified to evaluate a number of his claims. Worth stopping and reading on its own. Additionally he names a couple of key trends that will be familiar to any engineering leader in this moment, and gives us two very useful terms.</p>

<blockquote>
  <p>“The product of mathematics is clarity and understanding. Not theorems, by themselves.” — Bill Thurston</p>
</blockquote>

<p>Bessis makes the argument that mathematics has publicly been valuing proving theorems as the high status work, while systematically undervaluing and disguising the critical roles that creativity, community, clarity, and teaching play in advancing the field. Critical work got done without anyone explicitly setting out to do it, as an unacknowledged byproduct of the system of human production. Now with the advent of LLM powered theorem provers the theorem proving can happen in the absence of those critical side effects.</p>

<blockquote>
  <p>“definitions are worth zero points, expository work counts negative, and the best jobs should always go to the people who proved the hardest theorems.” — David Bessis</p>
</blockquote>

<p>The parallels to writing code write themselves.  How should we think about the value of code that passed the tests versus code that has been socially constructed in a way that leaves the team prepared to operate on it, iterate it, and improve it?  How should we think about the value of 200k lines of unintelligible Lean autoformalization?</p>

<p>Two interesting terms to come out of the exploration:</p>

<h3 id="canonization---general-reusable-coherent-efficient-and-compatible">Canonization - general, reusable, coherent, efficient, and compatible.</h3>

<blockquote>
  <p>By canonization, I mean the process of taking a local, one-off formalization and turning it into library mathematics: general, reusable, coherent, efficient, and compatible with the rest… Canonization often changes the picture itself: the definitions, the abstractions, the API, and sometimes even the statement… This is extremely difficult and time-consuming. - Alex Kontorovich</p>
</blockquote>

<p>This is the difference between code written for yourself, as part of a greenfield, or as a one off. Canonization is the separate work of turning the “I got it working” version into something the future can build on.</p>

<p>Fork in the road here. Bessis asserts that the <em>only</em> true value of proving a theorem is for the practitioners that follow. In software we explicitly have the inverse situation, disposable code we put in production is a key learning tool, arguably you <em>can’t</em> know the correctness and value of the work until you’ve deployed, this is the entire idea behind MVP.</p>

<p>Still we all benefit everyday from code that has been canonized, the stable abstractions, the boringly reliable systems we don’t have to think about, the encoded best practices. That weird of the moment phenomenon where everyone has a vibe coded solution for you to try to a problem, and it feels more reliable to vibe your own, that’s the lack of canonization we’re feeling. When we say <a href="https://laughingmeme.org/2026/02/09/code-has-always-been-the-easy-part.html">“coding has always been the easy part”</a> we’re explicitly drawing a distinction between the act of getting lines of code into a text file and the canonization. It’s the photo negative of <a href="https://kellanem.com/notes/towards-an-understanding-of-technical-debt">“technical debt”</a>. Features of a codebase that resist change, the code that sucks the will to live are measures of an absence of effective canonization. (though <em>often</em>, especially in the traditional human powered software systems they were also evidence of <em>bad</em> canonization)</p>

<p>We’re in a golden age of disposable and single use software. This software reads as “bad” to any pre-existing aesthetic judgement. Those definitions of “good” and “bad” software was a doing a lot of implicit, unstated work. Canonization feels like a useful term to make that work explicit for software that needs to live on, and be legible to systems of humans and non-humans operating on it. Canonization is the difference between work that does today’s task and work that is accretive. (and value exists in both)</p>

<h3 id="the-overhang">The Overhang</h3>

<p>I’m always a sucker for a good “The Thing” coinage (see <a href="https://en.wikipedia.org/wiki/The_Peripheral">“The Jackpot”</a>), and The Overhang is no exception.</p>

<blockquote>
  <p>The Overhang consists of the <em>unrealized capital gains</em> of past (mathematical) creativity, the latent value from connecting the dots in the existing corpus. It is a dividend of canonization. Mathematician X states problem A, mathematician Y crafts concept B, then mathematician Z notices that B trivially solves A and “captures” the social reward. But in the process of capturing the reward, Z usually introduces new concepts and new open problems, reinjecting latent value into the Overhang.</p>
</blockquote>

<p>LLMs, being tools that naturally can memorize the entire corpus and pattern match on it, are extremely well suited for searching the Overhang, and do it in a way completely distinct from how humans do it. If an LLM searches by reading everything, humans are engaged in a fundamentally different project with intuitive leaps based on reading a small number of papers and interacting with other brains.</p>

<p>Software has an Overhang as well. Open source. Decades of canonized, intelligible, build-on-able work, sitting in public repos. (and Stack Overflow, and blogs, etc).</p>

<p>The Overhang is genuinely exciting, allowing us to discover (develop) things that would never have been realized with just human brains on the problem. The dream of searching the Overhang has existed for decades, or at least since Highlander II: The Quickening.</p>

<p>Don’t love Bessis’s coining of “intuition-maxxers”, but I’m absolutely familiar with and excited about the people “seeing further than anyone before, standing on the shoulders of giant machines.”</p>

<p>But if we’re not careful, the <a href="https://en.wikipedia.org/wiki/Cognitive_Surplus">Cognitive Surplus</a> becomes the Cognitive Seed Corn (as in the eating of, credit <a href="http://mike.teczno.com/notes/">Migurski</a>). If we continue to value only the work of theorem proving (coding) and not the work of canonizing (and also training the next generation of practitioners) then the Overhang will grow increasingly poor as a search space. We see this already in how reviewing is more fatiguing and also unrewarded. No one gets status for doing cleanup. (see Tanya’s <a href="https://www.noidea.dog/glue">glue work</a>)</p>

<p>Generation easy. Canonization hard. Running code valuable; presumably autoformalization too. But the intuition and the social production of knowledge are the seed corn.  Our task is to reimagine how teams work and what we give status to, so that our practices don’t leave our people or the Overhang depleted.</p>]]></content><author><name>Kellan Elliott-McCrea</name></author><summary type="html"><![CDATA[David Bessis’s “The fall of the theorem economy” is ostensibly about LLMs and the pursuit of pure math, and I found it fascinating in its own right, even while I’m not qualified to evaluate a number of his claims. Worth stopping and reading on its own. Additionally he names a couple of key trends that will be familiar to any engineering leader in this moment, and gives us two very useful terms.]]></summary></entry><entry><title type="html">The Importance of Tools and the Hedonic Treadmill of “Feels like Magic”</title><link href="https://laughingmeme.org/2026/05/22/the-importance-of-tools-and-the-hedonic-treadmill-of-feels-like-magic.html" rel="alternate" type="text/html" title="The Importance of Tools and the Hedonic Treadmill of “Feels like Magic”" /><published>2026-05-22T12:08:10+00:00</published><updated>2026-05-22T12:08:10+00:00</updated><id>https://laughingmeme.org/2026/05/22/the-importance-of-tools-and-the-hedonic-treadmill-of-feels-like-magic</id><content type="html" xml:base="https://laughingmeme.org/2026/05/22/the-importance-of-tools-and-the-hedonic-treadmill-of-feels-like-magic.html"><![CDATA[<p><strong>update 2026-07-06</strong>: Anthropic added Playwright Chromium and an Artifact tool to their hosted environment. Feels more magical.</p>

<p>Claude Code felt like magic when I used it for the first time (14 months ago?). And then it felt like magic again when the models got good at code at the end of the year.</p>

<p>But then I wanted to be able to <a href="https://laughingmeme.org/2026/03/24/coding-and-blogging-on-vacation.html">vibe code entirely from my phone, one handed on vacation, while sipping a fruity drink and playing beach soccer with the kiddos</a>, which brought me to exe.dev and Shelley. Shelley is great because its batteries included, all the tools you need out of the box to do web development.</p>

<p>Of course after that it started to feel clunky. The UI is a power tool of options, compaction is disruptive at a time when most agents are smoothing that experience out, exe.dev is still primarily focusing on it’s magic SSH setup experience, but I’m on my phone, and the phone based ssh/terminal clients feel like the increasingly baroque products of an evolutionary dead end.</p>

<p>So now I’m using “Claude Code for Web for iOS” (I think that really is the product name), and it’s simple and elegant, that nice soothing color palette of Anthropics, fewer things shoved in than the web experience, and it’s just “chat with your repo”, no vestigial or distracting UI elements.</p>

<p>Kiddo and I took some photos of sketches she made and <a href="https://kellanem.com/skybound/">started building a game together</a> on the subway ride to school. She’s the artist and art director, I’m holding the phone with Claude on it in one hand, and the pole in the other.</p>

<p>But the tools are surprisingly weak.</p>

<ul>
  <li>
    <p>There’s no built in hosting option, surprising given Claude for Web has had artifacts forever, I’m reduced to using githack to get live previews of the work (and with some fiddly caching issues).</p>
  </li>
  <li>
    <p>It can’t see your work, no VLM, no screenshot tools, no Playwright/Chrome Dev Tools skills. Certainly nothing as sophisticated as the Shelley tools around mobile web emulation, profiling, accessibility, etc. (also when is Claude get video support a la Gemini?)</p>
  </li>
</ul>

<p>Off the train, with two hands and a spare minute exe.dev/Shelley looks a lot more compelling (and the price differential between Anthropic’s subsidized accounts is getting smaller as the subsidies get smaller). But rising expectations mean none of it is feeling magical anymore, just all tools and compromises, and TODO: FIXME. Which is, in and of itself, wild.</p>]]></content><author><name>Kellan Elliott-McCrea</name></author><summary type="html"><![CDATA[update 2026-07-06: Anthropic added Playwright Chromium and an Artifact tool to their hosted environment. Feels more magical.]]></summary></entry><entry><title type="html">Coding on Vacation</title><link href="https://laughingmeme.org/2026/03/24/coding-and-blogging-on-vacation.html" rel="alternate" type="text/html" title="Coding on Vacation" /><published>2026-03-24T14:37:37+00:00</published><updated>2026-03-24T14:37:37+00:00</updated><id>https://laughingmeme.org/2026/03/24/coding-and-blogging-on-vacation</id><content type="html" xml:base="https://laughingmeme.org/2026/03/24/coding-and-blogging-on-vacation.html"><![CDATA[<p>The question I asked myself (and the private Slack channel): is ensuring that I have a phone based approach to agentic coding while I’m on vacation healthy because I’m ensuring that I’m not on the computer, a phone is less instrusive, or extremely unhealthy, because you know (gestures broadly) the whole being on vacation thing.</p>

<p>First attempt was VPS + Tailscale + tmux + Moshi + Claude Code Remote Control.</p>

<p>Clunky. SSH on the phone is never going to be fun. Claude Code /rc is very much a 1.0 product (sorry Andy!), I didn’t have a good pipeline to serving the things I was building, and when I put CC on yolo’ing some network configurations I lost access to the VPS, and breaking back in is a post vacation activity.</p>

<p>Second was using exe.dev, and in particular their agent Shelley. (Frankenstein reference?)</p>

<p>It’s been a ton of fun, works great on mobile web. Comes with a sophisticated set of tools around coding, researching, brainstorming, testing in browsers (including mobile emulation, accessibility and performance), visual QA, etc. As someone who has been playing with souping up harnesses recently this feels like a nice one. It uses sub-agents by default, and async web UI so it’s all background work by default. Has a built in code to publish pipeline. I’m having a lot of fun with it. My only caveat is I’m not sure how much it’s going to cost, I can’t really reason about that bit yet.</p>

<p>Started building a fun toy while we waited on the tarmac at JFK: a <a href="https://garden.exe.xyz/">garden of generative coding techniques</a> (in an older sense of the word).</p>

<p>And then I had it check out my blog repo, new my new post script, and I transcribed this blog post while getting a break from the sun. Fun.</p>]]></content><author><name>Kellan Elliott-McCrea</name></author><summary type="html"><![CDATA[The question I asked myself (and the private Slack channel): is ensuring that I have a phone based approach to agentic coding while I’m on vacation healthy because I’m ensuring that I’m not on the computer, a phone is less instrusive, or extremely unhealthy, because you know (gestures broadly) the whole being on vacation thing.]]></summary></entry><entry><title type="html">Hack: claude -p</title><link href="https://laughingmeme.org/2026/03/20/hack-claude-p.html" rel="alternate" type="text/html" title="Hack: claude -p" /><published>2026-03-20T11:49:53+00:00</published><updated>2026-03-20T11:49:53+00:00</updated><id>https://laughingmeme.org/2026/03/20/hack-claude-p</id><content type="html" xml:base="https://laughingmeme.org/2026/03/20/hack-claude-p.html"><![CDATA[<p><code class="language-plaintext highlighter-rouge">claude -p</code> is a quick hack that I find myself using more.</p>

<p>Calling one of the various LLM APIs is easy. But requires key management. For me on a personal project that’s no big deal. In a work context it’s less trivial. But I’m working in <code class="language-plaintext highlighter-rouge">claude</code>, which means I have a tool talking to a LLM API running already all the time, that already has not only an API key, but also an allocated budget that is being managed around making me more productive. Much easier if all my LLM based productivity is spend hits a single line item.</p>

<p>E.g. a quick script to classify Github PRs has a section like:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">return</span> <span class="sa">f</span><span class="s">"""You are classifying GitHub pull requests for an engineering team.

  PRODUCT AREAS (choose exactly one per PR):
  </span><span class="si">{</span><span class="n">area_lines</span><span class="si">}</span><span class="s">

  WORK TYPES (choose exactly one per PR):
  </span><span class="si">{</span><span class="n">work_type_lines</span><span class="si">}</span><span class="s">

  For each PR, return a JSON array with these fields:
  - pr_id, product_area, work_type, confidence, keywords

  Return ONLY the JSON array. No prose, no markdown fences.

  PULL REQUESTS:
  </span><span class="si">{</span><span class="n">prs_text</span><span class="si">}</span><span class="s">"""</span>
</code></pre></div></div>

<p>And the call itself:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">def</span> <span class="nf">_call_claude</span><span class="p">(</span><span class="n">prompt</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span> <span class="o">|</span> <span class="bp">None</span><span class="p">:</span>
      <span class="k">try</span><span class="p">:</span>
          <span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="p">.</span><span class="n">run</span><span class="p">(</span>
              <span class="p">[</span><span class="s">'claude'</span><span class="p">,</span> <span class="s">'-p'</span><span class="p">,</span> <span class="s">'--output-format'</span><span class="p">,</span> <span class="s">'text'</span><span class="p">],</span>
              <span class="nb">input</span><span class="o">=</span><span class="n">prompt</span><span class="p">,</span>
              <span class="n">capture_output</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
              <span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
              <span class="n">timeout</span><span class="o">=</span><span class="mi">300</span><span class="p">,</span>
          <span class="p">)</span>
          <span class="k">return</span> <span class="n">result</span><span class="p">.</span><span class="n">stdout</span><span class="p">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">if</span> <span class="n">result</span><span class="p">.</span><span class="n">returncode</span> <span class="o">==</span> <span class="mi">0</span> <span class="k">else</span> <span class="bp">None</span>
      <span class="k">except</span> <span class="p">(</span><span class="n">subprocess</span><span class="p">.</span><span class="n">TimeoutExpired</span><span class="p">,</span> <span class="nb">FileNotFoundError</span><span class="p">):</span>
          <span class="k">return</span> <span class="bp">None</span>

</code></pre></div></div>
<p>Probably this is what the agent sdk is for? This worked.</p>]]></content><author><name>Kellan Elliott-McCrea</name></author><summary type="html"><![CDATA[claude -p is a quick hack that I find myself using more.]]></summary></entry><entry><title type="html">Timberborn 1.0, HTTP Lever, and Claude Code</title><link href="https://laughingmeme.org/2026/03/15/timberborn-1-0-http-lever-and-claude-code.html" rel="alternate" type="text/html" title="Timberborn 1.0, HTTP Lever, and Claude Code" /><published>2026-03-15T18:27:49+00:00</published><updated>2026-03-15T18:27:49+00:00</updated><id>https://laughingmeme.org/2026/03/15/timberborn-1-0-http-lever-and-claude-code</id><content type="html" xml:base="https://laughingmeme.org/2026/03/15/timberborn-1-0-http-lever-and-claude-code.html"><![CDATA[<p>Timberborn is very much my kind of game. Complex, cozy, climate change, water system design, beavers. (My friend <a href="https://schuyler.info/">Schuyler</a> pointed out at one point that my preferred genre of game is “management sims”, and that perhaps I was little over rotated on my day job.)</p>

<p>I played it a <em>ton</em> during Early Access, and it’s great to see it finally reach 1.0. I highly recommend it.</p>

<p>One of the things they added in 1.0 is a full automation system. <em>Finally</em>. (Though I’ll be honest I was mostly okay with Sluice Gate there by the end at least for basic reservoir management). But now you can get serious! Automations can work on water depth, flow, contamination, the weather, resource counts, population counts, etc. There is memory, and a full complement of logic gates for wiring up your very own beaver powered Turing machine.</p>

<p>But one of the things they <em>also</em> added to 1.0 is the ability to have the game call arbitrary HTTP endpoints, and vice versa.</p>

<p>If you build an “HTTP Lever”, Timberborn will expose HTTP endpoints for turning it off and on on localhost.  Connect it to a fireworks launcher and now you can have fireworks launch across the sky every time that endpoint is called.</p>

<p>Have Claude Code add a Notification hook that calls that endpoint like so, and now every time Claude needs your attention: fireworks launch in Timberborn.</p>

<p><img src="/img/timberborn-fireworks.png" alt="Fireworks in Timberborn" /></p>

<p>(Or you can add it to the Stop hook if you want to know every time Claude stops)</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"hooks"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"Notification"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="p">{</span><span class="w">
        </span><span class="nl">"matcher"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">
        </span><span class="nl">"hooks"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
          </span><span class="p">{</span><span class="w">
            </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"command"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"curl -s 'http://localhost:8080/api/switch-on/HTTP%20Lever%201'"</span><span class="w">
          </span><span class="p">}</span><span class="w">
        </span><span class="p">]</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </span><span class="nl">"Stop"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
      </span><span class="p">{</span><span class="w">
        </span><span class="nl">"matcher"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">
        </span><span class="nl">"hooks"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
          </span><span class="p">{</span><span class="w">
            </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"command"</span><span class="p">,</span><span class="w">
            </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"curl -s 'http://localhost:8080/api/switch-on/HTTP%20Lever%201'"</span><span class="w">
          </span><span class="p">}</span><span class="w">
        </span><span class="p">]</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">]</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>]]></content><author><name>Kellan Elliott-McCrea</name></author><summary type="html"><![CDATA[Timberborn is very much my kind of game. Complex, cozy, climate change, water system design, beavers. (My friend Schuyler pointed out at one point that my preferred genre of game is “management sims”, and that perhaps I was little over rotated on my day job.)]]></summary></entry><entry><title type="html">Socialize the Plan</title><link href="https://laughingmeme.org/2026/03/05/socialize-the-plan.html" rel="alternate" type="text/html" title="Socialize the Plan" /><published>2026-03-05T11:45:16+00:00</published><updated>2026-03-05T11:45:16+00:00</updated><id>https://laughingmeme.org/2026/03/05/socialize-the-plan</id><content type="html" xml:base="https://laughingmeme.org/2026/03/05/socialize-the-plan.html"><![CDATA[<p>On AI and code review.</p>

<p>Anyone who tells you they have this current moment in coding figured out is lying to someone (you or themselves). I’m going to keep sharing half-formed thoughts, and bits of things I’ve learned.</p>

<p>As the cost of writing code goes to zero new strains and bottlenecks appear. This is what we expect when we think about building software as a system. For most teams the first place that strain appears is in code review.</p>

<p><em>No one</em> wants their job to become spending all day carefully reviewing code that someone else had a machine generate in minutes.</p>

<p>Simon wrote yesterday about the anti-patterns of <a href="https://simonwillison.net/guides/agentic-engineering-patterns/anti-patterns/#inflicting-unreviewed-code-on-collaborators">Inflicting unreviewed code on collaborators</a>. Also nice to read the recent <a href="https://www.latent.space/p/reviews-dead">How to Kill the Code Review</a>, and see an old friend like the <a href="https://en.wikipedia.org/wiki/Swiss_cheese_model">Swiss cheese model</a>.</p>

<p>Code review is a funny topic.</p>

<p>Most senior engineers and engineering leaders I know have always been quietly skeptical of its value. It’s expensive, and the data on defect detection doesn’t justify the cost. Meanwhile teams tend to put too much trust in code review while underinvesting in other tools to gain confidence: monitoring, automation, better coding tools and practices, training, etc. (Swiss cheese!)</p>

<p>Code review ubiquity is tied to GitHub’s (really quite recent I promise you!) rise to ubiquity, a tool designed for open source development, that quickly sublimated into being “conventional wisdom and best practice”. So much to say about how in software, we keep believing we’ve found “normal” and “best practice,” forgetting we’re 50 years into an experiment where we tear up and reinvent best practices every 5–10 years.</p>

<p>As a senior leader you sort of shrug and sigh, and be glad that code review has some nice side benefits like ensuring that information is dispersing through the organization, that people are talking to each other, learning and teaching is happening, all of which are valuable.</p>

<p>But that is all about code review for human written code and so I digress.</p>

<p>On my team we’re not ready (yet?) to ditch code review, but I got this insightful feedback on the first large AI generated PR I tried to land that has shaped my thinking. </p>

<blockquote>
  <p>In a manually coded PR, if a reviewer comes in and pushes back on the design, then that’s often a smell that the design wasn’t sufficiently socialized prior to spending time on the implementation. So we have meetings to review designs, we write RFCs, etc, to get consensus about how to do a thing before we commit effort to it. In this case, you went through the planning phase with the agent to determine the approach to take, and then had it churn out the diff.</p>
</blockquote>

<blockquote>
  <p>getting design push-back in a manually written PR is annoying because the effort expended to write it was wasted if the design has to shift. But if the agent is able to quickly produce a new diff once a plan is updated to reflect design feedback, then push-back on the plan isn’t a big deal because we can just update the plan and re-run the agent.</p>
</blockquote>

<p>Anyone working with coding agents regularly knows the planning phase is where the bulk of the time is spent not to mention where the human cognition and creativity is happening (that and designing the verification steps). Plan → save the plan → implement → describe diff → review → verify → fix → possibly update the plan.</p>

<p>Implementation, the generating of code, is really a rather minor and cheap part of the process. Why obsess on getting feedback on that part?</p>

<p>That’s our latest learning as a team: <strong>Socialize and get feedback on the plan.</strong> (Also on the verification steps. And maybe on how you configure your reviewers.)</p>

<p>This is the most human to human high bandwidth work.</p>

<p>I liked a lot of the framing of the problem in Simon’s and Ankit’s posts (and seeing an old friend like Swiss cheese model). But I think their solutions missed out on a plan for ensuring the continuation of the real value that code review provides: socialization, information dispersal, learning and teaching.</p>

<p>Ankit is right, the human work moves upstream (as it always has).</p>

<p>You can look at the code. But honestly, it’s the human driving the agent’s job to worry about the code, ensure it works, and that they meet the standards of the org. We can do something more valuable with our teammates time when we ask them to review our work.</p>]]></content><author><name>Kellan Elliott-McCrea</name></author><summary type="html"><![CDATA[On AI and code review.]]></summary></entry><entry><title type="html">Ed’s Software, in a Time of Fear</title><link href="https://laughingmeme.org/2026/03/01/software-in-a-time-of-fear.html" rel="alternate" type="text/html" title="Ed’s Software, in a Time of Fear" /><published>2026-03-01T13:58:18+00:00</published><updated>2026-03-01T13:58:18+00:00</updated><id>https://laughingmeme.org/2026/03/01/software-in-a-time-of-fear</id><content type="html" xml:base="https://laughingmeme.org/2026/03/01/software-in-a-time-of-fear.html"><![CDATA[<p>I enjoyed this essay from my friend Ed Lyons, which I think speaks well to <em>my</em> particular state of mind as someone who has been in this industry for 30+ years, a parent, a people leader, a builder.</p>

<p><a href="https://mysteriousrook.medium.com/software-in-a-time-of-fear-4e5a08ac7c63">Software, in a Time of Fear</a></p>

<blockquote>
  <p>Up front, here are the lessons:</p>

  <ol>
    <li>Stop listening to people who are afraid</li>
    <li>Seek first-hand testimony, not opinions</li>
    <li>Go with someone much more enthusiastic than you</li>
    <li>Do not look down</li>
    <li>You must get different equipment</li>
    <li>Put the summit out of your mind</li>
  </ol>

  <p>Yet I hope you stay for the hike up.</p>
</blockquote>

<p>Personally I’m working on 1, 2, 3, and 5. I’m struggling with 4 and 6.</p>]]></content><author><name>Kellan Elliott-McCrea</name></author><summary type="html"><![CDATA[I enjoyed this essay from my friend Ed Lyons, which I think speaks well to my particular state of mind as someone who has been in this industry for 30+ years, a parent, a people leader, a builder.]]></summary></entry></feed>