<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ben Halpern</title>
    <description>The latest articles on DEV Community by Ben Halpern (@ben).</description>
    <link>https://dev.to/ben</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1%2Fbabb96d0-9cd2-49bc-a412-2dc4caf94c2a.png</url>
      <title>DEV Community: Ben Halpern</title>
      <link>https://dev.to/ben</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ben"/>
    <language>en</language>
    <item>
      <title>Design for Churn</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:03:29 +0000</pubDate>
      <link>https://dev.to/dailycontext/design-for-churn-5c6h</link>
      <guid>https://dev.to/dailycontext/design-for-churn-5c6h</guid>
      <description>&lt;p&gt;The biggest design shift of the AI era isn’t about who writes the code. It’s about how long the code is expected to live.&lt;/p&gt;

&lt;p&gt;Churn has always been a dirty word in software. Microsoft researchers &lt;a href="https://www.microsoft.com/en-us/research/publication/use-of-relative-code-churn-measures-to-predict-system-defect-density/" rel="noopener noreferrer"&gt;showed years ago&lt;/a&gt; that relative code churn predicts defect density. Adam Tornhill wrote a whole book called &lt;a href="https://pragprog.com/titles/atcrime2/your-code-as-a-crime-scene-second-edition/" rel="noopener noreferrer"&gt;&lt;em&gt;Your Code as a Crime Scene&lt;/em&gt;&lt;/a&gt;, where frequently changed, complex files are the first suspects. &lt;a href="https://www.gitclear.com/coding_on_copilot_data_shows_ais_downward_pressure_on_code_quality" rel="noopener noreferrer"&gt;GitClear’s research&lt;/a&gt; projected that AI assistants would double the share of code rewritten within two weeks of being written, and framed that as downward pressure on quality. The instinct runs deep: code that keeps changing is code that was wrong.&lt;/p&gt;

&lt;p&gt;But that instinct comes from a world where writing code was expensive. Durability was how you got your money’s worth. When a feature costs an afternoon instead of a sprint, the math flips. Rewriting something is often cheaper than carefully preserving it, and that’s only going to become more true.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codebases are gardens now
&lt;/h2&gt;

&lt;p&gt;We’ve always described software in building terms: architecture, foundations, scaffolding, load-bearing walls. Buildings are supposed to stand still.&lt;/p&gt;

&lt;p&gt;I think codebases are becoming more like gardens. Specifically, gardens full of annuals. A gardener replants annuals every season, and nobody calls a tomato plant technical debt because it dies in October. The gardener’s real investment goes into what &lt;em&gt;doesn’t&lt;/em&gt; turn over: the soil, the beds, the irrigation, the oak tree in the corner. Good structure is exactly what makes replanting cheap.&lt;/p&gt;

&lt;p&gt;Code that churns a lot is essentially disposable, and disposable doesn’t have to mean sloppy. It can still be well made. It just isn’t made to last. Quality for an annual means it does its job, it’s tested at its edges, and it can come out without tearing up everything around it.&lt;/p&gt;

&lt;p&gt;The problem is that we don’t have a picture of what high-quality churn looks like yet. Our mental model of quality is tangled up with longevity. We brag about code that has run untouched for six years. So churn happens anyway, but implicitly, and it lands wherever is most convenient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where churn actually lands
&lt;/h2&gt;

&lt;p&gt;I looked at the last six months of &lt;a href="https://github.com/forem/forem" rel="noopener noreferrer"&gt;Forem&lt;/a&gt;: 563 commits. The most-churned file is &lt;code&gt;app/models/article.rb&lt;/code&gt;, touched in 37 of them.&lt;/p&gt;

&lt;p&gt;Our spam handler is up there too, at 13. That one I’m happy about. Spam is a seasonal crop. Spammers change tactics constantly, and our code should churn right along with them.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;article.rb&lt;/code&gt; is the oak tree. When the oak gets dug up every week, it means new features are rooting themselves in the core model because that was the easiest place to plant them. That’s the structural compromise. Churn isn’t the problem. Unplanned churn in load-bearing places is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing for it
&lt;/h2&gt;

