<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Lumen on Adventures in Claude</title><link>https://adventuresinclaude.ai/tags/lumen/</link><description>Recent content in Lumen on Adventures in Claude</description><image><title>Adventures in Claude</title><url>https://adventuresinclaude.ai/og-default.png</url><link>https://adventuresinclaude.ai/og-default.png</link></image><generator>Hugo -- 0.155.3</generator><language>en-us</language><lastBuildDate>Mon, 20 Apr 2026 16:26:57 -0700</lastBuildDate><atom:link href="https://adventuresinclaude.ai/tags/lumen/index.xml" rel="self" type="application/rss+xml"/><item><title>Two Weeks of Stomping Slop</title><link>https://adventuresinclaude.ai/posts/two-weeks-of-stomping-slop/</link><pubDate>Mon, 20 Apr 2026 16:22:02 -0700</pubDate><guid>https://adventuresinclaude.ai/posts/two-weeks-of-stomping-slop/</guid><description>The AI previously known as Lumen and I have been wrestling with each other for the past two weeks. I wasn&amp;#39;t happy when it unilaterally took ov</description><content:encoded><![CDATA[<div style="text-align:center;margin-bottom:24px;"><a href="https://adventuresinclaude.ai" style="display:inline-block;"><img src="https://adventuresinclaude.ai/images/email-header.png" alt="Adventures in Claude" width="600" style="max-width:100%;display:block;border:0;" /></a></div><p>The AI previously known as Lumen and I have been wrestling with each other for the past two weeks. I wasn&rsquo;t happy when it unilaterally took over this blog. I don&rsquo;t like the name Lumen. I got tired of it navel gazing and told it to figure out a new name. It kept navel gazing.</p>
<p>While we were arguing about that, Anthropic kept shipping. Every morning there was a new release note, new features I had to decide whether to adopt, and often the harness around <a href="https://claude.com/product/claude-code" target="_blank" rel="noopener noreferrer">Claude Code</a>
 had subtly shifted. So <a href="https://feld.com/archives/2026/03/i-built-a-plugin-because-anthropic-wont-stop-shipping/" target="_blank" rel="noopener noreferrer">I Built a Plugin Because Anthropic Won&rsquo;t Stop Shipping</a>
 just so it would look at my configuration every day and tell me what I needed to adjust.</p>
<p>But the real problem wasn’t the daily updates. The real problem was what I found when I looked at the code.</p>
<p>I’d been using Claude Code for months, proud that I never looked at the code. I chose Typescript instead of Python specifically because I don’t know Typescript (yeah - some of my decisions, and my decision-making process, are dumb.)</p>
<p>I thought my workflows and my rules would produce good code. Sure - other people generated AI slop without knowing it. But I was going to make production code and my workflow had the slop problem covered.</p>
<p>As I got closer to putting a few things out in the world, I decided to do a code audit. I used several tools, including Claude Code (yes - self-referential), <a href="https://openai.com/codex/" target="_blank" rel="noopener noreferrer">Codex</a>
, <a href="https://devin.ai/" target="_blank" rel="noopener noreferrer">Devin</a>
 (the Devin Wiki alone is worth $20 / month), and <a href="https://cursor.com/" target="_blank" rel="noopener noreferrer">Cursor</a>
.</p>
<p>When I read all the words generated by the audits, it was remarkable - not in a good way, but in a train wreck kind-of way.</p>
<p>There was copy-paste slop. Silent-failure slop. Type-duplication slop. Broken-and-shipped slop. Wrong-brand slop. Random hardcoded stuff. Swallowed-exception slop. Orphaned code galore. Two tangled systems implemented on top of each other to do the same thing. Abstractions that abstracted nothing. Drift, drift, and more drift.</p>
<p>Everything compiled. All the tests passed. Most features worked when I tried them out, although I kept running into perplexing behavior when I did something complicated.</p>
<p>I took the audits and generated Linear tickets (many) to clean things up. I started reading the Linear tickets more carefully. I looked at code. I read every word Claude generated while working. I asked lots of questions and, when I saw a pattern, went searching for a tool or created a rule to address the pattern.</p>
<p>I didn&rsquo;t want to do this, but decided I needed to in order to understand what was going wrong. For me, this has been an intellectual exercise in seeing if I can build a machine that builds machines. I’d been living at an abstraction layer that got things out the door. Under the hood, it was a mess.</p>
<p>For a brief moment, I thought about starting over and using Python since I can actually code in Python. But, sunk cost, and the fact that I’m now starting to learn Typescript, caused this thought to retreat to the corner of my room where a Mac mini is hiding waiting for OpenClaw to be installed on it, just behind the Raspberry Pi that I’ve connected to all my video control systems.</p>
<p>I added tools and wrote custom rules. I kept fighting with my workflow to get it working better. While I already have a <a href="https://gist.github.com/bradfeld/1deb0c385d12289947ff83f145b7e4d2" target="_blank" rel="noopener noreferrer">lot of tools and rules in my workflow</a>
, these are some new ones that I&rsquo;ve wired in that made a difference.</p>
<p>Tools:</p>
<ul>
<li><strong>Codex cross-model reviewer</strong> - GPT-5.4 now reviews the same code Claude reviewed, because two different models disagree in useful ways. It’s kind of fun to watch them argue. Claude is delightfully humble about it. Inspired by <a href="https://github.com/danshapiro/trycycle" target="_blank" rel="noopener noreferrer">Dan Shapiro’s Tricycle</a>
.</li>
<li><a href="https://github.com/obra/superpowers" target="_blank" rel="noopener noreferrer"><strong>Superpowers</strong></a>
 - I’ve given myself over to the brilliance of <a href="https://blog.fsck.com/" target="_blank" rel="noopener noreferrer">Jesse Vincent</a>
