sam firke dot com

Rare blog, rattlin’ blog

Author: sfirke

  • AI coding in October 2026: AI independently evaluating AI
    ,

    AI coding in October 2026: AI independently evaluating AI

    AI writing only impressed me once, the first time I tried ChatGPT and asked it to write a limerick. Guessing the next token is a neat trick but it doesn’t know what I want to say so it can’t say it for me.

    But its coding ability is another thing entirely. I’ve been using AI models to help me code since late 2024 (I started with Claude Sonnet 3.5 and OpenAI GPT-4o in GitHub Copilot). Every couple of months something has blown my mind, from either a new technological breakthrough (new model, new harness) or simply a new-to-me use case. This post is about the latter.

    Sometimes I tell a friend or coworker about the breakthrough; other times I just sit and stare at the computer, or go for a walk. This time I’ll try writing it. My purpose is two-fold:

    1. A diary that captures a moment in time. AI coding has changed so rapidly, and so completely since 2024, that maybe it’ll be nice to have an archaeological record of what will be olden times.
    2. To give non-coders who might read this a glimpse of what AI can do with programming these days.

    Today I’m writing about “evals,” short for evaluation of AI products. I have built a few chatbots for internal use at work. At their simplest, they let users search “what is the maximum sick time paid out upon retirement?” and the most relevant chunks of policy text are fed to an AI model to synthesize. I could say more about these chatbots but that’s for another post.

    When I built them, I tested out different models to see which should handle the task of synthesizing the answer. I pick from the choices on OpenRouter, which can route your call to any of hundreds of models. My testing was ad-hoc: I’d run the same query against different models and see what the cheapest model was that could give a good answer in a fast enough response. “Good answer” was just my gut opinion.

    This month Anthropic released Claude Haiku 5.5, which scored high on benchmarks and was 90% cheaper than it’s predecessor Haiku 4.5. I wondered, if I swapped in Haiku 5.5 for the models currently powering my AI services (mostly Gemini 3.6 Flash), would I save money and get a better result? I decided that instead of hand-evaluating it myself on a few questions, I would direct Claude Code to do some evaluation.

    My prompt was simple. I feel a little embarrassed sharing a prompt but I’m trying to provide a window into where these things are at, so:

    Read more: AI coding in October 2026: AI independently evaluating AI

    Our different RAG services in this repo use different LLMs. At first we did no evals, then some informal / ad hoc testing. Today I’m interested in Claude Haiku 5.5, which is on OpenRouter for cheap and might outperform some of the models we’re using. Maybe this is a good occasion to formalize a set of evals? I’m new to eval practices for LLM work, so let’s maybe ease in with a single service. I was thinking you, Opus in Claude Code, would come up with evaluation tasks, then run the existing model vs Haiku 5.5 and score them. Store the results somewhere findable for future such work. Maybe it could capture qualitative notes too, e.g., if the responses have some characteristic or quirk, or if the prompts need to change to improve performance? Start by evaluating which model that we currently used is best suited for replacement with Haiku 5.5, based on its performance, class, release date, and cost on OpenRouter. Haiku 5.5 is currently $0.10 input and $0.50 output.

    Based on that, Opus 5.5 did the following:

    • Identify which AI chatbot service’s LLM was the best candidate for replacement with Haiku 5.5
    • Pick 31 example user questions based on our logs of questions users actually asked
    • Write its own answers to those and create a key for for what each answer must or must not include along with a scoring rubric
    • Run those sample questions through the models of interest (Haiku 5.5 and Gemini Flash 3.6)
    • Assign reviewer subagents to grade those outputs, blind to which model was which, and to choose which model had the better response to each
    • Compute the average scores, response time, and cost (based on actual billing from OpenRouter), concluding that Haiku 5.5 beat the Gemini model at a quarter of the cost.

    This was already a stunning result. I responded with:

    Evaluate the prompt improvements and implement any that are actual improvements.

    Another mediocre instruction from me and it was off to the races again. Opus tweaked the prompt that accompanies the user’s question, then ran the sample questions through the models again, blind-grading the outputs and double-checking the graded results from the reviewer subagents. It found an overall improvement, but noted, “the concision tweak on lookups shows mixed results (trading completeness for clarity), so I’ll test a v3 that keeps action-critical details while trimming only irrelevant provisions, then grade it against v2.”

    It found that v3 was not an improvement. In the process of grading the v3 answers, it noticed some recurring defects in the answers, like the answers containing “the context you provided” – a confusing response from the LLM, given that the excerpts it was fed were search results that the user never sees. So Opus 5.5 created a v4 prompt that was a tweak of v2, ran it all one more time, and ended up with this:

    a screenshot of Claude Code terminal output showing a grid comparing the scores of the different models and prompts on clarity, accuracy, acceptability, and ranked

    Along the way it found some bugs in the overall AI chatbot service: answers were sometimes cut off (I needed to increase the maximum allowed token limit for the OpenRouter response) and that one of my input policy documents was not being ingested correctly into the knowledge corpus, causing the LLM to be fed garbled text.

    The command /usage showed total cost $38.22, session runtime of 1h 10m. I used over 90% of my five-hour session limit, which I rarely hit. The main Opus agent context window was at 267k tokens (out of 1 million). I’ve just started using a Claude Code plugin called carbonlog to estimate the environmental damage caused by my personal Claude Code usage, but don’t have it installed on this work machine so can’t give a number here. Very much ballparking it, I’d wager 0.25-0.5 kg CO2 for a heavy Opus 5.5 session like this?

    I didn’t pay that $38.22. I’m on a Team plan that costs my employer $20/mo for a fixed amount of weekly usage. $38.22 is the cost I would have paid using the Claude API or on an Enterprise plan. Pretty good deal for a single session!

    But even $38 feels reasonable. This was an astounding session. I spent two minutes telling it to figure out if I should switch models and improve the prompt and I got an answer that was many times more rigorous than anything I could have feasibly done, in a sliver of the time.

    I glanced briefly at the answer key it drew up, read its output in the Claude Code session, and deployed its changes. Like so many other coding things these days, what I know about evals now is the general concepts and that AI can perform them autonomously. Which feels like all I need to know to apply them in the future.

    Is this post surprising or interesting or intelligible to non-programmers reading this? I wonder how this will age. At any rate, here’s a record of a facet of programming with AI that, in October 2026, impressed me a great deal. It’s a wild time to be coding.

    No comments on AI coding in October 2026: AI independently evaluating AI
  • ,

    Yuba and R&M Cargo Bikes Left North America

    I stopped into the local cargo bike store with a loved one who was shopping for a longtail e-bike and was surprised not to see Yuba bikes. The store owner informed me that Yuba had pulled out of North America. Not only that but Riese & Müller is leaving the US also.

    R&M makes drool-worthy bikes – I long coveted a Load 75 as my “if I won the lottery” bike – but it’s the Yuba news that hit me. Just a month ago I wrote a blog post sharing a pro tip for the Yuba Spicy Curry and I had a couple more planned. I love my Spicy Curry. I’ve ridden over 10,00 miles on this model over nine years. My kids grew up on the back of it.

    Now I won’t be able to buy another. And if anything goes wrong with my current bike it might be hard to get replacement parts. Yuba was based in California, but it sounds like they’ve moved headquarters to France. Argh.

    Apparently import tariffs are to blame. It hadn’t occurred to me that those would have such a big impact on high-end e-bikes, but it made sense once it was pointed out to me. I’m out of the loop on the cargo bike market and couldn’t have imagined that a brand like Yuba with a seemingly strong position would leave the US entirely. Are similar things happening due to tariffs in other niches and hobbies?

    E-Cargo Bikes keep getting better and I’m sure I can get a great one if I need to replace mine. I probably only have two years left of needing to carry two kids on the back at once; after that, a Tern HSD or GSD would be a nice downsizing option that would take a single older passenger comfortably. But I’ll always have a soft spot for Yuba bikes, especially the Spicy Curry, and I hope my friends and I who ride them will be able to get parts and repairs for our bikes as needed.

    No comments on Yuba and R&M Cargo Bikes Left North America
  • Meutch Update: September 2026
    ,

    Meutch Update: September 2026

    Ope, summer got busy and I didn’t post an August Meutch update. I made some good updates in July, then got pulled away by vacation (good) and illness (bad). Now school is back in session and work on Meutch is steaming along!

    Work on the application: Meutch gained many new features since my last post. The CHANGELOG has the details but here are some highlights from July:

    1. The messages inbox looks nice and you can archive messages and mark them read
    2. There’s now a “Contact Us” form so that users can report ideas or bugs to the admins without needing a GitHub account
    3. Claimed giveaways are hidden from the feed by default
    4. There’s no more “I want this” button, simplifying the process of assigning a giveaway to anyone who messaged

    Plus some bug fixes and backend work. I’ve done a lot in September, but that’s for the October update.

    Usage: activity on the app got a little quieter, dropping to 41 active users in July, then rebounding to 48 in August. I am still donating a dollar for each active user in each month, this time that went to Fed Up Ministries and the Mutual Aid Network of Ypsilanti (MANY). Go list an item or post or answer a request to keep these donations growing!

    Between long weekends, vacations, and spending time outside, I’ve had less time for working on the site and for using it. I’m hopeful that’s the case for other people too and that usage will pick back up now that fall is underway. Let’s share Halloween costume accessories! I just posted a request for some Thor accessories for my 6th grader.

    I continue to personally benefit from using Meutch. One highlight: In August borrowed tubes from two different people who responded to my Meutch request and took my boys tubing on the Argo Cascades. I lived here when the Cascades opened in 2012, how had I never been?! It’s definitely a top-things-to-do-in-Ann-Arbor attraction.

    Three kids in two inner tubes, floating on a river near a train bridge at sunset
    Our second trip was near sunset, it was much less crowded!

    These two loans were not tracked on Meutch (I’ve since added an “I have this item” button in replies to requests to make it easier to get these items into the site). This illustrates how the Meutch activity numbers I see are under-counts. The public canoe livery charges $14 for a 2-hour tube rental; the Meutch loans saved me $84 that weekend.

    Outreach: At this point the site itself is thoroughly ready for use. It needs one thing: more users. To that end I’m looking at more ways to make people aware of it:

    • I had a MEUTCH summer game code on my bike
    • I will be tabling at the Ann Arbor Zero Waste Festival on September 27th, 12-3pm at Kiwanis. It’s the only time all year you can shop Kiwanis resale on a Sunday! Come say hi.

    The Meutch Outreach Committee made these sweet flyers to hand out at events:

    I’ll carry a few with me for impromptu conversations, I’m bad at plugging my own stuff in person but want to get better.

    Onward!

    No comments on Meutch Update: September 2026
  • Yuba Spicy Curry hack: hanging bags off of the Monkey Bars
    ,

    Yuba Spicy Curry hack: hanging bags off of the Monkey Bars

    I have logged over 10,000 miles (!) riding a Yuba Spicy Curry cargo bike. Big shout-out to this 2016 blog post “Joys of the Yuba Spicy Curry”, from an early adopter in Wisconsin who rode 2,000 miles on his 1st-gen model. It helped convince me to take the plunge on mine in 2017.

    I rode the 1st-generation model until I wore it out, borrowed my neighbor’s 2nd-gen for a few hundred miles while I weighed my options, then bought my 3rd-gen and now have 5,400 miles on it and counting. Over that time Yuba has improved the design in ways big (that blogger notes how the rear wheel could loosen on the 1st-gen, now there are terrific thru-axles) and small (the frame lock location, the chain guard). I think for my needs the Spicy Curry is still the best bike out there, though I’d like to hear if you think there’s a better one. I haven’t ridden the 4th-gen yet.

    Over the years I’ve developed some tricks for getting the most out of this specific model of bike. One I shared already is the DIY Upholstered Seat Cushion that I made. I have at least three more good ones. The DIY bike carrier I designed is the best but it will take me the longest to write.

    This one is simple and works for any Yuba bike where the Monkey Bars are mounted. Just remove the inner rail on each side. That leaves more room for larger passengers, which is why I did it. But it comes with a bonus: it leaves the inner bar’s mounting sockets exposed. These are perfect attachment points to hang stuff of of!

    A Yuba Spicy Curry longtail cargo bike with two bags hanging off the rack in the back. On the left a blue lunchbox, on the right, in the foreground, a New Yorker canvas bag,

    If your kid’s backpack has a sturdy hanging strap at the top – most do – it’ll hang neatly off the back. A friend with a Spicy Curry who saw me doing this said that hanging two backpacks off the back of the Monkey Bars was a game-changer for their school commute.

    I hang reusable grocery bags off the back of my Monkey Bars. When the handles are long and the bag would hang too low, I wrap the handles around the rear bar once, then hook it on. This lets me transport two additional full bags of groceries home the store.

    On a typical commute to work, I have just a single canvas bag, which would fit in the 2-Go Bags on the sides of the bike. Even then I hang it. Suspending the bags in the air protects them against bumps. This lets me transport items that might not survive banging over potholes on the streets of Ann Arbor, like a glass jar of soup or a potted plant.

    Disclaimer: if I recall correctly, the Monkey Bars manual advises against removing this inner rail. They suggest that kids’ hands are safer from impacts if they hold the inner rail and that passengers could strike the exposed socket of the inner rail during a crash. I am using two curved end plugs that come with the Monkey Bars to make the front socket pieces less pokey in case of an impact; you could also use old tennis balls.

    I realize this is a niche post with a very small audience but if I reach a few Spicy Curry owners, it will have been worth it!

    1 comment on Yuba Spicy Curry hack: hanging bags off of the Monkey Bars
  • Installing a grommet to fix my belt’s torn hole
    , ,

    Installing a grommet to fix my belt’s torn hole

    A few years ago I was given a belt made out of old bike inner tubes (specifically, the Ballard Belt from Alchemy Goods). It worked great! A little stretchy and a nice repurposed object.

    Things fall apart. Eventually the belt hole that fits me got torn out:

    a black belt with white stitching, one of the holes has been stretched and ripped

    I asked around and no one local had a grommet tool to lend me. So I bought my own from Sail Rite (after going down a rabbit hole and looking for vintage setter dies on eBay). With the right tool for the job, it was a ten-minute repair and the belt once again holds my trousers up. The only thing I’d change would be to get a smaller size of grommet. I used #1 size, 5/16″ in, and for a belt I think #0 (1/4″) would be better. Here’s the fix, step by step.

    First I hammered a cutter tool (in the background of this photo) to make a clean hole for the grommet, over where the old hole had failed:

    the black belt on a scrap of wood on a wood workbench, with a clean large hole punched in it

    Then I inserted the top and bottom pieces of a grommet into the setting die and got ready to whack it with a mallet:

    the belt is sandwiched between two pieces of a grommet setter and die

    And voila! The hole was reinforced and usable again:

    the original belt, now with a gleaming grommet installed that is a little too big

    It does look a little distorted, not that I think anyone ever looks closely at my belt. Maybe if I had cut a bigger hole there would be less material to bunch up? I have two sizes of cutter and can’t remember which one I used.

    A smaller grommet might help as well. But regardless, my fix mates with the other part of the buckle perfectly:

    the closed belt, with the long skinny poker thing inserted through the grommet and held against the bar.

    Of course, one of the holes now looks different from the others, but I like that – the belt is now sized precisely for me. This repair technique also offers the opportunity to install a hole at any point, in case the user of the belt wants to wear it a little tighter or looser than the old hole allowed.

    The grommet would grip tightly anywhere, it doesn’t have to go where the old hole went. So you could buy a belt that doesn’t fit at a thrift store, or get a belt from a loved one, and create a strong hole exactly where it will fit you.

    Was it silly that I spent $70 on tools to fix a $40 belt? Well, I wanted to fix the dang belt and didn’t have another option. But (if you know me, you know what’s coming next) now I can lend the tool to people! And it will cost them $0. Maybe we can get more belts fixed.

    Here’s the grommet tool’s listing on Meutch, the peer-to-peer sharing site. Since that link will expire in 30 days, I’ll throw in a screenshot here to illustrate:

    a screenshot of meutch.com showing hole cutters and an inserting die for spur grommets for loan

    If you live in Ann Arbor, feel free to request the grommet setting kit from me on Meutch. Maybe you can repair your belt, or shower curtain, or make something attachable with a carabiner, or …

    I’m looking out for other uses for this tool. For instance, I installed a grommet on the safety clip for my bike carrier, a device I invented to tow bikes around town and that I intend to write up in its own post.

    That’s all. I hope this helps someone who believes their belt has more life in it even after a hole tears out!

    No comments on Installing a grommet to fix my belt’s torn hole
  • ,

    Another site migration complete

    In 2020, I migrated this blog to A2Hosting – I know that because I wrote about it at the time. I’ve just migrated again and am writing this brief post in part to check that everything is working (including sending via email to subscribers).

    I was up for renewal again this year at A2Hosting (now Hosting.com), looking at $450 for the next three years. I have gotten both more skilled at and more interested in self-hosted web stuff in recent years, so I took the plunge and started renting a little DigitalOcean Droplet virtual machine. I installed a little Docker Compose stack of these containers:

    • WordPress
    • MariaDB backend
    • Caddy frontend for SSL (and to lay the way for hosting other projects on this box)

    Then I exported my WordPress blog from my old admin panel, imported it on the new site, and it scraped all the media files from the old site. That’s all I had over on the old host. You’re now reading this page served from the DigitalOcean Droplet!

    I took the occasion to choose a new theme, Twenty Twenty-Five. I hadn’t realized that my old theme, Twenty Twenty, was not 100% compatible with the “new” Gutenberg block style that WordPress uses these days. This is a nice quality of life upgrade.

    Unfortunately I still have a lousy sense of style, including web design. I cycled through different layouts and color schemes, loving none of them. This was the best I could do but I don’t love the main font or the colors. If something is hard to read, let me know, especially if you have an idea for a better set of choices!

    EDIT: I’ve worked on this and am much happier with the aesthetics!

    The Droplet is about half the price of the hosted solution, but that’s not the only advantage. I can now also host family members’ WordPress blogs at no additional cost to myself using the shared infrastructure, including backups I’m piping to a separate cloud provider (Hetzner, in Germany). And I can host any other web projects that need a home. I have tinkered a little with a tool that will help me mealplan, basically suggesting to me what I should cook each week. If I ever get it running, I’ll host it on this droplet too.

    Just need to remember to do my maintenance on this VM and install upgrades. I have calendar reminders for that.

    I started this blog in 2015 which means I lasted five years at the first host and six at the second. I hope I can keep the self-hosting going indefinitely!

    No comments on Another site migration complete