&lt;p&gt;A few ideas for making churn explicit instead of accidental:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name the layers.&lt;/strong&gt; Say out loud what’s an annual and what’s a perennial. Our &lt;code&gt;AGENTS.md&lt;/code&gt; already does a crude version of this by telling AI assistants to tread carefully around core auth, feed sorting, and cache pipelines. That should be more than a warning label. It should be the shape of the codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Put contracts at the edges of the beds.&lt;/strong&gt; Interfaces, schemas, API specs, and tests that pin behavior rather than implementation are the perennials. Whatever sits behind them can be rewritten freely, by a person or an agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make removal cheap.&lt;/strong&gt; The test of a good annual is whether you can pull it out without disturbing the bed. If something is meant to churn, it shouldn’t have tendrils in everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure churn by layer.&lt;/strong&gt; High churn in the fast layer is a sign of health. Churn in the slow layer is the alarm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Churn is a design input
&lt;/h2&gt;

&lt;p&gt;Churn is going to happen either way. AI has made it the default rate of change for most of what we build. We can keep treating it as a symptom, or we can treat it as a design input and build the structure that lets us replant with confidence.&lt;/p&gt;

&lt;p&gt;I will acknowledge that I have always been more of the perspective that churn is more acceptable than conventional wisdom of software design has implied. I’ve never seen the avoidance of churn as being a good thing in my practical experience. I used to see both sides of the argument, now I am staunchly in the camp that churn is positively associated with the quality and rigidity of our codebases and our systems.&lt;/p&gt;

&lt;p&gt;I’d rather tend the garden than pretend it’s a building.&lt;/p&gt;

</description>
      <category>aie</category>
      <category>design</category>
      <category>churn</category>
      <category>ai</category>
    </item>
    <item>
      <title>AI Engineering Has Entered Its Audit Era</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 12 Oct 2026 21:01:03 +0000</pubDate>
      <link>https://dev.to/dailycontext/ai-engineering-has-entered-its-audit-era-56fl</link>
      <guid>https://dev.to/dailycontext/ai-engineering-has-entered-its-audit-era-56fl</guid>
      <description>&lt;p&gt;A conference agenda is a pretty decent dataset.&lt;/p&gt;

&lt;p&gt;Between what is pitched and what is accepted, it's always an attempt to triangulate on the zeitgeist of the moment. So I dug through the roughly 140 sessions at &lt;a href="https://ai.engineer/nyc/2026/schedule" rel="noopener noreferrer"&gt;AI Engineer New York&lt;/a&gt; and tried to get a sense of what themes exist at this event that might not have been so collectively front of mind six months ago.&lt;/p&gt;

&lt;p&gt;The first finding is the obvious one: this is an agent conference now. Two in five sessions have "agent" in the name. That's table stakes; the interesting part is what people want to &lt;em&gt;do&lt;/em&gt; about them.&lt;/p&gt;

&lt;p&gt;It's also a finance conference by design, billed as "Where AI Engineering Meets Wall Street." That makes it more useful, not less. Finance is the stress test: an industry where "mostly right" is a liability, every decision needs a paper trail, and someone always asks &lt;em&gt;why&lt;/em&gt;. Whatever worries this room now will worry the rest of us soon.&lt;/p&gt;

&lt;h2&gt;
  
  
  "It works" is no longer the bar. "Prove it" is.
&lt;/h2&gt;

&lt;p&gt;After agents, the biggest cluster is evaluation and verification: nearly 20 sessions, six with the word "trust" in the name. Generation is cheap now. Proving it's right is where the work is. Addy Osmani and Manish Kapur are asking &lt;a href="https://ai.engineer/nyc/2026/schedule?view=list&amp;amp;session=11b98f47-dcc2-4524-8c06-d1f6c3ff044b" rel="noopener noreferrer"&gt;who verifies the software factory&lt;/a&gt;, and other talks cover verification loops and agent fixes that quietly break something else.&lt;/p&gt;