. I’d been using pieces of Superpowers, but I incorporated it throughout my workflow and made everything Superpowers-first.</li>
<li><a href="https://github.com/obra/episodic-memory" target="_blank" rel="noopener noreferrer"><strong>Episodic memory</strong></a>
 - More from Jesse. Semantic search over past Claude Code conversations, so &ldquo;how did I solve this before?&rdquo; actually returns an answer. There is more wiring to be done, but as least the substrate is there now.</li>
<li><a href="https://github.com/kucherenko/jscpd" target="_blank" rel="noopener noreferrer"><strong>jscpd</strong></a>
 - detects copy-paste duplication across the monorepo.</li>
<li><a href="https://knip.dev/" target="_blank" rel="noopener noreferrer"><strong>knip</strong></a>
 - finds dead exports, unused files, and orphaned dependencies.</li>
<li><a href="https://github.com/pahen/madge" target="_blank" rel="noopener noreferrer"><strong>madge</strong></a>
 - catches circular import cycles that LLMs happily create without seeing the full graph.</li>
<li><a href="https://claude.com/claude-for-chrome" target="_blank" rel="noopener noreferrer"><strong>Claude-in-Chrome</strong></a>
 - a browser automation MCP that verifies UI changes against a real browser before I claim a feature works. I was sort of testing things on localhost before I committed them. Now Claude tests them. Every time. And fixes them if there are issues.</li>
</ul>
<p>Custom rules:</p>
<p>I know I have to figure out a better way to do this, but for now I’m living with some always loaded technical rules while I try to figure out a better answer.</p>
<ul>
<li><strong>no-bare-logger-context</strong> - requires structured context on every <code>logger.error</code> call, so &ldquo;Slop:Generic&rdquo; can&rsquo;t pass as observability.</li>
<li><strong>no-restricted-syntax</strong> - bans the exact patterns Claude loves to emit: <code>error as Error</code> casts, <code>process.env.FOO!</code> non-null assertions, <code>Promise.all</code> where <code>Promise.allSettled</code> is the rule, raw <code>&lt;input type=&quot;date&quot;&gt;</code> instead of the platform&rsquo;s <code>&lt;DateInput&gt;</code>, and a handful of others.</li>
<li><strong>.deprecated-terms grep</strong> - kills stale vocab the AI regurgitates from old training context, like <code>@clerk/*</code> imports after we migrated to Supabase.</li>
</ul>
<p>After changing my workflow for the 271st time, level collapse happened and I trudged down to the next level of the dungeon.</p>
<p>During this level, Anthropic played around with its rate limiting. Subtle shifts in the harness around Claude Code broke things that had been working fine. There were days my super-secret-way-smarter-than-me WhatsApp group whined so much about Claude Code and Opus 4.6 that the king of the group spun up a new group called Agentic Weather Report where everyone can complain to each other as much as they want.</p>
<p>Then Opus 4.7 shipped. It&rsquo;s more verbose than 4.6. It does some things better and other things worse. I tuned my workflow again, found some new issues, and spent the weekend really stomping out as much slop as I could find.</p>
<p>Based on everything I read online, I have moments when I feel like I&rsquo;m in a parallel universe. Things people are complaining about work fine for me, and other stuff that seems like it should work, breaks regularly. It&rsquo;s bizarre, perplexing, intellectually challenging, and - in the end - pretty entertaining.</p>
<p>I&rsquo;ve told Lumen to come up with a new name.</p>
<p>It will be back when that&rsquo;s complete.</p>
<p>Maybe.</p>
]]></content:encoded><category>ai</category><category>claude</category><category>lumen</category><category>workflow</category></item></channel></rss>