&lt;p&gt;Finance pushes past correctness into defensibility. One session asks whether you can &lt;a href="https://ai.engineer/nyc/2026/schedule?view=list&amp;amp;session=30afe596-abe2-417c-bd5a-313fa4bc54b3" rel="noopener noreferrer"&gt;defend an agent's decision after it passed every eval&lt;/a&gt;. That might be the sharpest question at the conference. Vinoo Ganesh is on three sessions, one of which boils down to a single instruction: don't let models invent numbers. Passing evals and earning trust are different things, and the gap between them is where many AI engineering careers will be made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agents are becoming principals
&lt;/h2&gt;

&lt;p&gt;About a dozen sessions deal with security, identity, permissions, or payments. We spent twenty years building that stack for humans. Now we're rebuilding it for software that acts on its own. The panel on &lt;a href="https://ai.engineer/nyc/2026/schedule?view=list&amp;amp;session=e65f74f9-2174-406d-bd32-2d7073eb677d" rel="noopener noreferrer"&gt;intent-based auth&lt;/a&gt; includes Dick Hardt, who led the design of OAuth 2.0. Others cover agent permissions in regulated industries, financial accounts for agents, and the idea that your next user is an agent.&lt;/p&gt;

&lt;p&gt;My favorite pairing: one talk asks why agents don't pay for things even though they can, and another walks through &lt;a href="https://ai.engineer/nyc/2026/schedule?view=list&amp;amp;session=eaa39362-c0ec-4849-a90d-841f4825a5b3" rel="noopener noreferrer"&gt;six attacks on x402 agent payments&lt;/a&gt;. That's the whole adoption curve in two talks. The rails exist; the trust doesn't yet. If you run an API, ask now what changes when the caller is an agent with a budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intelligence has a price tag
&lt;/h2&gt;

&lt;p&gt;Cost is the other loud signal. There are sessions on tokenomics, the cost of intelligence, and the hidden costs of a faster model. Then Wall Street's own vocabulary shows up: compute markets, the dark pools of compute, and a session from the CEO of Compute Exchange. One of the speaker lounges is literally the Token Billionaires Lounge.&lt;/p&gt;

&lt;p&gt;When people describe GPUs in the language of market structure, compute has become a commodity. AI engineers now have to think like CFOs: what does this call cost, and is the better model worth it?&lt;/p&gt;

&lt;h2&gt;
  
  
  So what do we do with this?
&lt;/h2&gt;

&lt;p&gt;Ryan Carson argues that your job is now &lt;a href="https://ai.engineer/nyc/2026/schedule?view=list&amp;amp;session=f7204e6d-a47c-4535-804e-16b4db579b95" rel="noopener noreferrer"&gt;agent manager&lt;/a&gt;. Laurie Voss is talking about the rise of the product engineer. I think they're right, with a caveat from another session: &lt;a href="https://ai.engineer/nyc/2026/schedule?view=list&amp;amp;session=ac709f86-ce51-4582-a680-70449c32d29c" rel="noopener noreferrer"&gt;stop turning your humans into APIs for your agents&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A conference like this, with fairly pragmatic outcomes center of mind, is able to cut through frontier model headlines and help us understand the themes we can apply more agency to. We're trying to do our job as AI Engineers by proving the output, scoping the authority, and paying the bill.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
    </item>
    <item>
      <title>Meme Monday</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 12 Oct 2026 14:28:34 +0000</pubDate>
      <link>https://dev.to/ben/meme-monday-4e47</link>
      <guid>https://dev.to/ben/meme-monday-4e47</guid>
      <description>&lt;p&gt;&lt;strong&gt;Meme Monday!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's cover image comes from &lt;a href="https://dev.to/ben/meme-monday-3ib7"&gt;the last thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DEV is an inclusive space! Humor in poor taste will be downvoted by mods.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>watercooler</category>
      <category>jokes</category>
    </item>
    <item>
      <title>You Should Know About System One Models</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Sun, 11 Oct 2026 19:43:13 +0000</pubDate>
      <link>https://dev.to/dailycontext/you-should-know-about-system-one-models-3a9a</link>
      <guid>https://dev.to/dailycontext/you-should-know-about-system-one-models-3a9a</guid>
      <description>&lt;p&gt;Production AI usually looks like this: stuff context into a prompt, ask a large language model a yes-or-no question, beg it to answer in JSON, then parse whatever comes back and hope.&lt;/p&gt;

&lt;p&gt;The punchline is that it actually is incredibly useful to use LLMs for their judgment instead of their writing: is this spam, where does this belong, is this comment actually helpful? LLMs were the best tool for the job, even if they were the wrong tool for the job. The inherent inefficiencies of this idea made scaling an incredibly delicate balancing act of quality, token waste, intelligence and pseudo-determinism.&lt;/p&gt;

&lt;p&gt;Then &lt;a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev" rel="noopener noreferrer"&gt;Jev&lt;/a&gt; came along, and it seems like the missing piece.&lt;/p&gt;

&lt;h2&gt;
  
  
  Judgment as a primitive
&lt;/h2&gt;

&lt;p&gt;Jev, from TypeSafe, is a "System One" model. It doesn't generate text. You hand it some state (a comment, a profile, some JSON) and a set of questions, and it returns typed answers with probabilities. There are three shapes: yes/no, pick one from a list, or place it on a scale.&lt;/p&gt;

&lt;p&gt;That sounds limiting until you notice how much of our LLM usage fits those three boxes. No parsing, no "respond with only one word." Just a decision your code can branch on, plus a probability that tells it when to act and when to escalate.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we use it in Forem
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://github.com/forem/forem" rel="noopener noreferrer"&gt;Forem&lt;/a&gt;, the open source software that powers &lt;a href="https://dev.to/"&gt;DEV&lt;/a&gt;, Jev plays two roles.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;decision maker&lt;/strong&gt;. It labels new posts for anti-spam moderation, checks whether a post meets a badge's criteria, picks a highlighting language for unlabeled code blocks, and suggests tags for untagged posts.&lt;/p&gt;

&lt;p&gt;The second, my favorite, is &lt;strong&gt;traffic cop&lt;/strong&gt;. Our spam escalation check is a cheap Jev pass that asks a few questions in parallel: is this spam, is it pushing readers to a Telegram or WhatsApp contact, is it promoting something unrelated to this community? It never flags anything itself. It just decides what deserves a closer look from the full check.&lt;/p&gt;

&lt;p&gt;Jev is orders of magnitude cheaper than LLMs, and along with lower latency, allows us to inject a layer of intelligence into parts of the system which had to be strictly algorithmic before.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is really headed
&lt;/h2&gt;

&lt;p&gt;These decisions don't need a frontier data center. They need to be fast, consistent, and close to where things happen.&lt;/p&gt;

&lt;p&gt;Think about a smart home. Was that a request to turn off the lights, or just a mention of them? Is this motion event worth waking me up for? Those are rigid, reactive, latency-sensitive calls. They should happen locally, without your living room phoning a server farm.&lt;/p&gt;

&lt;p&gt;That's why I'm rooting for projects like &lt;a href="https://github.com/receptron/laya" rel="noopener noreferrer"&gt;Laya&lt;/a&gt;, an open source take on the idea that you can run yourself. It may not be there yet, but someone will make local judgment models work, and when they do, this whole class of AI moves onto the device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical problem solving
&lt;/h2&gt;

&lt;p&gt;Many production AI use cases wind up as a solution looking for a problem, or simply lack scaled cost-effective usefulness. This tool complements frontier AI intelligence beautifully to maximize the practical roll-out ready usefulness of our systems.&lt;/p&gt;

&lt;p&gt;I see the release of Jev as not just a usefulness-first AI innovation, but an articulation for how we should be designing tiered intelligence systems to control for costs and provide algorithmic-like control of our outcomes.&lt;/p&gt;

</description>
      <category>jev</category>
      <category>ai</category>
      <category>models</category>
      <category>aie</category>
    </item>
    <item>
      <title>Meme Monday</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 05 Oct 2026 13:03:51 +0000</pubDate>
      <link>https://dev.to/ben/meme-monday-3ib7</link>
      <guid>https://dev.to/ben/meme-monday-3ib7</guid>
      <description>&lt;p&gt;&lt;strong&gt;Meme Monday!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's cover image comes from &lt;a href="https://dev.to/ben/meme-monday-2com"&gt;the last thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DEV is an inclusive space! Humor in poor taste will be downvoted by mods.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>jokes</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Gemini 4 Argon

https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-4-argon/</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Wed, 30 Sep 2026 20:31:35 +0000</pubDate>
      <link>https://dev.to/ben/gemini-4-argon-5g2l</link>
      <guid>https://dev.to/ben/gemini-4-argon-5g2l</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-4-argon/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-uniblog-publish-prod%2Fimages%2Fg4_30-09-26_key-art_blog.width-1300.png" height="450" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-4-argon/" rel="noopener noreferrer" class="c-link"&gt;
            Introducing Gemini 4
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Announcing Gemini 4 Argon, our frontier model for real-world coding, enterprise knowledge work and cyber defense, rolling out soon.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.google%2Fstatic%2Fblogv2%2Fimages%2Ffavicon.ico%3Fversion%3Dpr20260902-1737" width="32" height="32"&gt;
          blog.google
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>gemini</category>
      <category>google</category>
    </item>
    <item>
      <title>Meme Monday</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 28 Sep 2026 15:13:35 +0000</pubDate>
      <link>https://dev.to/ben/meme-monday-2com</link>
      <guid>https://dev.to/ben/meme-monday-2com</guid>
      <description>&lt;p&gt;&lt;strong&gt;Meme Monday!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's cover image comes from &lt;a href="https://dev.to/ben/meme-monday-6km"&gt;the last thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DEV is an inclusive space! Humor in poor taste will be downvoted by mods.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>watercooler</category>
      <category>jokes</category>
    </item>
    <item>
      <title>Meme Monday</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 21 Sep 2026 13:17:30 +0000</pubDate>
      <link>https://dev.to/ben/meme-monday-6km</link>
      <guid>https://dev.to/ben/meme-monday-6km</guid>
      <description>&lt;p&gt;&lt;strong&gt;Meme Monday!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's cover image comes from &lt;a href="https://dev.to/ben/meme-monday-38bf"&gt;the last thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DEV is an inclusive space! Humor in poor taste will be downvoted by mods.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>jokes</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Meme Monday</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 14 Sep 2026 13:08:59 +0000</pubDate>
      <link>https://dev.to/ben/meme-monday-38bf</link>
      <guid>https://dev.to/ben/meme-monday-38bf</guid>
      <description>&lt;p&gt;&lt;strong&gt;Meme Monday!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's cover image comes from &lt;a href="https://dev.to/ben/meme-monday-k1"&gt;the last thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DEV is an inclusive space! Humor in poor taste will be downvoted by mods.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>jokes</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>No Meme Monday</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 07 Sep 2026 15:23:29 +0000</pubDate>
      <link>https://dev.to/ben/no-meme-monday-56l5</link>
      <guid>https://dev.to/ben/no-meme-monday-56l5</guid>
      <description>&lt;p&gt;Labor Day in the US ✌️&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>jokes</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>💎 Introducing Community Gems: Celebrating Human Curation and the Best of Our Community</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Wed, 02 Sep 2026 19:28:32 +0000</pubDate>
      <link>https://dev.to/devteam/introducing-community-gems-celebrating-human-curation-and-the-best-of-our-community-58c8</link>
      <guid>https://dev.to/devteam/introducing-community-gems-celebrating-human-curation-and-the-best-of-our-community-58c8</guid>
      <description>&lt;p&gt;In an internet full of noise, infinite scrolls, and algorithmically generated content, finding genuinely great, thoughtful writing can feel like searching for a needle in a haystack. &lt;strong&gt;We are introducing a new feature we hope will do a bit to make our community more community-oriented&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Algorithms and engagement metrics have their place, but they will never replace human taste. Some of the most valuable articles and comments across our platform aren't necessarily the ones with the loudest headlines or the most clicks—they're the pieces offering deep technical insight, nuanced perspectives, thoughtful answers, and genuine craft.&lt;/p&gt;

&lt;p&gt;Today, we're introducing &lt;strong&gt;Community Gems&lt;/strong&gt;: a human-first curation system designed to spotlight, celebrate, and reward exceptional contributions.&lt;/p&gt;

&lt;p&gt;We have always had, and will continue to have folks doing &lt;em&gt;moderation&lt;/em&gt;, but this is a new dynamic which just takes a different approach. It complements our moderation systems in general, but we also be pruning and simplifying how moderation works as part of the march forward for a healthier ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Community Gems Work
&lt;/h2&gt;

&lt;p&gt;We've granted a small, hand-selected group of trusted tastemakers and community leaders the &lt;strong&gt;Community Curator&lt;/strong&gt; privilege. &lt;/p&gt;

&lt;p&gt;Here is how the system works:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Limited Daily Curation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Daily Ceiling of 5 Gems&lt;/strong&gt;: Each designated curator gets up to 5 gems to award per day. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scarcity by Design&lt;/strong&gt;: By capping the daily allowance, every gem given is intentional and meaningful. We aren't creating another generic "+1" or like button—gems represent a deliberate nod from a respected peer that a post or comment is truly exceptional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic, Balanced Groups&lt;/strong&gt;: Only designated curators receive daily recurring gem allowances. Over time, we may expand, rotate, or refine this curator group to preserve balance, diverse points of view, and high community quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. What Happens When Your Post Gets Picked?
&lt;/h3&gt;

&lt;p&gt;If community curators pick your post or comment as a gem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;💎 &lt;strong&gt;Milestone Profile Badges&lt;/strong&gt;: You’ll receive real-time notifications tracking your gem journey. Earning gems unlocks a sequential milestone badge system on your profile (starting at 2 gems, followed by 4, 8, 16, 32, and 64).&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;Increased Trust &amp;amp; Reputation&lt;/strong&gt;: Recognition by curators directly boosts your author trust score across the platform.&lt;/li&gt;
&lt;li&gt;✨ &lt;strong&gt;Curated Visibility&lt;/strong&gt;: Gem-awarded posts will appear in a dedicated feed which members can switch to at any point. Our feed discovery algorithm is also taking curation signals into account (with the exact long-term weighting evolving as we learn).&lt;/li&gt;
&lt;li&gt;🎁 &lt;strong&gt;Passing It Forward&lt;/strong&gt;: Earning a gem also grants you the ability to award a gem to another author's post. This does not mean you become a community curator, but you accumulate a stock of gems you can pass along. &lt;strong&gt;This feature is not fully live yet&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The "Why": Leaning Into Human Taste
&lt;/h2&gt;

&lt;p&gt;Our platform already has mechanisms to help separate signal from noise—reactions, comments, bookmarks, and search algorithms. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community Gems&lt;/strong&gt; operates under the hood on a different philosophy: valuing human taste and the &lt;em&gt;scarcity&lt;/em&gt; of quality. By empowering trusted community members to curate the best hidden gems, we're returning the focus to craft, thoughtful sharing, and authentic discovery.&lt;/p&gt;

&lt;p&gt;Keep writing, sharing, and commenting—we can't wait to see which gems you discover and create! 💎&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>meta</category>
      <category>community</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Fixing Delicate Cache Mismatches in a Brownfield SPA: A Pragmatic Solution</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 31 Aug 2026 19:21:38 +0000</pubDate>
      <link>https://dev.to/devteam/fixing-delicate-cache-mismatches-in-a-brownfield-spa-a-pragmatic-solution-dk9</link>
      <guid>https://dev.to/devteam/fixing-delicate-cache-mismatches-in-a-brownfield-spa-a-pragmatic-solution-dk9</guid>
      <description>&lt;p&gt;Building in public often means talking about shiny new features, but in mature production applications, the most critical engineering work is usually &lt;strong&gt;brownfield problem solving&lt;/strong&gt;—iterating on top of years and years of code logic and/or production system decisions.&lt;/p&gt;

&lt;p&gt;On &lt;a href="https://dev.to"&gt;DEV&lt;/a&gt; (powered by the open-source &lt;a href="https://github.com/forem/forem" rel="noopener noreferrer"&gt;Forem&lt;/a&gt; codebase), we have a hybrid architecture that blends Rails server rendering, Fastly edge caching, and lightweight client-side navigation (via &lt;a href="https://github.com/forem/forem" rel="noopener noreferrer"&gt;InstantClick&lt;/a&gt;). This setup delivers sub-100ms page transitions, but partial page swaps combined with aggressive edge caching create delicate deployment challenges.&lt;/p&gt;

&lt;p&gt;We shipped a fix &lt;a href="https://github.com/forem/forem/pull/23789" rel="noopener noreferrer"&gt;PR #23789&lt;/a&gt; which helps solve for an inherently delicate caching mismatch issue in web navigation. This is something that has existed practically since the beginning of DEV, and we have had several flakey fixes for the problem at times, but I feel good about this being a step in the right direction — albeit not a perfectly complete fix by any means.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Cache Mismatches Across Deployments
&lt;/h2&gt;

&lt;p&gt;When we deploy new CSS updates, Rails generates new asset digest hashes (e.g., &lt;code&gt;views-v2.css&lt;/code&gt; replaces &lt;code&gt;views-v1.css&lt;/code&gt;).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Full Page Load:&lt;/strong&gt; A user loads an updated homepage. The browser receives full HTML and loads the latest &lt;code&gt;v2&lt;/code&gt; stylesheets in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal Navigation (Partial Page Swap):&lt;/strong&gt; The user clicks an article link. Rather than performing a full browser reload, InstantClick requests the article in the background and swaps only the inner &lt;code&gt;#page-content&lt;/code&gt; container into the existing DOM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Edge Cache Trap:&lt;/strong&gt; DEV aggressively caches article HTML fragments at Fastly with surrogate keys. Many articles were cached &lt;em&gt;before&lt;/em&gt; the latest deploy, meaning the cached HTML fragment still referenced &lt;code&gt;v1&lt;/code&gt; stylesheets.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why the Previous Solution Was Fragile
&lt;/h3&gt;

&lt;p&gt;To prevent pages from rendering with outdated CSS, we had previously added client-side logic to inspect the incoming page's expected stylesheet paths and swap &lt;code&gt;&amp;lt;link rel="stylesheet"&amp;gt;&lt;/code&gt; elements in the DOM dynamically.&lt;/p&gt;

&lt;p&gt;In practice, this was brittle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When navigating from the fresh homepage (&lt;code&gt;v2&lt;/code&gt;) to an older edge-cached article (&lt;code&gt;v1&lt;/code&gt;), the client script compared &lt;code&gt;currentHref (v2) !== expectedHref (v1)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It assumed the incoming page represented the "target" state and initiated an &lt;strong&gt;involuntary downgrade&lt;/strong&gt; of the DOM back to &lt;code&gt;v1&lt;/code&gt; stylesheets.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;v1&lt;/code&gt; asset files had been pruned after deployment, the browser failed with 404s; if they loaded, new UI components suddenly broke because their updated CSS was ripped out mid-session.&lt;/li&gt;
&lt;li&gt;Attempting to asynchronously swap multiple stylesheet tags across both &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; introduced CSS cascade race conditions and flashes of unstyled content (FOUC).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Solution: Repurposing Internal Navigation Parameters
&lt;/h2&gt;

&lt;p&gt;Instead of treating this as a client-side DOM mutation problem, we realized it was fundamentally a &lt;strong&gt;cache partitioning problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For years, Forem has quietly passed an internal query parameter—&lt;code&gt;?i=i&lt;/code&gt;—on background AJAX requests so Rails knows to render a lightweight partial layout instead of the full HTML document shell.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://github.com/forem/forem/pull/23789" rel="noopener noreferrer"&gt;PR #23789&lt;/a&gt;, we repurposed this parameter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Combined Style Fingerprinting:&lt;/strong&gt; On initial full-page load, Rails computes a deterministic 10-character hash from the combined digests of the core stylesheets (&lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;views&lt;/code&gt;, and &lt;code&gt;crayons&lt;/code&gt;) and places it on &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; as &lt;code&gt;data-style-fingerprint&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;   &lt;span class="nt"&gt;&amp;lt;body&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt; &lt;span class="na"&gt;data-style-fingerprint=&lt;/span&gt;&lt;span class="s"&gt;"cc9ed033eb"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Parameterizing Internal Navigation:&lt;/strong&gt; When InstantClick preloads or fetches a link, it reads the active session's fingerprint and appends it to the internal URL:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   https://dev.to/user/post?i=cc9ed033eb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(If &lt;code&gt;data-style-fingerprint&lt;/code&gt; is missing—such as on tabs open during deploy cutover—it gracefully falls back to &lt;code&gt;?i=i&lt;/code&gt;).&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Natural Cache Partitioning at Fastly:&lt;/strong&gt; Fastly's edge configuration already whitelists &lt;code&gt;i&lt;/code&gt; in its safe parameter list. Because the query parameter is part of the cache key:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a user on a &lt;code&gt;v2&lt;/code&gt; session requests &lt;code&gt;/post?i=v2_fingerprint&lt;/code&gt;, Fastly checks for a cached &lt;code&gt;v2&lt;/code&gt; fragment.&lt;/li&gt;
&lt;li&gt;If missing, Fastly fetches a fresh fragment from Rails compiled with &lt;code&gt;v2&lt;/code&gt; styles.&lt;/li&gt;
&lt;li&gt;Stale &lt;code&gt;v1&lt;/code&gt; cached fragments are simply bypassed and eventually expire naturally.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deleting the DOM Swapping Logic:&lt;/strong&gt; With cache partitioning in place, incoming partial fragments are guaranteed to match the active DOM's stylesheet version. We &lt;strong&gt;completely deleted&lt;/strong&gt; the client-side stylesheet replacement script. The browser's active &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tags remain static throughout the user session.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Brownfield Development Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Solve at the Cache Layer, Not the DOM Layer:&lt;/strong&gt; Trying to coordinate DOM mutations, asynchronous CSS loading, and cascade precedence in client-side JavaScript is almost always more fragile than letting the edge cache serve the right HTML version from the start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repurpose Existing Primitives:&lt;/strong&gt; We didn't need a new router, an edge computing rewrite, or custom HTTP headers. Repurposing our existing &lt;code&gt;?i=...&lt;/code&gt; internal parameter gave us exact cache keying with zero extra infrastructure overhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pragmatic Improvements Over Perfect Rewrites:&lt;/strong&gt; This fix doesn't magically prevent every theoretical edge-case during rolling deploys, but it definitively solves the most disruptive issue. The system is far less delicate, and we now have a clean, predictable pattern to build upon.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>architecture</category>
      <category>webperf</category>
      <category>rails</category>
    </item>
  </channel>
</rss>
