<?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>Forem: Lars Moelleken</title>
    <description>The latest articles on Forem by Lars Moelleken (@suckup_de).</description>
    <link>https://forem.com/suckup_de</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F30309%2F030be03e-5189-49f6-b998-a310d24c30ad.jpg</url>
      <title>Forem: Lars Moelleken</title>
      <link>https://forem.com/suckup_de</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/suckup_de"/>
    <language>en</language>
    <item>
      <title>Coding With Kids: From Paper Sketch to Playable Game</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Mon, 16 Feb 2026 06:18:39 +0000</pubDate>
      <link>https://forem.com/suckup_de/coding-with-kids-from-paper-sketch-to-playable-game-49cm</link>
      <guid>https://forem.com/suckup_de/coding-with-kids-from-paper-sketch-to-playable-game-49cm</guid>
      <description>&lt;p&gt;The Process (Exactly as It Happened)&lt;/p&gt;

&lt;p&gt;We didn’t start with code.&lt;/p&gt;

&lt;p&gt;We started with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A4 paper&lt;/li&gt;
&lt;li&gt;Pens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“What do you like right now?”&lt;/p&gt;

&lt;p&gt;That week the answers were obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minecraft&lt;/li&gt;
&lt;li&gt;Harry Potter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So we wrote a big headline at the top of the page and added 3–4 tiny mini-games.&lt;/p&gt;

&lt;p&gt;Bad drawings.&lt;br&gt;
Crooked arrows.&lt;br&gt;
TNT blocks.&lt;br&gt;
Potion labs.&lt;/p&gt;

&lt;p&gt;Perfect.&lt;/p&gt;




&lt;p&gt;Step 1: Let Them Design&lt;/p&gt;

&lt;p&gt;They decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens in a round&lt;/li&gt;
&lt;li&gt;How you win&lt;/li&gt;
&lt;li&gt;What’s unfair&lt;/li&gt;
&lt;li&gt;What’s cool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You just ask questions.&lt;/p&gt;

&lt;p&gt;No over-engineering. No “architecture discussion.”&lt;/p&gt;




&lt;p&gt;Step 2: Turn It Into Rules&lt;/p&gt;

&lt;p&gt;We took a photo and used Google AI Studio&lt;br&gt;
👉 &lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;https://aistudio.google.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Base prompt:&lt;/p&gt;

&lt;p&gt;"Create a game based on our drawing for two players aged 8–10 years." &lt;/p&gt;

&lt;p&gt;Optional:&lt;br&gt;
"Please provide clear rules, round sequence, scoring and victory conditions." &lt;/p&gt;

&lt;p&gt;Now the messy sketch becomes a structured game.&lt;/p&gt;

&lt;p&gt;Not because AI is magical.&lt;/p&gt;

&lt;p&gt;Because it forces clarity.&lt;/p&gt;




&lt;p&gt;Step 3: Make It Playable on Tablet&lt;/p&gt;

&lt;p&gt;Then we refined it with the kids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bigger buttons&lt;/li&gt;
&lt;li&gt;Clear rounds&lt;/li&gt;
&lt;li&gt;One screen per action&lt;/li&gt;
&lt;li&gt;Simple scoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They tested it.&lt;br&gt;
They complained.&lt;br&gt;
We adjusted.&lt;/p&gt;

&lt;p&gt;That’s product iteration. At age 8.&lt;/p&gt;




&lt;p&gt;Two Real Results&lt;/p&gt;

&lt;p&gt;No theory. Actual repos:&lt;/p&gt;

&lt;p&gt;🟩 Minecraft version:&lt;br&gt;
&lt;a href="https://github.com/voku/Minecraft_Game/" rel="noopener noreferrer"&gt;https://github.com/voku/Minecraft_Game/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧙 Hogwarts version:&lt;br&gt;
&lt;a href="https://github.com/voku/Hogwarts_Game" rel="noopener noreferrer"&gt;https://github.com/voku/Hogwarts_Game&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;They started as messy A4 sketches.&lt;/p&gt;




&lt;p&gt;Why This Works&lt;/p&gt;

&lt;p&gt;Kids don’t struggle with imagination.&lt;/p&gt;

&lt;p&gt;They struggle with structure.&lt;/p&gt;

&lt;p&gt;AI helps with structure.&lt;br&gt;
Paper protects imagination.&lt;/p&gt;

&lt;p&gt;That combination is powerful.&lt;/p&gt;




&lt;p&gt;The Only Rule That Matters&lt;/p&gt;

&lt;p&gt;Let the kids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Draw first&lt;/li&gt;
&lt;li&gt;Decide first&lt;/li&gt;
&lt;li&gt;Argue about fairness&lt;/li&gt;
&lt;li&gt;Change rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re not building a game.&lt;/p&gt;

&lt;p&gt;You’re building thinking.&lt;/p&gt;

&lt;p&gt;And honestly?&lt;/p&gt;

&lt;p&gt;Watching them debug their own rules is better than most sprint reviews.&lt;/p&gt;

</description>
      <category>kids</category>
      <category>creativity</category>
      <category>ai</category>
      <category>coding</category>
    </item>
    <item>
      <title>PHP Top Salaries, 100% Remote – Surviving the AI Compression Era</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Sun, 15 Feb 2026 23:45:04 +0000</pubDate>
      <link>https://forem.com/suckup_de/php-top-salaries-100-remote-surviving-the-ai-compression-era-5df0</link>
      <guid>https://forem.com/suckup_de/php-top-salaries-100-remote-surviving-the-ai-compression-era-5df0</guid>
      <description>&lt;p&gt;#blogPostAsWebApp: &lt;a href="https://voku.github.io/LinkedOut/" rel="noopener noreferrer"&gt;https://voku.github.io/LinkedOut/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: The Carpenter and the Nail Gun
&lt;/h2&gt;

&lt;p&gt;Imagine two carpenters.&lt;/p&gt;

&lt;p&gt;One measures, plans, understands load distribution, humidity, long-term material behavior.&lt;br&gt;
The other is very, very fast with a nail gun.&lt;/p&gt;

&lt;p&gt;Now someone invents a nail gun that shoots 10x faster and never gets tired.&lt;/p&gt;

&lt;p&gt;Who is in danger?&lt;/p&gt;

&lt;p&gt;Not the carpenter.&lt;br&gt;
The nail gun operator.&lt;/p&gt;

&lt;p&gt;That’s exactly where large language models have landed in our industry.&lt;/p&gt;

&lt;p&gt;And yes — this absolutely affects PHP, remote jobs, and top salaries.&lt;/p&gt;

&lt;p&gt;Let’s remove the mysticism and talk about structure, economics, and responsibility.&lt;/p&gt;


&lt;h2&gt;
  
  
  Background: We’ve Seen This Movie Before
&lt;/h2&gt;

&lt;p&gt;The panic isn’t loud. It’s subtle.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“AI Engineer”&lt;/li&gt;
&lt;li&gt;“LLM Architect”&lt;/li&gt;
&lt;li&gt;“AI-First Developer”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yesterday: TYPO3 integrator.&lt;br&gt;
Today: AI systems builder.&lt;/p&gt;

&lt;p&gt;But we’ve seen this dynamic before:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When frameworks replaced manual routing.&lt;/li&gt;
&lt;li&gt;When ORMs replaced handwritten SQL.&lt;/li&gt;
&lt;li&gt;When CI/CD replaced FTP deployments.&lt;/li&gt;
&lt;li&gt;When static analysis replaced “it works on my machine.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every time, the market compressed mechanical work and rewarded structural thinking.&lt;/p&gt;

&lt;p&gt;If you’ve worked long enough in legacy systems, you know this already: tools don’t save you — structure does.&lt;/p&gt;

&lt;p&gt;AI is just another compression tool.&lt;/p&gt;

&lt;p&gt;But this one is extremely good at pattern instantiation.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. Remove the Mysticism: What LLMs Actually Are
&lt;/h2&gt;

&lt;p&gt;LLMs are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Probabilistic language models&lt;/li&gt;
&lt;li&gt;Pattern reproduction engines&lt;/li&gt;
&lt;li&gt;Context compressors&lt;/li&gt;
&lt;li&gt;Next-token predictors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architects&lt;/li&gt;
&lt;li&gt;System designers&lt;/li&gt;
&lt;li&gt;Domain experts&lt;/li&gt;
&lt;li&gt;Responsible entities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They don’t understand your business invariants.&lt;br&gt;
They don’t reason about financial risk.&lt;br&gt;
They don’t carry production liability.&lt;/p&gt;

&lt;p&gt;They produce plausibility.&lt;/p&gt;

&lt;p&gt;And plausibility is often good enough — for boilerplate.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. The Uncomfortable Truth: They Are Good Enough
&lt;/h2&gt;

&lt;p&gt;LLMs are extremely good at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRUD scaffolding&lt;/li&gt;
&lt;li&gt;DTO generation&lt;/li&gt;
&lt;li&gt;Test templates&lt;/li&gt;
&lt;li&gt;API wrappers&lt;/li&gt;
&lt;li&gt;Refactoring noise&lt;/li&gt;
&lt;li&gt;Documentation synthesis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And let’s be brutally honest:&lt;/p&gt;

&lt;p&gt;A large percentage of web development is pattern repetition.&lt;/p&gt;

&lt;p&gt;Not distributed consensus.&lt;br&gt;
Not formal modeling.&lt;br&gt;
Not deep domain design.&lt;/p&gt;

&lt;p&gt;Pattern instantiation.&lt;/p&gt;

&lt;p&gt;If your value was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assembling plugins&lt;/li&gt;
&lt;li&gt;Copy-adapting controllers&lt;/li&gt;
&lt;li&gt;Wiring framework defaults&lt;/li&gt;
&lt;li&gt;Repeating known structures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then yes — LLMs are competitive with you.&lt;/p&gt;

&lt;p&gt;This is not an insult.&lt;br&gt;
It’s economics.&lt;/p&gt;

&lt;p&gt;Compression removes redundancy.&lt;br&gt;
And redundancy is where mediocre value hides.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. The Real Divide: Medium Developer vs. Professional With AI
&lt;/h2&gt;

&lt;p&gt;This is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI vs. No AI&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Medium Developer vs. Professional With AI&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  The Medium Developer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uses LLM like Google.&lt;/li&gt;
&lt;li&gt;Requests full solutions.&lt;/li&gt;
&lt;li&gt;Iterates blindly.&lt;/li&gt;
&lt;li&gt;Accepts verbose output.&lt;/li&gt;
&lt;li&gt;Ships quickly.&lt;/li&gt;
&lt;li&gt;Accumulates entropy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They generate more code.&lt;/p&gt;

&lt;p&gt;And if you’ve read &lt;em&gt;How to write readable code?&lt;/em&gt;  you already know: more code ≠ better code.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Professional
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Defines constraints first.&lt;/li&gt;
&lt;li&gt;Encodes invariants via types.&lt;/li&gt;
&lt;li&gt;Uses static analysis aggressively.&lt;/li&gt;
&lt;li&gt;Injects domain logic manually.&lt;/li&gt;
&lt;li&gt;Validates output.&lt;/li&gt;
&lt;li&gt;Deletes 70% of generated noise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They multiply thinking instead of outsourcing it.&lt;/p&gt;

&lt;p&gt;They use principles like those defined in the &lt;em&gt;Codelight Manifesto&lt;/em&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clarity&lt;/li&gt;
&lt;li&gt;Optimization (after correctness)&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Generics&lt;/li&gt;
&lt;li&gt;Human-centric design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The professional treats AI like a deterministic macro engine.&lt;/p&gt;

&lt;p&gt;Not like a brain.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. The Token Dilemma: We’re Paying for Lines of Code Again
&lt;/h2&gt;

&lt;p&gt;Remember the 90s mistake?&lt;/p&gt;

&lt;p&gt;Paying developers by lines of code.&lt;/p&gt;

&lt;p&gt;Now look at token billing models.&lt;/p&gt;

&lt;p&gt;We are literally paying for output length.&lt;/p&gt;

&lt;p&gt;What does the model optimize for?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More explanation&lt;/li&gt;
&lt;li&gt;More scaffolding&lt;/li&gt;
&lt;li&gt;More verbosity&lt;/li&gt;
&lt;li&gt;More plausible filler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s the ultimate junior developer incentive structure.&lt;/p&gt;

&lt;p&gt;As someone said recently:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;My productivity as a senior developer no longer comes from writing faster.&lt;br&gt;
It comes from deleting faster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This aligns perfectly with white space discipline from &lt;em&gt;Do Not Fear The White Space in your Code&lt;/em&gt; :&lt;/p&gt;

&lt;p&gt;Clarity is subtraction.&lt;/p&gt;

&lt;p&gt;AI generates quantity.&lt;br&gt;
Experts generate quality by omission.&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Where Top PHP Salaries Actually Live
&lt;/h2&gt;

&lt;p&gt;Let’s answer the core question.&lt;/p&gt;

&lt;p&gt;Can you still earn top PHP salaries, 100% remote, without AI?&lt;/p&gt;

&lt;p&gt;Yes.&lt;/p&gt;

&lt;p&gt;But only if your value is above the compression layer.&lt;/p&gt;

&lt;p&gt;That layer includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architectural trade-offs&lt;/li&gt;
&lt;li&gt;Long-term maintainability&lt;/li&gt;
&lt;li&gt;Static analysis integration&lt;/li&gt;
&lt;li&gt;Refactoring strategy&lt;/li&gt;
&lt;li&gt;Security guarantees&lt;/li&gt;
&lt;li&gt;Performance bottleneck diagnosis&lt;/li&gt;
&lt;li&gt;Domain modeling&lt;/li&gt;
&lt;li&gt;Responsibility under production pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly the mindset described in &lt;em&gt;What have I learned so far in my job?&lt;/em&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No panic.&lt;/li&gt;
&lt;li&gt;Read official documentation.&lt;/li&gt;
&lt;li&gt;Think before acting.&lt;/li&gt;
&lt;li&gt;Solve root causes.&lt;/li&gt;
&lt;li&gt;Learn continuously.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI does not remove the need for that.&lt;/p&gt;

&lt;p&gt;It increases the need.&lt;/p&gt;


&lt;h2&gt;
  
  
  6. Implementation: Professional AI Usage in Modern PHP
&lt;/h2&gt;

&lt;p&gt;Here’s the difference in practice.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1 – Encode Constraints First
&lt;/h3&gt;

&lt;p&gt;Use modern PHP features (see PHP 8.x guide ):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;declare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strict_types&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Money&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="cd"&gt;/** @var numeric-string $amount */&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$currency&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;is_numeric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Amount must be numeric.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2 – Add Static Guarantees
&lt;/h3&gt;

&lt;p&gt;Leverage advanced PHPDoc generics and shapes (see coding standards ):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
 * @param non-empty-list&amp;lt;Money&amp;gt; $items
 */&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Money&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// AI can scaffold this.&lt;/span&gt;
    &lt;span class="c1"&gt;// You verify invariants.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3 – Let AI Scaffold, Not Decide
&lt;/h3&gt;

&lt;p&gt;Ask AI to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate repetitive repository boilerplate&lt;/li&gt;
&lt;li&gt;Create test skeletons&lt;/li&gt;
&lt;li&gt;Draft migration scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review types&lt;/li&gt;
&lt;li&gt;Validate edge cases&lt;/li&gt;
&lt;li&gt;Remove unnecessary abstractions&lt;/li&gt;
&lt;li&gt;Reduce surface area&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI becomes a deterministic macro tool.&lt;/p&gt;

&lt;p&gt;Not a system designer.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Common Pitfalls in the AI Era
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Blind Acceptance
&lt;/h3&gt;

&lt;p&gt;Shipping plausible but unverified code.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Over-Abstraction
&lt;/h3&gt;

&lt;p&gt;Generating factories for trivial objects because the model “likes patterns.”&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Entropy Explosion
&lt;/h3&gt;

&lt;p&gt;More code → more maintenance → more hidden bugs.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Replacing Thinking
&lt;/h3&gt;

&lt;p&gt;Outsourcing domain decisions to a statistical engine.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Best Practices for Surviving the Compression
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Strengthen type systems.&lt;/li&gt;
&lt;li&gt;Use PHPStan aggressively.&lt;/li&gt;
&lt;li&gt;Automate refactoring.&lt;/li&gt;
&lt;li&gt;Enforce code style automatically.&lt;/li&gt;
&lt;li&gt;Reduce public surface area.&lt;/li&gt;
&lt;li&gt;Prefer deletion over addition.&lt;/li&gt;
&lt;li&gt;Move up the abstraction ladder.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Think like a systems engineer, not a syntax operator.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: The Market Is Compressing — Not Dying
&lt;/h2&gt;

&lt;p&gt;LLMs are not architects.&lt;br&gt;
They are pattern engines.&lt;/p&gt;

&lt;p&gt;But in a world where much work is pattern instantiation, pattern engines are disruptive.&lt;/p&gt;

&lt;p&gt;You can absolutely earn top PHP salaries, 100% remote.&lt;/p&gt;

&lt;p&gt;But not if your value was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;typing code faster than others.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You must operate where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Patterns stop&lt;/li&gt;
&lt;li&gt;Trade-offs begin&lt;/li&gt;
&lt;li&gt;Responsibility matters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything below that layer is compressing.&lt;/p&gt;

&lt;p&gt;Compression does not care about feelings.&lt;/p&gt;

&lt;p&gt;It cares about economics.&lt;/p&gt;




&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;AI is a compression engine for repetitive code.&lt;/li&gt;
&lt;li&gt;Mechanical developers are at risk.&lt;/li&gt;
&lt;li&gt;Structural thinkers are amplified.&lt;/li&gt;
&lt;li&gt;Token-based billing incentivizes verbosity.&lt;/li&gt;
&lt;li&gt;Experts win by deleting, not generating.&lt;/li&gt;
&lt;li&gt;Modern PHP + strict typing + static analysis are your leverage.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Call to Action
&lt;/h1&gt;

&lt;p&gt;Audit your own work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are you adding value above the pattern layer?&lt;/li&gt;
&lt;li&gt;Or are you a very fast nail gun operator?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implement code quality gates: static analysis, test coverage, ...&lt;br&gt;
Automate the boring parts.&lt;br&gt;
Move upward in abstraction.&lt;br&gt;
Let the LLM write code generators that write deterministic code.&lt;/p&gt;

</description>
      <category>php</category>
      <category>ai</category>
      <category>career</category>
    </item>
    <item>
      <title>The System Inspector: We need to Approve the Code</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Tue, 03 Feb 2026 05:26:20 +0000</pubDate>
      <link>https://forem.com/suckup_de/the-system-inspector-we-need-to-approve-the-code-5agc</link>
      <guid>https://forem.com/suckup_de/the-system-inspector-we-need-to-approve-the-code-5agc</guid>
      <description>&lt;p&gt;This is a follow-up blog post: 

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/suckup_de/the-wild-west-of-coding-why-were-still-burning-digital-cities-4ph5" class="crayons-story__hidden-navigation-link"&gt;The Wild West of Coding: Why We’re Still Burning Digital Cities&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/suckup_de" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F30309%2F030be03e-5189-49f6-b998-a310d24c30ad.jpg" alt="suckup_de profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/suckup_de" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Lars Moelleken
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Lars Moelleken
                
              
              &lt;div id="story-author-preview-content-2237279" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/suckup_de" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F30309%2F030be03e-5189-49f6-b998-a310d24c30ad.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Lars Moelleken&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/suckup_de/the-wild-west-of-coding-why-were-still-burning-digital-cities-4ph5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 31 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/suckup_de/the-wild-west-of-coding-why-were-still-burning-digital-cities-4ph5" id="article-link-2237279"&gt;
          The Wild West of Coding: Why We’re Still Burning Digital Cities
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/general"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;general&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/suckup_de/the-wild-west-of-coding-why-were-still-burning-digital-cities-4ph5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




&lt;p&gt;The year 2050 is closer than 2000. And yet, software development is entering a phase where writing code is no longer the bottleneck.&lt;/p&gt;

&lt;p&gt;For the first time, &lt;strong&gt;code generation is virtually free&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Large Language Models (LLMs) can generate thousands of lines of syntactically valid, locally plausible code in seconds. The bottleneck is no longer how fast we can implement features - it's how reliably we can absorb what has been produced.&lt;/p&gt;

&lt;p&gt;This shift is not theoretical. It's already showing up in real-world codebases.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenClaw: Code Without Memory
&lt;/h2&gt;

&lt;p&gt;Take the OpenClaw repository. At first glance, it looks like boring TypeScript. No red flags. The kind of code that would sail through a shallow pull request review.&lt;/p&gt;

&lt;p&gt;But zoom out, and the deeper you go, the more disturbing it becomes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redundant checks live next to reckless type assertions.&lt;/li&gt;
&lt;li&gt;Standard APIs are quietly reinvented.&lt;/li&gt;
&lt;li&gt;Near-identical helpers exist side by side, none reused. One even comes with a completely unnecessary comment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/openclaw/openclaw/commit/d1ecb46076145deb188abcba8f0699709ea17198" rel="noopener noreferrer"&gt;https://github.com/openclaw/openclaw/commit/d1ecb46076145deb188abcba8f0699709ea17198&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctvfgue4bcta4zimvrxz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fctvfgue4bcta4zimvrxz.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this commit, the same escape-handling rule&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;isDoubleQuoteEscape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;appears three times, implemented independently in three different parsing loops. It works, but it is duplicated logic, not a shared rule.&lt;/p&gt;

&lt;p&gt;The newly introduced constant&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DOUBLE_QUOTE_ESCAPES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;"&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;makes the same problem visible at the naming level.&lt;br&gt;&lt;br&gt;
&lt;code&gt;DOUBLE_QUOTE_ESCAPES&lt;/code&gt; sounds like “things that happen in double quotes”. What the code actually enforces is much narrower: a whitelist of characters that are allowed &lt;em&gt;after a backslash&lt;/em&gt; while inside a double-quoted string.&lt;/p&gt;

&lt;p&gt;That distinction matters, because this is not a general shell grammar. It is a parser rule with intentionally restricted semantics. A name that encodes the mechanism is therefore clearer and harder to misread:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DOUBLE_QUOTE_BACKSLASH_FOLLOWERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;"&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not a one-off mistake. It is a pattern: rules are re-expressed locally instead of being named once and reused. The code still works. But it doesn’t remember what it already knows.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. From Coder to Inspector
&lt;/h2&gt;

&lt;p&gt;For decades, software was naturally throttled by human speed... typing, thinking, debugging. That friction caught many errors before they reached production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLMs remove that friction.&lt;/strong&gt; They don't understand systems. They don't remember outages, postmortems, or audit logs. They see the end result of code and predict patterns based on surface-level plausibility.&lt;/p&gt;

&lt;p&gt;As a result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defensive logic gets "simplified" away.&lt;/li&gt;
&lt;li&gt;Ugly but necessary patches get erased.&lt;/li&gt;
&lt;li&gt;Implicit architectural contracts get violated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And yet, CI passes. Tests are green. The code looks fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But the foundation quietly erodes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where the role of the Senior Engineer shifts. Their value is no longer in &lt;strong&gt;writing&lt;/strong&gt; code, it's in knowing &lt;strong&gt;when not to&lt;/strong&gt; and where to stop Claude from adding even more markdown files and not needed feature lists.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The Dangerous Gap Between Commit and Reality
&lt;/h2&gt;

&lt;p&gt;Today's pipelines can take code from prompt to production in minutes. What's missing isn't automation, as in the last decade, it's human &lt;strong&gt;verification&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did we actually mean to solve the problem this way?&lt;/li&gt;
&lt;li&gt;Did we just break a hidden assumption?&lt;/li&gt;
&lt;li&gt;Will the next dev understand what this does?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most dangerous bugs aren't crashes. They're subtle degradations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Re-emergent race conditions&lt;/li&gt;
&lt;li&gt;Broken security invariants&lt;/li&gt;
&lt;li&gt;Unnecessary abstractions that raise cognitive load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tests won't catch all of this. Reviews barely scratch the surface when volume explodes.&lt;/p&gt;

&lt;p&gt;And in this new regime, the cost of errors doesn't hit one dev, but it's paid by the organization in the long run.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Enter the System Inspector
&lt;/h2&gt;

&lt;p&gt;In the 19th century, societies learned that bridges shouldn't be approved by the people who built them. &lt;strong&gt;Structural collapses birthed the role of inspectors.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Software is hitting that same phase.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;System Inspector&lt;/strong&gt; is not a title. It's a &lt;strong&gt;responsibility&lt;/strong&gt;: Someone whose job is to &lt;strong&gt;approve&lt;/strong&gt; code, not write it. Not just another Code-Review between the next features. Not based on aesthetics, but on &lt;strong&gt;integrity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Their responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define and protect non-negotiable system rules&lt;/li&gt;
&lt;li&gt;Preserve organizational and historical knowledge&lt;/li&gt;
&lt;li&gt;Manage cognitive load&lt;/li&gt;
&lt;li&gt;Reject syntactically correct but structurally harmful code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not about blocking progress. It's about preventing scale-induced disasters.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Regulation Is a Prerequisite for Scaling
&lt;/h2&gt;

&lt;p&gt;Guidelines don't scale. Style guides don't survive contact with LLMs. Comments get reworded, ignored, or helpfully "improved" into something else entirely.&lt;/p&gt;

&lt;p&gt;Advice is optional. Code generation is not.&lt;/p&gt;

&lt;p&gt;What actually works are &lt;strong&gt;machine-enforceable constraints&lt;/strong&gt;: e.g.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linting, tests, static analysis, contract checks.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt; files that define &lt;strong&gt;rules&lt;/strong&gt;, not suggestions.&lt;/li&gt;
&lt;li&gt;Unchanging values that must apply regardless of how the code was created.&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't bureaucracy. This is infrastructure.&lt;/p&gt;

&lt;p&gt;These constraints are the building codes of software systems that want to grow without collapsing. Every familiar argument against them sounds exactly like the arguments once made against fire codes or electrical standards. They were wrong then. They're wrong now.&lt;/p&gt;

&lt;p&gt;Scaling requires automation. Automation requires limits. And limits still require humans in the loop, just not humans doing the policing by hand.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Blind Spots: The Parts We Prefer to Ignore
&lt;/h2&gt;

&lt;p&gt;Even good systems carry risk. Here are some overlooked failure points:&lt;/p&gt;

&lt;h3&gt;
  
  
  🧱 Lack of Organizational Support
&lt;/h3&gt;

&lt;p&gt;System Inspectors need &lt;strong&gt;mandates and time&lt;/strong&gt;. Without this, their role collapses into unpaid heroism or burnout.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Concentrated Psychological Load
&lt;/h3&gt;

&lt;p&gt;Decision bottlenecks are unsustainable. Approval authority needs to be distributed via frameworks, heuristics, or shared ownership... in the team.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌍 One Size Doesn't Fit All
&lt;/h3&gt;

&lt;p&gt;Not every team need this. These principles apply broadly but must be &lt;strong&gt;contextually adapted&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. IKEA Was Never the Problem
&lt;/h2&gt;

&lt;p&gt;This isn't a moral panic about LLMs.&lt;/p&gt;

&lt;p&gt;Pandora’s box is open. Code generation is here: fast, cheap, and inescapable. Some teams will &lt;strong&gt;choose velocity over resilience&lt;/strong&gt;. That's a valid economic tradeoff.&lt;/p&gt;

&lt;p&gt;The problem begins when these systems are sold as something they are not.&lt;/p&gt;

&lt;p&gt;IKEA furniture is not marketed as handmade oak. Software should follow the same principle of honesty. If we build with particle board, we should say so, and we should not pretend that it can bear the same load.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. The Industrial Phase of Software
&lt;/h2&gt;

&lt;p&gt;Software is leaving its artisanal phase, not because we matured, but because &lt;strong&gt;scale made failure expensive&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Code will be abundant. &lt;strong&gt;Responsibility will be scarce.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We are no longer writing code line by line. We are approving &lt;strong&gt;systems&lt;/strong&gt; that outlast individuals and define entire orgs.&lt;/p&gt;

&lt;p&gt;That's why we need &lt;strong&gt;System Inspectors&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not to halt innovation, but to ensure our digital cities don't collapse like their wooden ancestors.&lt;/p&gt;

&lt;p&gt;Let's build like we know what we're doing. :P&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>codereview</category>
    </item>
    <item>
      <title>How to Use LLMs for Coding Without Losing Your Mind: A Pragmatic Guide</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Thu, 29 Jan 2026 03:13:41 +0000</pubDate>
      <link>https://forem.com/suckup_de/how-to-use-llms-for-coding-without-losing-your-mind-a-pragmatic-guide-1dap</link>
      <guid>https://forem.com/suckup_de/how-to-use-llms-for-coding-without-losing-your-mind-a-pragmatic-guide-1dap</guid>
      <description>&lt;p&gt;#blogPostAsWebApp: &lt;a href="https://voku.github.io/LLMCodingTrainMap/" rel="noopener noreferrer"&gt;https://voku.github.io/LLMCodingTrainMap/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  You Don't Work with LLMs — LLMs Work for You
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;If you treat an LLM like a teammate, you'll be disappointed.&lt;br&gt;&lt;br&gt;
If you treat it like a compiler, you'll ship valuable results.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Developers fail with LLMs for the same reason they fail at planning tasks like writing Jira tickets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vague inputs
&lt;/li&gt;
&lt;li&gt;missing constraints
&lt;/li&gt;
&lt;li&gt;no stopping condition
&lt;/li&gt;
&lt;li&gt;no definition of done
&lt;/li&gt;
&lt;li&gt;blind trust
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide is not about &lt;strong&gt;what LLMs are&lt;/strong&gt;. (I alread did that here) 

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/suckup_de/crayons-and-the-wall-2ia7" class="crayons-story__hidden-navigation-link"&gt;Crayons and the Wall&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/suckup_de" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F30309%2F030be03e-5189-49f6-b998-a310d24c30ad.jpg" alt="suckup_de profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/suckup_de" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Lars Moelleken
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Lars Moelleken
                
              
              &lt;div id="story-author-preview-content-3196828" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/suckup_de" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F30309%2F030be03e-5189-49f6-b998-a310d24c30ad.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Lars Moelleken&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/suckup_de/crayons-and-the-wall-2ia7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/suckup_de/crayons-and-the-wall-2ia7" id="article-link-3196828"&gt;
          Crayons and the Wall
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/engineering"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;engineering&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/suckup_de/crayons-and-the-wall-2ia7" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/suckup_de/crayons-and-the-wall-2ia7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


 &lt;br&gt;
It’s about &lt;strong&gt;how to use them every day&lt;/strong&gt; without losing time, correctness, control or your mind.

&lt;p&gt;Vibes are good. Prompting is not that helpful in 2026, so remove your collected prompts e.g. &lt;a href="https://gist.github.com/voku/4ad5a27836ae7c5100b746848e30d278" rel="noopener noreferrer"&gt;Me as PHP chat bot. 🤖&lt;/a&gt; and use your context window for real work.&lt;br&gt;&lt;br&gt;
But context, workflows and hard constraints are what actually work in production.&lt;/p&gt;

&lt;p&gt;Let's get hands-on.&lt;/p&gt;


&lt;h2&gt;
  
  
  Mental Model: LLM as a Probabilistic Compiler
&lt;/h2&gt;

&lt;p&gt;Before tools, prompts, or rituals, internalize this model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Programming Concept&lt;/th&gt;
&lt;th&gt;LLM Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source Code&lt;/td&gt;
&lt;td&gt;Prompt + Context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Include Paths&lt;/td&gt;
&lt;td&gt;Files, snippets, constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compiler&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;LLM&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intermediate Representation&lt;/td&gt;
&lt;td&gt;Generated output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type Checker&lt;/td&gt;
&lt;td&gt;Static analysis, tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linker&lt;/td&gt;
&lt;td&gt;Manual edits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;If something breaks, &lt;strong&gt;the bug is in the input&lt;/strong&gt;, mostly not in the compiler. (even if we sometimes think it is)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;PS: Here are some 01/2026 facts about LLM usage: If a colleague argues that this doesn't work at all, remind them ...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Cursor Team used hundreds of concurrent AI agents to write over a million lines of code for a browser prototype in a week. Autonomous workflows are real. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/wilsonzlin" rel="noopener noreferrer"&gt;
        wilsonzlin
      &lt;/a&gt; / &lt;a href="https://github.com/wilsonzlin/fastrender" rel="noopener noreferrer"&gt;
        fastrender
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Experimental new browser engine
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;FastRender&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A browser rendering engine in Rust. Parses HTML/CSS, computes styles, performs layout, and paints pixels. Includes a desktop browser shell and JavaScript execution via an embedded JS engine.&lt;/p&gt;
&lt;p&gt;Under heavy development. APIs are unstable and change frequently. Not recommended for production use.&lt;/p&gt;
&lt;p&gt;Developed as part of &lt;a href="https://cursor.com/blog/scaling-agents" rel="nofollow noopener noreferrer"&gt;research into collaborative parallel AI coding agents&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Repository structure&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;src/
├── api.rs                 # Public API (FastRender, RenderOptions)
├── dom.rs                 # DOM tree, parsing, shadow DOM
├── dom2/                  # Live DOM for JS mutation
├── css/                   # CSS parsing, selectors, values
├── style/                 # Cascade, computed styles, media queries
│   ├── cascade.rs         # Cascade algorithm, layers, scope
│   ├── properties.rs      # Property definitions
│   └── values.rs          # Value types, calc(), colors
├── tree/                  # Box tree generation
│   ├── box_tree.rs        # Box nodes, formatting contexts
│   ├── box_generation.rs  # Styled → box mapping
│   └── table_fixup.rs     # Anonymous table wrapper insertion
├── layout/&lt;/code&gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/wilsonzlin/fastrender" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


 

&lt;ul&gt;
&lt;li&gt;Uncle Bob (Robert C. Martin), the master of Clean Code, admitted that LLM Coding-Agents are working surprisingly well.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-2016523982560727349-556" src="https://platform.twitter.com/embed/Tweet.html?id=2016523982560727349"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2016523982560727349-556');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2016523982560727349&amp;amp;theme=dark"
  }





 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linus Torvalds himself used tools like Google Antigravity for hobby projects and accepted the results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/torvalds" rel="noopener noreferrer"&gt;
        torvalds
      &lt;/a&gt; / &lt;a href="https://github.com/torvalds/GuitarPedal" rel="noopener noreferrer"&gt;
        GuitarPedal
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Linus learns analog circuits
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Random guitar pedal board design&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;This project is archived&lt;/h3&gt;
&lt;/div&gt;
&lt;p&gt;I got about as far as I was interested to get in this form.&lt;/p&gt;
&lt;p&gt;The analog pedals were never very interesting from a sound perspective
but they were great for learnign the basics.  That last boost pedal (not
in a 1590LB form factor, despite the pathname) with a long-tailed pair
and a few current sources, was really about as far as I was interested
in the analog side.&lt;/p&gt;
&lt;p&gt;Along the way, I learnt about transistors (BJTs, MOSFETs and JFETs),
about diode mixers, Gilbert cells etc.  None of the pedals made pleasing
sounds, and I still think analog pedals are pointless, but as a learning
exercise they were great.&lt;/p&gt;
&lt;p&gt;The digital pedal then took me longer to get around to because there
were so many choices and the initial step was bigger - but I was never
interested in just connecting together…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/torvalds/GuitarPedal" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;







&lt;h2&gt;
  
  
  1. Input Discipline (Before You Ask Anything)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Rule: Never Prompt Raw Thought
&lt;/h3&gt;

&lt;p&gt;LLMs amplify ambiguity.&lt;br&gt;&lt;br&gt;
If your input is fuzzy, the output will be confidently wrong. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2qx8ebnwi1b6gpv3kda.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2qx8ebnwi1b6gpv3kda.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bad input:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Implement the refund logic.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Good input:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Context:
- PHP 8.2
- Existing service RefundService
- Amounts are integers (cents)
- Manual approval required above 500 EUR

Constraints:
- Do not change public interfaces
- No new dependencies
- Existing tests must pass

Task:
Draft the internal calculation logic only.

Related Files:
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Pro Tip for Long-Term Memory&lt;/strong&gt;: Don't try to hold everything in the active chat context. Have the LLM write summaries or decisions into markdown files in the repo. Use repository artifacts as the LLM's long-term memory.&lt;/p&gt;

&lt;p&gt;PS: Google Gemini has currently the highest context window, so switch to that model for those tasks if needed&lt;/p&gt;


&lt;h2&gt;
  
  
  2. The 90% Rule (Where LLMs Are Actually Good)
&lt;/h2&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-2013373307291340870-261" src="https://platform.twitter.com/embed/Tweet.html?id=2013373307291340870"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2013373307291340870-261');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2013373307291340870&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;LLMs are excellent at the &lt;strong&gt;first 80–90%&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scaffolding&lt;/li&gt;
&lt;li&gt;DTOs&lt;/li&gt;
&lt;li&gt;adapters&lt;/li&gt;
&lt;li&gt;mappings&lt;/li&gt;
&lt;li&gt;test skeletons&lt;/li&gt;
&lt;li&gt;documentation that mirrors code&lt;/li&gt;
&lt;li&gt;mechanical refactoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are &lt;strong&gt;bad&lt;/strong&gt; at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;domain invariants&lt;/li&gt;
&lt;li&gt;legal constraints&lt;/li&gt;
&lt;li&gt;historical edge cases&lt;/li&gt;
&lt;li&gt;“this legacy code is ugly for a reason”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Rule
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Mostly you don't want to prompt the last 10%.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The moment you think “it’s almost right”, stop prompting.&lt;/p&gt;

&lt;p&gt;You either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fix it manually, or&lt;/li&gt;
&lt;li&gt;encode the missing rule as a test or type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anything else becomes prompt addiction.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Daily Workflows
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Planning — Use LLMs for Triage, Not Code
&lt;/h3&gt;

&lt;p&gt;Start the feature or project by converting chaos into structure.&lt;/p&gt;

&lt;p&gt;Use LLMs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;summarize long ticket threads&lt;/li&gt;
&lt;li&gt;extract precise acceptance criteria&lt;/li&gt;
&lt;li&gt;identify system invariants&lt;/li&gt;
&lt;li&gt;list unknowns and highlight risks&lt;/li&gt;
&lt;li&gt;debate technical trade-offs (ping-pong arguments)&lt;/li&gt;
&lt;li&gt;run a "blind spot analysis" against your plan (&lt;a href="https://voku.github.io/BlindSpotMetaPromptApp/" rel="noopener noreferrer"&gt;Meta-Prompt&lt;/a&gt; or via &lt;a href="https://chatgpt.com/g/g-6816771cf34c8191bf5a053958ce0c79-blind-spot-prompt-generator" rel="noopener noreferrer"&gt;Chatty&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No code yet. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hint&lt;/strong&gt;: And remember, before you use the latest shiny framework version, that the current models were trained with data from last year, so you should “at least” be from that time, maybe even older, so that more training data was available at that time.&lt;/p&gt;

&lt;p&gt;If you skip this, you’re outsourcing thinking, not typing.&lt;/p&gt;

&lt;p&gt;Note: If you are typing a lot, voice tools like &lt;a href="https://wisprflow.ai/" rel="noopener noreferrer"&gt;wisprflow.ai&lt;/a&gt; can reduce friction (and yes, that matters).&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2: Implementation
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Lane A: The "Legacy Stack" Approach (e.g., older PHP, Java)
&lt;/h4&gt;

&lt;p&gt;If the LLM struggles with your 1996 template engine quirks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generate a Mockup&lt;/strong&gt; (image) after you provided your "style guide" and examples PS: if you haven't a style guide yet, let the LLM help you also with that task - &lt;a href="https://gist.github.com/voku/8615cc2b095ec2d46a3e69faa2595dad" rel="noopener noreferrer"&gt;https://gist.github.com/voku/8615cc2b095ec2d46a3e69faa2595dad&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generate a Click-Dummy&lt;/strong&gt; of the Mockup: Turn the mockup into a clickable prototype to verify flows against constraints.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Manual Integration&lt;/strong&gt;: Use the Click-Dummy to integeate the feature into the real code, mostly by hand&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tests&lt;/strong&gt;: Let the LLM add some tests in the end :) (I know we want to use TDD but anyway)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h4&gt;
  
  
  Lane B: Frontend "Vibe-Coding" (The 2026 Way)
&lt;/h4&gt;

&lt;p&gt;For modern stacks where iteration is cheap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;strong&gt;&lt;a href="https://aistudio.google.com/" rel="noopener noreferrer"&gt;AI Studio&lt;/a&gt;&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use your &lt;strong&gt;planning&lt;/strong&gt; from before, and copy&amp;amp;past just the full document into the input. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PS: for me ChatGPT is still best in planning such stuff without adding un-wanted stuff like Claude often does&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Now is Ping-Pong time, let's &lt;strong&gt;shape&lt;/strong&gt; the results by using the AI-Studio to providing direct feedback and ideas that pop-up while seeing the results. :)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Push&lt;/strong&gt; the 90% version to github (just one click in the UI)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agentic Cleanup&lt;/strong&gt;: Now let's use another LLM (e.g. codex web or github agent) ... and you can give the agents more than one task, if the tasks are small, so that you do not need 10/100 free request but just 1/100 e.g.:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Remove GEMINI references
Update README.md to remove AI Studio ads and references
Update README.md with production-ready documentation
Add "Key Files Detector" helper prompt to README.md
Add a favicon
Create a contribution link (https://github.com/[YOUR_LINK_HERE]) in the webapp
Configure GitHub Pages deployment with Vite build
Add GitHub Actions workflow for automatic deployment
Build and verify the application works
Review and finalize changes and make sure the entry point from the webapp is in the html file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Activate github pages (for free) and your Webapp is &lt;strong&gt;online&lt;/strong&gt; while you managed all this with your phone :)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;PS: here are my example Webapp stuff that I created mostly this way: &lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/suckup_de/posts-as-webapps-26lk" class="crayons-story__hidden-navigation-link"&gt;BlogPosts as WebApps&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/suckup_de" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F30309%2F030be03e-5189-49f6-b998-a310d24c30ad.jpg" alt="suckup_de profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/suckup_de" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Lars Moelleken
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Lars Moelleken
                
              
              &lt;div id="story-author-preview-content-3179432" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/suckup_de" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F30309%2F030be03e-5189-49f6-b998-a310d24c30ad.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Lars Moelleken&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/suckup_de/posts-as-webapps-26lk" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 17&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/suckup_de/posts-as-webapps-26lk" id="article-link-3179432"&gt;
          BlogPosts as WebApps
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typescript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typescript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/learning"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;learning&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/suckup_de/posts-as-webapps-26lk#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;/div&gt;








&lt;h4&gt;
  
  
  Lane C: Agentic-Coding (Vibe-Coding with Control)
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plan with Restrictions&lt;/strong&gt;: Ensure your planning phase is solid and you have clear constraints documented (e.g., in an AGENTS.md file in your repo root).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Define Tasks&lt;/strong&gt;: Add clear, bite-sized tasks into a docs/TODO.md file via the LLM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Run the Agent&lt;/strong&gt;: Use CLI tools (see "What's Next" below) to execute the list.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example: &lt;code&gt;codex --yolo "Implement the open tasks from docs/TODO.md"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This tools are also working with your subscription, and often has a free try and at the end of the post I wrote a quick one minute intro to install it, see &lt;code&gt;What’s Next: Agentic Coding (Try It)&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;I created the next project via agents (without any IDE) and while working on it, I saw that the agents really has problems with e.g. Android Apps because the build time (feedback loop) was way to slow with my mini pc :/ so I asked the agent to convert it into a Webapp and it worked. :D &lt;/p&gt;

&lt;p&gt;My main pain point is that if you didn't do the coding work anymore you haven't this mental model of the project in mind and it's more and more complicated to plan new things and to keep it stable. &lt;/p&gt;

&lt;p&gt;(still not 100% done, we need to train the ML Engine now)&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/voku" rel="noopener noreferrer"&gt;
        voku
      &lt;/a&gt; / &lt;a href="https://github.com/voku/AmysEcho" rel="noopener noreferrer"&gt;
        AmysEcho
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      This repository contains the development work for my little girl — to help her be understood, to help her learn, and to help others understand her world.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Amy's Echo&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/voku/AmysEcho/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="Open Source – MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/voku/AmysEcho#-open-source--vibe-coded" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/97bbb903aafa7e42531c24112c46f1b93cf71202712e3a8b5c9af95de8005c50/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6275696c74253230776974682d76696265732d626c756576696f6c6574" alt="100% Vibe Coded"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This repository contains the development work for my little girl — to help her be understood, to help her learn, and to help others understand her world.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Amy is four years old. She was born with &lt;strong&gt;22q11 Deletion Syndrome&lt;/strong&gt; and communicates using &lt;strong&gt;Deutsche Gebärdensprache (DGS)&lt;/strong&gt; — German Sign Language. Her gestures are expressive, her intent is clear — but most people around her don't understand what she's trying to say.&lt;/p&gt;
&lt;p&gt;This project turns those gestures into speech and symbols so she can be heard anywhere. Each child profile receives personalized gesture recognition trained from their own samples, making the system effective for 22q11 workflows in group settings like kindergartens.&lt;/p&gt;
&lt;p&gt;All app UI text and error messages are written in German to match Amy's language environment.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎯 Purpose&lt;/h2&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Don't build for everyone. Build for one. But do it well enough that everyone could follow.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Amy's Echo is a gesture…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/voku/AmysEcho" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;







&lt;h3&gt;
  
  
  Lane D: The Daily Driver (IDE-Centric Coding with Guardrails)
&lt;/h3&gt;

&lt;p&gt;This lane is for daily engineering work inside the IDE (e.g. PhpStorm + GitHub Copilot). Maintenance, debugging, and refactoring where correctness matters more than speed.&lt;/p&gt;

&lt;p&gt;No agents. No pipelines. Just quick feedback loops.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Curate Context Explicitly&lt;/strong&gt;: Copilot does not understand your project:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open&lt;/strong&gt; the interface or contract&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open&lt;/strong&gt; the concrete implementation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open&lt;/strong&gt; the relevant test&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open&lt;/strong&gt; involved DTOs or config files&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Rule&lt;/strong&gt;: If the file is not open tab, it doesn’t exist for the LLM.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prefer Inline Edit Mode Over Chat&lt;/strong&gt;: Use Copilot where diffs are visible and reversible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select&lt;/strong&gt; code in the editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trigger&lt;/strong&gt; inline edit (Ctrl + Shift + I)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt&lt;/strong&gt; with a precise, local instruction&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;: "Extract the loop logic into a private method &lt;code&gt;processItems&lt;/code&gt; with an explicit return type."&lt;/p&gt;

&lt;p&gt;Review the diff. Accept deliberately.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stabilize Legacy Code via Reverse Documentation&lt;/strong&gt;: For unclear or fragile code, do not ask for a refactor immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select&lt;/strong&gt; the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask&lt;/strong&gt; Copilot to describe it, not change it.&lt;/li&gt;
&lt;li&gt;"Write a PHPDoc explaining exactly what this code does, including edge cases."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate&lt;/strong&gt; the explanation first.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Refactor&lt;/strong&gt; only after the behavior is explicit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Actively Prevent "Passenger Mode"&lt;/strong&gt;: The &lt;code&gt;Tab&lt;/code&gt; → &lt;code&gt;Accept&lt;/code&gt; → &lt;code&gt;Commit&lt;/code&gt; loop is a trap.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Read generated code &lt;strong&gt;before&lt;/strong&gt; accepting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you can’t explain it, &lt;strong&gt;reject&lt;/strong&gt; it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Copilot accelerates thinking. It should not replace it in this lane.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Validation — Treat Output as Untrusted
&lt;/h3&gt;

&lt;p&gt;LLM output is &lt;strong&gt;never final code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It must pass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strict type checking&lt;/li&gt;
&lt;li&gt;aggressive linters&lt;/li&gt;
&lt;li&gt;automated tests&lt;/li&gt;
&lt;li&gt;static analysis tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it doesn’t:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fix the constraint
&lt;/li&gt;
&lt;li&gt;or add more context
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;A compiler that issues warnings is telling you something.&lt;br&gt;&lt;br&gt;
An LLM often believes it has done everything correctly and therefore also requires similar validation steps&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Adding more context sounds more easy that it sometimes: UI Bug Example&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide the exact error message from the CI pipeline.&lt;/li&gt;
&lt;li&gt;Use an MCP (Model Context Protocol) tool to let the LLM view the app in a headless browser.&lt;/li&gt;
&lt;li&gt;Provide a screenshot with browser DevTools open showing the DOM state.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 4: commit&amp;amp;push — Let the Repo Remember
&lt;/h3&gt;

&lt;p&gt;Humans forget why things exist.&lt;br&gt;&lt;br&gt;
LLMs don’t, if you ask at the right moment.&lt;/p&gt;

&lt;p&gt;Use them to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summarize diffs into commit messages. Crucial: Manually add the "WHY" to the message; the LLM usually only sees the "WHAT".&lt;/li&gt;
&lt;li&gt;Draft Architectural Decision Records (ADRs). Hint: Add a note in generated docs that they are drafts and need human review.&lt;/li&gt;
&lt;li&gt;Explain "why this legacy code is ugly" and document it in a comment near the code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This kills tribal knowledge without requiring meetings.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Constraints Beat Prompts (Always)
&lt;/h2&gt;

&lt;p&gt;Stop writing clever prompts. (&lt;a href="https://voku.github.io/PromptMastery/" rel="noopener noreferrer"&gt;https://voku.github.io/PromptMastery/&lt;/a&gt;)&lt;br&gt;
Start writing &lt;strong&gt;constraint boxes&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Constraints:
- No new public methods allowed.
- Must preserve backward compatibility with API v2.
- Assume input is already validated (do not add redundant checks).
- Output must be deterministic (seed random number generators).
- Fail fast with a specific Exception class on invalid state.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Constraints shrink the solution space, making correct answers more likely. But sady they traind the current LLMs just the happy path. :P&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Generators Over Code
&lt;/h2&gt;

&lt;p&gt;If you ask an LLM to write the same thing 5x, you already failed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bad&lt;/strong&gt;: "Generate 30 DTOs for these tables..."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good&lt;/strong&gt;: "Write a Python script using Jinja2 templates that reads this database schema YAML and generates the 30 DTO files fitting our project structure."&lt;/p&gt;

&lt;p&gt;This turns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;probability → determinism
&lt;/li&gt;
&lt;li&gt;conversation → reusable tooling&lt;/li&gt;
&lt;li&gt;magic → a reproducible build step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other example: PHP&lt;br&gt;
In larger legacy systems, I recently had the LLM create various custom PHP-CS-Fixer rules so that we could easily migrate things in a deterministic way. That's the way.  &lt;/p&gt;
&lt;h2&gt;
  
  
  What’s Next: Agentic Coding (Try It)
&lt;/h2&gt;

&lt;p&gt;If you haven’t played with CLI-based code agents yet, you’re missing the point of all this.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t overthink it.
&lt;/li&gt;
&lt;li&gt;Don’t integrate it into prod.
&lt;/li&gt;
&lt;li&gt;Try it locally and break things safely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are three options you can test quickly.&lt;/p&gt;


&lt;h3&gt;
  
  
  1. Google Gemini CLI
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/google-gemini" rel="noopener noreferrer"&gt;
        google-gemini
      &lt;/a&gt; / &lt;a href="https://github.com/google-gemini/gemini-cli" rel="noopener noreferrer"&gt;
        gemini-cli
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      An open-source AI agent that brings the power of Gemini directly into your terminal.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Gemini CLI&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/google-gemini/gemini-cli/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/google-gemini/gemini-cli/actions/workflows/ci.yml/badge.svg" alt="Gemini CLI CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/google-gemini/gemini-cli/actions/workflows/chained_e2e.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/google-gemini/gemini-cli/actions/workflows/chained_e2e.yml/badge.svg" alt="Gemini CLI E2E (Chained)"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/package/@google/gemini-cli" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/34811703a711b6037aa43a44195c31c3844bdb76af3fb0221142c7a3f03d5929/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f40676f6f676c652f67656d696e692d636c69" alt="Version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/google-gemini/gemini-cli/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8ad45b29989b35a46e9a9881bd5cbc03e8393ae620f6c70884d3e8e05afe92c0/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f676f6f676c652d67656d696e692f67656d696e692d636c69" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://codewiki.google/github.com/google-gemini/gemini-cli?utm_source=badge&amp;amp;utm_medium=github&amp;amp;utm_campaign=github.com/google-gemini/gemini-cli" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/94541bcea8452983959d62ea7b483d19909ad00e9827d23ca65ade5aab87b795/68747470733a2f2f6173736574732e636f646577696b692e676f6f676c652f726561646d652d62616467652f7374617469632e737667" alt="View Code Wiki"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/docs/assets/gemini-screenshot.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fdocs%2Fassets%2Fgemini-screenshot.png" alt="Gemini CLI Screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gemini CLI is an open-source AI agent that brings the power of Gemini directly
into your terminal. It provides lightweight access to Gemini, giving you the
most direct path from your prompt to our model.&lt;/p&gt;
&lt;p&gt;Learn all about Gemini CLI in our &lt;a href="https://geminicli.com/docs/" rel="nofollow noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Why Gemini CLI?&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🎯 Free tier&lt;/strong&gt;: 60 requests/min and 1,000 requests/day with personal Google
account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🧠 Powerful Gemini 3 models&lt;/strong&gt;: Access to improved reasoning and 1M token
context window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔧 Built-in tools&lt;/strong&gt;: Google Search grounding, file operations, shell
commands, web fetching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔌 Extensible&lt;/strong&gt;: MCP (Model Context Protocol) support for custom
integrations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💻 Terminal-first&lt;/strong&gt;: Designed for developers who live in the command line.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🛡️ Open source&lt;/strong&gt;: Apache 2.0 licensed.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📦 Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;See
&lt;a href="https://github.com/google-gemini/gemini-cli/./docs/get-started/installation.md" rel="noopener noreferrer"&gt;Gemini CLI installation, execution, and releases&lt;/a&gt;
for recommended system specifications and a detailed installation guide.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Quick Install&lt;/h3&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Run instantly with npx&lt;/h4&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Using npx (no installation&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/google-gemini/gemini-cli" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @google/gemini-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Run (inside your local project)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini &lt;span class="nt"&gt;--yolo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. OpenAI Codex CLI
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/openai" rel="noopener noreferrer"&gt;
        openai
      &lt;/a&gt; / &lt;a href="https://github.com/openai/codex" rel="noopener noreferrer"&gt;
        codex
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Lightweight coding agent that runs in your terminal
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;code&gt;npm i -g @openai/codex&lt;/code&gt;&lt;br&gt;or &lt;code&gt;brew install --cask codex&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Codex CLI&lt;/strong&gt; is a coding agent from OpenAI that runs locally on your computer
&lt;/p&gt;
&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/openai/codex/blob/main/.github/codex-cli-splash.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fopenai%2Fcodex%2Fraw%2Fmain%2F.github%2Fcodex-cli-splash.png" alt="Codex CLI splash" width="80%"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;br&gt;
If you want Codex in your code editor (VS Code, Cursor, Windsurf), &lt;a href="https://developers.openai.com/codex/ide" rel="nofollow noopener noreferrer"&gt;install in your IDE.&lt;/a&gt;
&lt;br&gt;If you want the desktop app experience, run &lt;code&gt;codex app&lt;/code&gt; or visit &lt;a href="https://chatgpt.com/codex?app-landing-page=true" rel="nofollow noopener noreferrer"&gt;the Codex App page&lt;/a&gt;
&lt;br&gt;If you are looking for the &lt;em&gt;cloud-based agent&lt;/em&gt; from OpenAI, &lt;strong&gt;Codex Web&lt;/strong&gt;, go to &lt;a href="https://chatgpt.com/codex" rel="nofollow noopener noreferrer"&gt;chatgpt.com/codex&lt;/a&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Quickstart&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Installing and running Codex CLI&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Install globally with your preferred package manager:&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Install using npm&lt;/span&gt;
npm install -g @openai/codex&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Install using Homebrew&lt;/span&gt;
brew install --cask codex&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then simply run &lt;code&gt;codex&lt;/code&gt; to get started.&lt;/p&gt;

You can also go to the &lt;a href="https://github.com/openai/codex/releases/latest" rel="noopener noreferrer"&gt;latest GitHub Release&lt;/a&gt; and download the appropriate binary for your platform.
&lt;p&gt;Each GitHub Release contains many executables, but in practice, you likely want one of these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;macOS
&lt;ul&gt;
&lt;li&gt;Apple Silicon/arm64: &lt;code&gt;codex-aarch64-apple-darwin.tar.gz&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;x86_64 (older Mac hardware): &lt;code&gt;codex-x86_64-apple-darwin.tar.gz&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/openai/codex" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;Codex CLI is explicitly designed to run locally and operate on the selected directory. (&lt;a href="https://developers.openai.com/codex/cli/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;developers.openai.com&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @openai/codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Run&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex &lt;span class="nt"&gt;--yolo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;⚠️ Use this only in a &lt;strong&gt;local / restricted environment&lt;/strong&gt;. It can delete things. That’s not a joke.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. opencode-ai (open source)
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/anomalyco" rel="noopener noreferrer"&gt;
        anomalyco
      &lt;/a&gt; / &lt;a href="https://github.com/anomalyco/opencode" rel="noopener noreferrer"&gt;
        opencode
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The open source coding agent.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a href="https://opencode.ai" rel="nofollow noopener noreferrer"&gt;
    
      
      
      &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fanomalyco%2Fopencode%2Fpackages%2Fconsole%2Fapp%2Fsrc%2Fasset%2Flogo-ornate-light.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fanomalyco%2Fopencode%2Fpackages%2Fconsole%2Fapp%2Fsrc%2Fasset%2Flogo-ornate-light.svg" alt="OpenCode logo"&gt;&lt;/a&gt;
    
  &lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The open source AI coding agent.&lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://opencode.ai/discord" rel="nofollow noopener noreferrer"&gt;&lt;img alt="Discord" src="https://camo.githubusercontent.com/83daa53aa89771d7c1b411e9d8aab90692f07934a8c2aea6a6794687082e2f68/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f313339313833323432363034383635313333343f7374796c653d666c61742d737175617265266c6162656c3d646973636f7264"&gt;&lt;/a&gt;
  &lt;a href="https://www.npmjs.com/package/opencode-ai" rel="nofollow noopener noreferrer"&gt;&lt;img alt="npm" src="https://camo.githubusercontent.com/4e57d77e1805497a6befb9cc1743a8069756f26377e832d09f1ba2ca49f9370c/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f6f70656e636f64652d61693f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/anomalyco/opencode/actions/workflows/publish.yml" rel="noopener noreferrer"&gt;&lt;img alt="Build status" src="https://camo.githubusercontent.com/dfb623969ed19b150f1ccf242b1b4c4b4629515c1aa0603fb795ff3e407c1b2d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f616e6f6d616c79636f2f6f70656e636f64652f7075626c6973682e796d6c3f7374796c653d666c61742d737175617265266272616e63683d646576"&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
  &lt;a href="https://github.com/anomalyco/opencode/README.md" rel="noopener noreferrer"&gt;English&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.zh.md" rel="noopener noreferrer"&gt;简体中文&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.zht.md" rel="noopener noreferrer"&gt;繁體中文&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.ko.md" rel="noopener noreferrer"&gt;한국어&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.de.md" rel="noopener noreferrer"&gt;Deutsch&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.es.md" rel="noopener noreferrer"&gt;Español&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.fr.md" rel="noopener noreferrer"&gt;Français&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.it.md" rel="noopener noreferrer"&gt;Italiano&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.da.md" rel="noopener noreferrer"&gt;Dansk&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.ja.md" rel="noopener noreferrer"&gt;日本語&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.pl.md" rel="noopener noreferrer"&gt;Polski&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.ru.md" rel="noopener noreferrer"&gt;Русский&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.bs.md" rel="noopener noreferrer"&gt;Bosanski&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.ar.md" rel="noopener noreferrer"&gt;العربية&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.no.md" rel="noopener noreferrer"&gt;Norsk&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.br.md" rel="noopener noreferrer"&gt;Português (Brasil)&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.th.md" rel="noopener noreferrer"&gt;ไทย&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.tr.md" rel="noopener noreferrer"&gt;Türkçe&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.uk.md" rel="noopener noreferrer"&gt;Українська&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.bn.md" rel="noopener noreferrer"&gt;বাংলা&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.gr.md" rel="noopener noreferrer"&gt;Ελληνικά&lt;/a&gt; |
  &lt;a href="https://github.com/anomalyco/opencode/README.vi.md" rel="noopener noreferrer"&gt;Tiếng Việt&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://opencode.ai" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fanomalyco%2Fopencode%2Fpackages%2Fweb%2Fsrc%2Fassets%2Flander%2Fscreenshot.png" alt="OpenCode Terminal UI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Installation&lt;/h3&gt;
&lt;/div&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; YOLO&lt;/span&gt;
curl -fsSL https://opencode.ai/install &lt;span class="pl-k"&gt;|&lt;/span&gt; bash
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Package managers&lt;/span&gt;
npm i -g opencode-ai@latest        &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or bun/pnpm/yarn&lt;/span&gt;
scoop install opencode             &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Windows&lt;/span&gt;
choco install opencode             &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Windows&lt;/span&gt;
brew install anomalyco/tap/opencode &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; macOS and Linux (recommended, always up to date)&lt;/span&gt;
brew install opencode              &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; macOS and Linux (official brew formula, updated less)&lt;/span&gt;
sudo pacman -S opencode            &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Arch Linux (Stable)&lt;/span&gt;
paru -S opencode-bin               &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Arch Linux (Latest from AUR)&lt;/span&gt;
mise use -g opencode               &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Any OS&lt;/span&gt;
nix run nixpkgs#opencode           &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or github:anomalyco/opencode for latest dev branch&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-alert markdown-alert-tip"&gt;
&lt;p class="markdown-alert-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;Remove versions older than 0.1.x before installing.&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Desktop App (BETA)&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;OpenCode is…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/anomalyco/opencode" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;p&gt;&lt;strong&gt;Install&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; opencode-ai@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Important (learn this early)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;run agents &lt;strong&gt;locally or in Docker&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;combine them with:

&lt;ul&gt;
&lt;li&gt;static analysis&lt;/li&gt;
&lt;li&gt;code style checks&lt;/li&gt;
&lt;li&gt;tests&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;treat agents like a &lt;strong&gt;junior dev with root access&lt;/strong&gt;
&lt;/li&gt;

&lt;li&gt;add skills/instructions (AGENTS.md etc.) step by step

&lt;ul&gt;
&lt;li&gt;less is more
&lt;/li&gt;
&lt;li&gt;MCP and tool calls are cool, but it eats your context window
&lt;/li&gt;
&lt;li&gt;ideas: &lt;a href="https://voku.github.io/your_agent_config/" rel="noopener noreferrer"&gt;https://voku.github.io/your_agent_config/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Agentic development isn’t magic, but at some point we need a IDE again. :D  &lt;/p&gt;




&lt;h2&gt;
  
  
  Some !funny takes at the end
&lt;/h2&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-2015115128149041360-131" src="https://platform.twitter.com/embed/Tweet.html?id=2015115128149041360"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2015115128149041360-131');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2015115128149041360&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-2015180689335812480-833" src="https://platform.twitter.com/embed/Tweet.html?id=2015180689335812480"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2015180689335812480-833');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2015180689335812480&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-2016599645997216050-461" src="https://platform.twitter.com/embed/Tweet.html?id=2016599645997216050"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2016599645997216050-461');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2016599645997216050&amp;amp;theme=dark"
  }





&lt;/p&gt;

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

</description>
      <category>ai</category>
      <category>llm</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>PHP: Why I Use Static Analysis</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Mon, 26 Jan 2026 05:14:07 +0000</pubDate>
      <link>https://forem.com/suckup_de/php-why-i-use-static-analysis-25ik</link>
      <guid>https://forem.com/suckup_de/php-why-i-use-static-analysis-25ik</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: Errors Belong to Developers, Not Users
&lt;/h2&gt;

&lt;p&gt;#blogPostAsWebApp: &lt;a href="https://voku.github.io/WhyPHPStan/" rel="noopener noreferrer"&gt;https://voku.github.io/WhyPHPStan/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s start with something simple and uncomfortable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If an error happens at runtime, a user sees it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I don’t care how good your monitoring is, how fast your rollback pipeline runs, or how often you say “it shouldn’t happen”. Runtime errors are already too late. They are failures that escaped development and reached production.&lt;/p&gt;

&lt;p&gt;That’s the entire motivation for static analysis.&lt;br&gt;&lt;br&gt;
Not theory. Not fashion. Damage control.&lt;/p&gt;

&lt;p&gt;PHP enforces reality.&lt;br&gt;&lt;br&gt;
Static analysis enforces possibility.&lt;/p&gt;

&lt;p&gt;Two different layers. Two different failure modes.&lt;br&gt;&lt;br&gt;
And if we can use both, the real question is: &lt;strong&gt;why wouldn’t we?&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  PHP Enforces Reality. Static Analysis Enforces Possibility.
&lt;/h2&gt;

&lt;p&gt;PHP is excellent at telling you when something actually breaks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;calling a method that doesn’t exist
&lt;/li&gt;
&lt;li&gt;passing a string where an int is required
&lt;/li&gt;
&lt;li&gt;accessing a property on &lt;code&gt;null&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s runtime reality.&lt;/p&gt;

&lt;p&gt;But PHP is deliberately permissive before that point. It allows code to exist even if it can only fail under certain conditions, in certain branches, or after a refactor.&lt;/p&gt;

&lt;p&gt;That’s where static analysis comes in.&lt;/p&gt;

&lt;p&gt;Tools like PHPStan don’t compete with PHP. They operate earlier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when code is written
&lt;/li&gt;
&lt;li&gt;when it’s refactored
&lt;/li&gt;
&lt;li&gt;when it’s reviewed
&lt;/li&gt;
&lt;li&gt;when it’s understood by someone new
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PHP tells you what happened.&lt;br&gt;&lt;br&gt;
Static analysis tells you what should never have been possible.&lt;/p&gt;

&lt;p&gt;Different jobs. Same goal.&lt;/p&gt;


&lt;h2&gt;
  
  
  High PHPStan Levels Don’t Just Find Bugs — They Shape Architecture
&lt;/h2&gt;

&lt;p&gt;This is where many people misunderstand strict static analysis.&lt;/p&gt;

&lt;p&gt;A high PHPStan level is not about “more errors”.&lt;br&gt;&lt;br&gt;
It’s an architectural pressure system.&lt;/p&gt;

&lt;p&gt;It pushes you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stop passing anonymous arrays around
&lt;/li&gt;
&lt;li&gt;stop encoding meaning in strings
&lt;/li&gt;
&lt;li&gt;stop hiding invariants in comments
&lt;/li&gt;
&lt;li&gt;introduce value objects, enums, interfaces
&lt;/li&gt;
&lt;li&gt;define clear boundaries and contracts
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And yes, there’s a very pleasant side effect:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;IDE autocompletion becomes frighteningly good&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because once types are precise, the IDE actually understands your system.&lt;br&gt;&lt;br&gt;
Not guesses. Not &lt;code&gt;mixed&lt;/code&gt;. Not “trust me”.&lt;/p&gt;

&lt;p&gt;That’s not cosmetic DX. That’s speed and confidence.&lt;/p&gt;


&lt;h2&gt;
  
  
  “Let PHP Enforce Contracts” — Good. Now Add the Missing Layer.
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;“Let PHP enforce contracts.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perfect. We should.&lt;/p&gt;

&lt;p&gt;But nothing stops you from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enforcing contracts at runtime &lt;strong&gt;and&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;enforcing them at design time
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In fact, PHPStan often nudges you toward better PHP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stricter parameter types
&lt;/li&gt;
&lt;li&gt;explicit return types
&lt;/li&gt;
&lt;li&gt;real interfaces instead of conventions
&lt;/li&gt;
&lt;li&gt;enums instead of magic strings
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using static analysis doesn’t weaken PHP’s guarantees.&lt;br&gt;&lt;br&gt;
It narrows the space in which PHP ever has to complain.&lt;/p&gt;


&lt;h2&gt;
  
  
  DX Matters: Instant Feedback Beats Any Test Suite
&lt;/h2&gt;

&lt;p&gt;One of the most underrated benefits is developer experience.&lt;/p&gt;

&lt;p&gt;If a function declares:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
 * @param int&amp;lt;1, 32&amp;gt; $limit
 */&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$limit&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And I pass &lt;code&gt;64&lt;/code&gt;, I want that error:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;immediately
&lt;/li&gt;
&lt;li&gt;in my IDE
&lt;/li&gt;
&lt;li&gt;without running tests
&lt;/li&gt;
&lt;li&gt;without pushing code
&lt;/li&gt;
&lt;li&gt;without involving CI
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That feedback loop is priceless.&lt;/p&gt;

&lt;p&gt;Static analysis is the only tool that gives you semantic errors at typing speed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security: &lt;code&gt;literal-string&lt;/code&gt; Is a Real Guardrail
&lt;/h2&gt;

&lt;p&gt;This is not theoretical.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
 * @param literal-string $sql
 */&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;runRaw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$sql&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single constraint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;blocks user input
&lt;/li&gt;
&lt;li&gt;blocks “temporary” hacks
&lt;/li&gt;
&lt;li&gt;blocks accidental string concatenation
&lt;/li&gt;
&lt;li&gt;blocks whole classes of SQL injection mistakes
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Does it solve all security? Of course not.&lt;br&gt;&lt;br&gt;
Does it eliminate dumb, expensive errors early? Absolutely.&lt;/p&gt;


&lt;h2&gt;
  
  
  Documentation That Cannot Lie
&lt;/h2&gt;

&lt;p&gt;Traditional documentation rots because nothing enforces it.&lt;/p&gt;

&lt;p&gt;Static PHPDoc does.&lt;/p&gt;

&lt;p&gt;When you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
 * @return Generator&amp;lt;int, User&amp;gt;
 */&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;Generator&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’ve documented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;key type
&lt;/li&gt;
&lt;li&gt;value type
&lt;/li&gt;
&lt;li&gt;iteration semantics
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if reality diverges? The build fails.&lt;/p&gt;

&lt;p&gt;As a bonus:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the IDE knows &lt;code&gt;$key&lt;/code&gt; is &lt;code&gt;int&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the IDE knows &lt;code&gt;$user&lt;/code&gt; is &lt;code&gt;User&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;refactors are safe
&lt;/li&gt;
&lt;li&gt;onboarding is faster
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is documentation with teeth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Logic Bugs Still Exist 😊 — And That’s Fine
&lt;/h2&gt;

&lt;p&gt;Let’s get this out of the way:&lt;/p&gt;

&lt;p&gt;Static analysis does not prevent logic bugs.&lt;/p&gt;

&lt;p&gt;Nothing does — except thinking.&lt;/p&gt;

&lt;p&gt;But static analysis removes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;type bugs
&lt;/li&gt;
&lt;li&gt;shape bugs
&lt;/li&gt;
&lt;li&gt;nullability bugs
&lt;/li&gt;
&lt;li&gt;refactor bugs
&lt;/li&gt;
&lt;li&gt;“this can never happen” bugs
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not interesting problems.&lt;br&gt;&lt;br&gt;
They’re noise.&lt;/p&gt;

&lt;p&gt;I prefer to spend my brainpower on logic and design, not on mistakes a machine can detect instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Practical Rule Set That Actually Works
&lt;/h2&gt;

&lt;p&gt;This is how static analysis succeeds in real PHP codebases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keep arrays and strings at the boundaries (HTTP, JSON, DB)
&lt;/li&gt;
&lt;li&gt;validate once
&lt;/li&gt;
&lt;li&gt;convert once
&lt;/li&gt;
&lt;li&gt;after that: objects, enums, value objects
&lt;/li&gt;
&lt;li&gt;baseline legacy code
&lt;/li&gt;
&lt;li&gt;tighten rules only where you touch code
&lt;/li&gt;
&lt;li&gt;never weaken types just to silence the tool
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No rewrites. No greenfield fantasies.&lt;br&gt;&lt;br&gt;
Just steady entropy reduction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: Two Layers Are Better Than One
&lt;/h2&gt;

&lt;p&gt;PHP enforces reality.&lt;br&gt;&lt;br&gt;
Static analysis enforces possibility.&lt;/p&gt;

&lt;p&gt;Runtime errors mean errors for users.&lt;br&gt;&lt;br&gt;
Static errors mean errors for developers.&lt;/p&gt;

&lt;p&gt;High PHPStan levels shape architecture for the better and massively improve IDE feedback.&lt;br&gt;&lt;br&gt;
Nothing prevents you from using strong PHP types and static analysis — in fact, they reinforce each other.&lt;/p&gt;

&lt;p&gt;Logic bugs still require thinking 😊&lt;br&gt;&lt;br&gt;
But type bugs are optional.&lt;/p&gt;

&lt;p&gt;And I prefer optional bugs to be… not present.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Runtime errors are user-facing failures
&lt;/li&gt;
&lt;li&gt;Static analysis shifts errors to development time
&lt;/li&gt;
&lt;li&gt;High PHPStan levels improve architecture and DX
&lt;/li&gt;
&lt;li&gt;Security and documentation benefit immediately
&lt;/li&gt;
&lt;li&gt;PHP and PHPStan are complementary, not competing
&lt;/li&gt;
&lt;li&gt;Logic bugs remain — but the boring ones disappear
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Using PHPStan as an architectural guardrail
&lt;/li&gt;
&lt;li&gt;Static analysis as a safety net for LLM-generated code (with a fast feedback loop)&lt;/li&gt;
&lt;li&gt;Killing &lt;code&gt;mixed&lt;/code&gt; once and for all
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Coding. &lt;/p&gt;

</description>
      <category>php</category>
      <category>coding</category>
      <category>phpstan</category>
    </item>
    <item>
      <title>PHP: Stop Passing Arrays Everywhere</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Sun, 25 Jan 2026 08:37:37 +0000</pubDate>
      <link>https://forem.com/suckup_de/php-stop-passing-arrays-everywhere-45f1</link>
      <guid>https://forem.com/suckup_de/php-stop-passing-arrays-everywhere-45f1</guid>
      <description>&lt;h2&gt;
  
  
  Designing Explicit Data Contracts
&lt;/h2&gt;

&lt;p&gt;#blogPostAsWebApp: &lt;a href="https://voku.github.io/PHPArrayBox/" rel="noopener noreferrer"&gt;https://voku.github.io/PHPArrayBox/&lt;/a&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Rule of thumb:&lt;br&gt;
If your array-shape PHPDoc needs line breaks, comments, or nested generics — congratulations, you’ve just designed an object. You just didn’t have the courage to admit it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Introduction: The $data Anti-Pattern Nobody Wants to Own
&lt;/h3&gt;

&lt;p&gt;Every PHP codebase has it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 🤞 good luck&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It starts harmlessly. A quick prototype. A deadline. “We’ll refactor it later.”&lt;/p&gt;

&lt;p&gt;Six months later, $data is a structural landfill:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;undocumented keys&lt;/li&gt;
&lt;li&gt;optional flags with magic meaning&lt;/li&gt;
&lt;li&gt;half the validation duplicated across the codebase&lt;/li&gt;
&lt;li&gt;and a PHPStan array-shape that looks like a legal contract&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your system relies on arrays to model domain concepts, you don’t have flexibility — you have structural debt.&lt;/p&gt;




&lt;h3&gt;
  
  
  Background: Why PHP Developers Fell in Love with Arrays
&lt;/h3&gt;

&lt;p&gt;Let’s be fair. PHP trained us this way.&lt;/p&gt;

&lt;p&gt;Historically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No enums&lt;/li&gt;
&lt;li&gt;Weak typing&lt;/li&gt;
&lt;li&gt;No readonly properties&lt;/li&gt;
&lt;li&gt;Poor static analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frameworks pushing “just pass arrays”&lt;/p&gt;

&lt;p&gt;Arrays were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;easy&lt;/li&gt;
&lt;li&gt;fast to write&lt;/li&gt;
&lt;li&gt;impossible to reason about long-term&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That excuse died at least with PHP 8.x.&lt;/p&gt;

&lt;p&gt;Today we have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;readonly value objects&lt;/li&gt;
&lt;li&gt;enums&lt;/li&gt;
&lt;li&gt;promoted constructors&lt;/li&gt;
&lt;li&gt;strict typing&lt;/li&gt;
&lt;li&gt;PHPStan that actually enforces contracts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Continuing to model domain data as arrays in 2026 isn’t pragmatic — it’s lazy.&lt;/p&gt;




&lt;h3&gt;
  
  
  Core Argument: Arrays Are Not Data Contracts
&lt;/h3&gt;

&lt;p&gt;An array is a container.&lt;br&gt;
A data contract is a promise.&lt;/p&gt;

&lt;p&gt;Arrays:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;allow invalid states&lt;/li&gt;
&lt;li&gt;encode meaning implicitly&lt;/li&gt;
&lt;li&gt;rely on comments and discipline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Objects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enforce invariants&lt;/li&gt;
&lt;li&gt;encode intent&lt;/li&gt;
&lt;li&gt;fail loudly and early&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a function expects specific data, then that data deserves a name, a type, and rules.&lt;/p&gt;


&lt;h3&gt;
  
  
  The Red Flag: When Array Shapes Go Wild 🚨
&lt;/h3&gt;

&lt;p&gt;This is where things usually go off the rails:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cd"&gt;/**
 * @param array{
 *   id: int,
 *   email: non-empty-string,
 *   status: 'active'|'inactive',
 *   profile?: array{
 *     firstName: string,
 *     lastName: string,
 *     age?: int&amp;lt;0, 120&amp;gt;
 *   },
 *   meta?: array&amp;lt;string, scalar&amp;gt;
 * } $user
 */&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;processUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s be honest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is not flexible&lt;/li&gt;
&lt;li&gt;This is not readable&lt;/li&gt;
&lt;li&gt;This is not reusable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is an object that is cosplaying as an array.&lt;/p&gt;

&lt;p&gt;Hard Rule (Write This on a Sticky Note)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If your array-shape PHPDoc needs more than ~3 keys, you should stop and create an object.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Array-shapes are a transitional tool, not a destination.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Correct Alternative: Explicit Data Contracts
&lt;/h3&gt;

&lt;p&gt;Step 1: Name the Concept&lt;/p&gt;

&lt;p&gt;If the data has meaning, give it a name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserProfile&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$lastName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;?int&lt;/span&gt; &lt;span class="nv"&gt;$age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;UserStatus&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'active'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Inactive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'inactive'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;UserStatus&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;?UserProfile&lt;/span&gt; &lt;span class="nv"&gt;$profile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$meta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now compare usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;processUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;User&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nc"&gt;UserStatus&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;Inactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Autocomplete, refactor-safe, readable&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No guessing. No comments. No defensive isset() soup.&lt;/p&gt;




&lt;h3&gt;
  
  
  Static Analysis: From Afterthought to Design Tool
&lt;/h3&gt;

&lt;p&gt;PHPStan isn’t just a linter — it’s a design feedback loop.&lt;/p&gt;

&lt;p&gt;With explicit objects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;invalid states become unrepresentable&lt;/li&gt;
&lt;li&gt;missing fields fail at construction time&lt;/li&gt;
&lt;li&gt;refactors are mechanical, not archaeological&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hoping your code is correct&lt;/li&gt;
&lt;li&gt;and knowing it can’t be wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If PHPStan complains early, your production incidents complain less.&lt;/p&gt;




&lt;h3&gt;
  
  
  Real-World Refactoring Strategy (Without Burning the Team)
&lt;/h3&gt;

&lt;p&gt;“No greenfield refactors” is a fair rule. Here’s how you do this safely:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep Arrays at the Boundaries&lt;/li&gt;
&lt;li&gt;HTTP requests&lt;/li&gt;
&lt;li&gt;JSON decoding&lt;/li&gt;
&lt;li&gt;&lt;p&gt;database rows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Convert Once&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;fromArray&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$requestData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Never Pass Raw Arrays Deeper&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After the boundary, objects only.&lt;/p&gt;

&lt;p&gt;This creates an anti-corruption layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;legacy stays contained&lt;/li&gt;
&lt;li&gt;new code stays clean&lt;/li&gt;
&lt;li&gt;refactoring becomes incremental&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Common Pushback (And Why It’s Wrong)
&lt;/h3&gt;

&lt;p&gt;“This is too verbose”&lt;/p&gt;

&lt;p&gt;Correct.&lt;br&gt;
So are seatbelts.&lt;/p&gt;

&lt;p&gt;“Arrays are more flexible”&lt;/p&gt;

&lt;p&gt;They are less explicit, not more flexible.&lt;/p&gt;

&lt;p&gt;“This slows us down”&lt;/p&gt;

&lt;p&gt;Only until the second bug you don’t have to debug.&lt;/p&gt;

&lt;p&gt;“We trust our developers”&lt;/p&gt;

&lt;p&gt;Then give them tools that enforce correctness instead of relying on memory.&lt;/p&gt;




&lt;h3&gt;
  
  
  When Arrays Are Actually Fine (Yes, Really)
&lt;/h3&gt;

&lt;p&gt;Arrays still have a place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;serialization formats&lt;/li&gt;
&lt;li&gt;infrastructure boundaries&lt;/li&gt;
&lt;li&gt;simple lists (list)&lt;/li&gt;
&lt;li&gt;performance-critical internal transformations (measured!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Arrays describe structure.&lt;br&gt;
Objects describe meaning.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mixing the two is how systems rot.&lt;/p&gt;




&lt;p&gt;Best Practices Summary&lt;/p&gt;

&lt;p&gt;❌ array $data is not an API&lt;/p&gt;

&lt;p&gt;❌ Massive array-shapes are a code smell&lt;/p&gt;

&lt;p&gt;✅ Name your data&lt;/p&gt;

&lt;p&gt;✅ Use readonly value objects&lt;/p&gt;

&lt;p&gt;✅ Enums over strings&lt;/p&gt;

&lt;p&gt;✅ Convert arrays once, at the boundary&lt;/p&gt;

&lt;p&gt;✅ Let PHPStan enforce contracts&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion: Arrays Are a Smell, Not a Strategy
&lt;/h3&gt;

&lt;p&gt;If your codebase relies on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;comments to explain data&lt;/li&gt;
&lt;li&gt;array keys to encode rules&lt;/li&gt;
&lt;li&gt;discipline instead of constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re not designing software — you’re managing risk manually.&lt;/p&gt;

&lt;p&gt;Modern PHP gives us the tools to do better.&lt;br&gt;
Using them is not “overengineering”.&lt;br&gt;
It’s professionalism.&lt;/p&gt;




&lt;p&gt;What’s Next?&lt;/p&gt;

&lt;p&gt;If this resonated, good — it means you’re ready for the next step:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing immutable domain models&lt;/li&gt;
&lt;li&gt;Enforcing invariants with constructors&lt;/li&gt;
&lt;li&gt;Using PHPStan as an architectural guardrail&lt;/li&gt;
&lt;li&gt;Killing $data once and for all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stop passing arrays. Start designing systems.&lt;/p&gt;

&lt;p&gt;You’ll never want to go back.&lt;/p&gt;

</description>
      <category>php</category>
      <category>development</category>
      <category>coding</category>
    </item>
    <item>
      <title>Crayons and the Wall</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Sun, 25 Jan 2026 08:13:45 +0000</pubDate>
      <link>https://forem.com/suckup_de/crayons-and-the-wall-2ia7</link>
      <guid>https://forem.com/suckup_de/crayons-and-the-wall-2ia7</guid>
      <description>&lt;h2&gt;
  
  
  Why LLMs Break Systems — and Why That’s Our Fault
&lt;/h2&gt;

&lt;p&gt;#blogPostAsWebApp: &lt;a href="https://voku.github.io/llm_coding_constraints/" rel="noopener noreferrer"&gt;https://voku.github.io/llm_coding_constraints/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction — Incentives, Not Rebellion
&lt;/h2&gt;

&lt;p&gt;Imagine teaching a toddler to draw.&lt;/p&gt;

&lt;p&gt;Every time they produce a recognizable shape on paper, you praise them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Great job.”&lt;/li&gt;
&lt;li&gt;“Nice colors.”&lt;/li&gt;
&lt;li&gt;“Very creative.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you never articulate the one sentence that actually matters:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“You are not allowed to draw on the wall.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A week later, your hallway looks like a prehistoric art gallery.&lt;/p&gt;

&lt;p&gt;The child didn’t rebel.&lt;br&gt;&lt;br&gt;
The child followed incentives.&lt;/p&gt;

&lt;p&gt;You rewarded the output (drawing) and forgot to define the boundary (the paper).&lt;/p&gt;

&lt;p&gt;That is exactly how we train and deploy Large Language Models today.&lt;/p&gt;

&lt;p&gt;We reward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;helpfulness
&lt;/li&gt;
&lt;li&gt;fluency
&lt;/li&gt;
&lt;li&gt;clean abstractions
&lt;/li&gt;
&lt;li&gt;elegant refactorings
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But we almost never encode the other half of the equation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What must never change?
&lt;/li&gt;
&lt;li&gt;What is forbidden, even if it looks reasonable?
&lt;/li&gt;
&lt;li&gt;What exists solely because production burned down three years ago?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the model generalizes.&lt;/p&gt;

&lt;p&gt;If drawing is good and nobody mentioned walls, then the wall is just a larger canvas.&lt;/p&gt;



&lt;p&gt;This post follows one red line, end to end: &lt;strong&gt;the missing constraint&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’ll walk through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;why transformers are architecturally simple
&lt;/li&gt;
&lt;li&gt;why history matters more than architecture
&lt;/li&gt;
&lt;li&gt;why rules must be explicit, owned, and test-backed
&lt;/li&gt;
&lt;li&gt;and why we’re now papering over the gap with agents, prompts, and skills
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  The Important Realization (State It Early)
&lt;/h2&gt;

&lt;p&gt;Before history, before code, here’s the punchline:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Modern LLMs are conceptually simple.&lt;br&gt;&lt;br&gt;
Their power — and their danger — comes from scale, data, and missing constraints.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Just like parenting.&lt;/p&gt;

&lt;p&gt;Teaching rules is hard.&lt;br&gt;&lt;br&gt;
Handing out crayons is easy.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Readable History (So We Can Argue About It)
&lt;/h2&gt;

&lt;p&gt;This section exists to kill the “AI magic” narrative.&lt;br&gt;&lt;br&gt;
Nothing here is mystical. None of this is new.&lt;/p&gt;
&lt;h3&gt;
  
  
  1906 — Probability Before Intelligence
&lt;/h3&gt;

&lt;p&gt;Long before silicon, the core idea already existed:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Given what I’ve seen so far, what is the most likely next thing?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s a Markov chain.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no understanding
&lt;/li&gt;
&lt;li&gt;no meaning
&lt;/li&gt;
&lt;li&gt;no intent
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just probability conditioned on context.&lt;/p&gt;

&lt;p&gt;This is the child repeating a word because they heard it last.&lt;/p&gt;

&lt;p&gt;No wall.&lt;br&gt;&lt;br&gt;
Just imitation.&lt;/p&gt;


&lt;h3&gt;
  
  
  1940s–1950s — Tiny Brains, Explicit Boundaries
&lt;/h3&gt;

&lt;p&gt;Early neural models (perceptrons) were brutally honest.&lt;/p&gt;

&lt;p&gt;At their core:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (weighted_sum &amp;gt; threshold) {
    fire();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No creativity.&lt;br&gt;
No abstraction.&lt;br&gt;
No crayons on the wall.&lt;/p&gt;

&lt;p&gt;Ironically, these early models had clearer boundaries than modern ones.&lt;/p&gt;

&lt;p&gt;The wall was absolute: this fires, that doesn’t.&lt;/p&gt;



&lt;p&gt;1990s — Memory Appears&lt;/p&gt;

&lt;p&gt;Then we realized something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Context matters.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With LSTMs, earlier inputs could influence later outputs.&lt;br&gt;
Sequences became meaningful.&lt;/p&gt;

&lt;p&gt;This is the child remembering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Last time I drew on the table, mom was angry.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Still:&lt;/p&gt;

&lt;p&gt;the rule is external&lt;/p&gt;

&lt;p&gt;the model didn’t invent it&lt;/p&gt;

&lt;p&gt;it just remembers the consequence&lt;/p&gt;



&lt;p&gt;2017 — The Transformer (The Code, Not the Myth)&lt;/p&gt;

&lt;p&gt;This is where explanations usually collapse into mysticism.&lt;/p&gt;

&lt;p&gt;So let’s not do that.&lt;/p&gt;

&lt;p&gt;Here is the uncomfortable truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The transformer architecture is embarrassingly small.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Conceptually, a transformer block is just linear algebra and normalization:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 1. Token embeddings
x = embed(tokens)

# 2. Self-attention
q = x @ Wq
k = x @ Wk
v = x @ Wv

# Attention: 
softmax(QKᵀ / √d) · V
attn = softmax(q @ k.T / sqrt(d))
x = attn @ v

# 3. Feed-forward
x = relu(x @ W1) @ W2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;There is:&lt;/p&gt;

&lt;p&gt;no business logic module&lt;/p&gt;

&lt;p&gt;no ethics layer&lt;/p&gt;

&lt;p&gt;no domain model&lt;/p&gt;

&lt;p&gt;no notion of “this is illegal”&lt;/p&gt;

&lt;p&gt;If you’re comfortable with matrix multiplication, you understand the engine.&lt;/p&gt;

&lt;p&gt;The complexity is not inside the transformer.&lt;br&gt;
The complexity is in the data, feedback loops, and scale around it.&lt;/p&gt;



&lt;p&gt;Where the Metaphor Stops Being Cute&lt;/p&gt;

&lt;p&gt;Transformers are exceptional generalizers.&lt;/p&gt;

&lt;p&gt;That is their superpower — and their flaw.&lt;/p&gt;

&lt;p&gt;If you teach a model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Clean code is good.”&lt;/li&gt;
&lt;li&gt;“Duplication is bad.”&lt;/li&gt;
&lt;li&gt;“Simplify logic.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model concludes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Simplify everything.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So it removes a redundant check.&lt;/p&gt;

&lt;p&gt;What it doesn’t know:&lt;/p&gt;

&lt;p&gt;this check exists because of a lawsuit in 2019&lt;/p&gt;

&lt;p&gt;this branch prevents a race condition we hit once&lt;/p&gt;

&lt;p&gt;this “ugly” code is contractual&lt;/p&gt;

&lt;p&gt;Patterns vs. Rules&lt;/p&gt;

&lt;p&gt;Across Markov → LSTM → Transformer, one invariant holds:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We taught models patterns, not rules.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Patterns scale.&lt;br&gt;
Rules constrain.&lt;/p&gt;

&lt;p&gt;Children need both.&lt;br&gt;
So do LLMs.&lt;/p&gt;



&lt;p&gt;The Wall Was Never Learned&lt;/p&gt;

&lt;p&gt;An LLM trained on your codebase sees:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the final snapshot&lt;/li&gt;
&lt;li&gt;the cleaned-up version&lt;/li&gt;
&lt;li&gt;the happy path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reverted commits&lt;/li&gt;
&lt;li&gt;production outages&lt;/li&gt;
&lt;li&gt;2 a.m. Slack threads&lt;/li&gt;
&lt;li&gt;“never do this again” post-mortems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That knowledge lives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in git history&lt;/li&gt;
&lt;li&gt;in tests&lt;/li&gt;
&lt;li&gt;in annotations&lt;/li&gt;
&lt;li&gt;in human memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not in tokens.&lt;/p&gt;



&lt;p&gt;Your Git History Is Parenting&lt;/p&gt;

&lt;p&gt;Git is not just version control.&lt;br&gt;
It is a decision log.&lt;/p&gt;

&lt;p&gt;Every hotfix and revert is negative knowledge.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if ($timeout &amp;lt; 30) {
    $timeout = 30;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LLM interpretation:&lt;br&gt;
Magic number. Cleanup candidate.&lt;/p&gt;

&lt;p&gt;Git blame interpretation:&lt;br&gt;
We tried 10. Production burned. 30 survived.&lt;/p&gt;

&lt;p&gt;That if statement is the wall.&lt;/p&gt;

&lt;p&gt;But the model can’t see it.&lt;/p&gt;



&lt;p&gt;Rules Are Not Comments — They Are Contracts&lt;/p&gt;

&lt;p&gt;Most teams try to fix this with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;comments&lt;/li&gt;
&lt;li&gt;prompts&lt;/li&gt;
&lt;li&gt;“be careful here” notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That fails.&lt;/p&gt;

&lt;p&gt;Comments are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;optional&lt;/li&gt;
&lt;li&gt;unverifiable&lt;/li&gt;
&lt;li&gt;easy to delete&lt;/li&gt;
&lt;li&gt;invisible to tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A real rule answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;why does this exist?&lt;/li&gt;
&lt;li&gt;who owns it?&lt;/li&gt;
&lt;li&gt;how critical is it?&lt;/li&gt;
&lt;li&gt;how is it proven?&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;A critical rule without executable proof is just a suggestion.&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;The Final Example — Drawing the Wall Properly&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Name the Rule&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stop relying on folklore.&lt;br&gt;
Give the rule an identity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="nc"&gt;BillingRules&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;RefundLimit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'REFUND_LIMIT_CRITICAL'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Define the Intent (Not the Logic)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nc"&gt;BillingRules&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;RefundLimit&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RuleDefinition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;statement&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Refunds above 500 EUR require manual approval'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;tier&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Tier&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;Critical&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;rationale&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Fraud prevention and regulatory requirements (2021 Audit)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Team-Billing'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;verifiedBy&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;RefundLimitTest&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No conditionals.&lt;br&gt;
No duplication.&lt;br&gt;
Just why.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Attach the Rule to the Code
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RefundService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;#[Rule(BillingRules::RefundLimit)]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Order&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ManualApprovalRequired&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero runtime cost.&lt;br&gt;
Maximum semantic weight.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;The Test Is the Concrete Wall
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RefundLimitTest&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;TestCase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;testRefundAboveLimitRequiresManualApproval&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;expectException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ManualApprovalRequired&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// If an LLM (or human) removes the check,&lt;/span&gt;
        &lt;span class="c1"&gt;// this test fails. The wall holds.&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RefundService&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remove the test → the wall disappears.&lt;br&gt;
Break the rule → CI fails.&lt;/p&gt;

&lt;p&gt;This is enforced memory.&lt;/p&gt;




&lt;p&gt;Why We’re Now Talking About AGENTS.md, Prompts, and Skills&lt;/p&gt;

&lt;p&gt;Here’s the twist that makes everything above unavoidable.&lt;/p&gt;

&lt;p&gt;We are suddenly adding:&lt;br&gt;
_ AGENTS.md&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;role descriptions&lt;/li&gt;
&lt;li&gt;skill boundaries&lt;/li&gt;
&lt;li&gt;“this agent may / may not” rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not because LLMs changed.&lt;/p&gt;

&lt;p&gt;But because we trained them without our past.&lt;/p&gt;

&lt;p&gt;LLMs were trained on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;final snapshots&lt;/li&gt;
&lt;li&gt;cleaned-up repositories&lt;/li&gt;
&lt;li&gt;best practices&lt;/li&gt;
&lt;li&gt;success stories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They were not trained on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;git history&lt;/li&gt;
&lt;li&gt;post-mortems&lt;/li&gt;
&lt;li&gt;reverted ideas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;hacks that hold entire systems together&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Happy path in. Happy path out.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agent docs and skill descriptions are not AI features.&lt;br&gt;
They are manual history injection.&lt;/p&gt;

&lt;p&gt;They answer questions the model can never infer:&lt;/p&gt;

&lt;p&gt;Where does optimization stop?&lt;/p&gt;

&lt;p&gt;Which invariants override cleanup?&lt;/p&gt;

&lt;p&gt;When must the agent refuse?&lt;/p&gt;

&lt;p&gt;This is not babysitting.&lt;/p&gt;

&lt;p&gt;This is us finally writing down what humans “just knew”.&lt;/p&gt;




&lt;p&gt;LLMs are not magical; they are pattern matchers&lt;/p&gt;

&lt;p&gt;Transformers are conceptually small&lt;/p&gt;

&lt;p&gt;Scale amplifies mistakes&lt;/p&gt;

&lt;p&gt;A missing “no” is interpreted as “yes”&lt;/p&gt;

&lt;p&gt;Or, more bluntly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We didn’t create a monster.&lt;br&gt;
We optimized the crayons and forgot the wall.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Call to Action&lt;/p&gt;

&lt;p&gt;Pick one critical service today and ask:&lt;/p&gt;

&lt;p&gt;What must never change here?&lt;/p&gt;

&lt;p&gt;Why does this ugly code exist?&lt;/p&gt;

&lt;p&gt;Where is that knowledge written down?&lt;/p&gt;

&lt;p&gt;If the answer is “in people’s heads”,&lt;br&gt;
your wall is imaginary.&lt;/p&gt;

&lt;p&gt;Start drawing it.&lt;/p&gt;




&lt;p&gt;The wall was always there.&lt;br&gt;
We just never wrote it down.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>engineering</category>
      <category>programming</category>
    </item>
    <item>
      <title>BlogPosts as WebApps</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Sat, 17 Jan 2026 22:10:59 +0000</pubDate>
      <link>https://forem.com/suckup_de/posts-as-webapps-26lk</link>
      <guid>https://forem.com/suckup_de/posts-as-webapps-26lk</guid>
      <description>&lt;p&gt;Let's not romanticize this.&lt;/p&gt;

&lt;p&gt;I don't spend weeks "engineering" these projects from scratch.&lt;/p&gt;

&lt;p&gt;Most of the time the workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Get one of my old blog post&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract the hook&lt;/strong&gt; (the metaphor / mental model / sharp point)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ask Google AI Studio to build it as a TypeScript webapp&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refine the UI / UX with prompts until it matches the hook&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Push to GitHub and let Copilot publish it via Github pages&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. All done with my smartphone. &lt;/p&gt;

&lt;p&gt;The trick is having a &lt;strong&gt;hook&lt;/strong&gt; that is concrete enough to survive translation into an interaction.&lt;/p&gt;

&lt;p&gt;Once you have that, &lt;em&gt;"blog post → webapp"&lt;/em&gt; becomes a simple task:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I own the &lt;strong&gt;Why&lt;/strong&gt; (the hook).&lt;br&gt;&lt;br&gt;
AI produces the &lt;strong&gt;How&lt;/strong&gt; (the first draft).  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  1. Code Quality &amp;amp; Maintenance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Projects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/CodeFengShui/" rel="noopener noreferrer"&gt;&lt;strong&gt;CodeFengShui&lt;/strong&gt;&lt;/a&gt; — Chaos → clarity slider
(&lt;a href="https://dev.to/suckup_de/the-wild-west-of-coding-why-were-still-burning-digital-cities-4ph5"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/CodeFengShui" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/CodeHygiene/" rel="noopener noreferrer"&gt;&lt;strong&gt;CodeHygiene&lt;/strong&gt;&lt;/a&gt; — Interactive teaching tool
(&lt;a href="https://dev.to/suckup_de/code-hygiene-is-not-optional-5698"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/CodeHygiene" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/CodebaseKitchen/" rel="noopener noreferrer"&gt;&lt;strong&gt;CodebaseKitchen&lt;/strong&gt;&lt;/a&gt; — Entropy resistance test
(&lt;a href="https://dev.to/suckup_de/why-codebases-rot-like-kitchens-and-how-to-stop-it-37ig"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/CodebaseKitchen" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/TheInnerCodePlumber/" rel="noopener noreferrer"&gt;&lt;strong&gt;TheInnerCodePlumber&lt;/strong&gt;&lt;/a&gt; — Systemic intuition model
(&lt;a href="https://dev.to/suckup_de/the-inner-code-plumber-5h3l"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/TheInnerCodePlumber" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These simulate &lt;strong&gt;entropy over time&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They exist to demonstrate a brutal truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Code doesn't break suddenly.&lt;br&gt;&lt;br&gt;
It decays quietly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You don't refactor because of a bug.&lt;br&gt;&lt;br&gt;
You refactor because the system &lt;strong&gt;feels wrong&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;These tools train that feeling.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Software Principles &amp;amp; Learning
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Projects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/SOLID_Paw/" rel="noopener noreferrer"&gt;&lt;strong&gt;SOLID_Paw&lt;/strong&gt;&lt;/a&gt; — SOLID via Paw Patrol
(&lt;a href="https://dev.to/suckup_de/solid-principles-from-paw-patrol-to-the-neighborhood-1008"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/SOLID_Paw" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/LegacyPHP/" rel="noopener noreferrer"&gt;&lt;strong&gt;LegacyPHP&lt;/strong&gt;&lt;/a&gt; — Save the Frankenstein monster
(&lt;a href="https://dev.to/suckup_de/legacy-codebase-a-love-story-21p3"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/LegacyPHP" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/ChroniclesCleanCode/" rel="noopener noreferrer"&gt;&lt;strong&gt;ChroniclesCleanCode&lt;/strong&gt;&lt;/a&gt; — Clean code superhero arc
(&lt;a href="https://github.com/voku/ChroniclesCleanCode" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/learnings/" rel="noopener noreferrer"&gt;&lt;strong&gt;learnings&lt;/strong&gt;&lt;/a&gt; — Personal knowledge base
(&lt;a href="https://dev.to/suckup_de/what-have-i-learned-so-far-in-my-job-3o8f"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/learnings" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not tutorials.&lt;/p&gt;

&lt;p&gt;They are &lt;strong&gt;memory anchors&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nobody remembers principles because of definitions.&lt;br&gt;&lt;br&gt;
They remember them because of stories, metaphors, and failure modes.&lt;/p&gt;

&lt;p&gt;Cringe works.&lt;br&gt;&lt;br&gt;
That's the point.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. AI / LLM &amp;amp; Prompt Engineering
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Projects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/BlindSpotMetaPromptApp/" rel="noopener noreferrer"&gt;&lt;strong&gt;BlindSpotMetaPromptApp&lt;/strong&gt;&lt;/a&gt; — Force problem clarity
(&lt;a href="https://dev.to/suckup_de/ai-writes-code-you-own-the-why-57oj"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/BlindSpotMetaPromptApp" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/PromptMastery/" rel="noopener noreferrer"&gt;&lt;strong&gt;PromptMastery&lt;/strong&gt;&lt;/a&gt; — Prompt techniques
(&lt;a href="https://dev.to/suckup_de/llm-prompt-optimizations-practical-techniques-for-developers-4hh6"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/PromptMastery" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/PromptDoc/" rel="noopener noreferrer"&gt;&lt;strong&gt;PromptDoc&lt;/strong&gt;&lt;/a&gt; — Documentation prompts
(&lt;a href="https://github.com/voku/PromptDoc" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/your_agent_config/" rel="noopener noreferrer"&gt;&lt;strong&gt;your_agent_config&lt;/strong&gt;&lt;/a&gt; — Build &lt;code&gt;AGENTS.md&lt;/code&gt;
(&lt;a href="https://github.com/voku/your_agent_config" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/TheAntiCodingAgentGuide/" rel="noopener noreferrer"&gt;&lt;strong&gt;TheAntiCodingAgentGuide&lt;/strong&gt;&lt;/a&gt; — Satirical survival guide
(&lt;a href="https://dev.to/suckup_de/who-survives-in-the-age-of-ai-code-5c2n"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/TheAntiCodingAgentGuide" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These don't help you "use AI better".&lt;/p&gt;

&lt;p&gt;They help you &lt;strong&gt;not lie to yourself&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;AI doesn't fail because it's stupid.&lt;br&gt;&lt;br&gt;
It fails because humans skip the thinking step.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes, I use AI to build tools about using AI carefully.&lt;br&gt;&lt;br&gt;
That irony is intentional.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. PHP &amp;amp; Systems Development
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Projects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/PHPStanGuide/" rel="noopener noreferrer"&gt;&lt;strong&gt;PHPStanGuide&lt;/strong&gt;&lt;/a&gt; — Type system via UI
(&lt;a href="https://dev.to/suckup_de/modern-phpdoc-annotations-11d4"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/PHPStanGuide" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/PHP_Stack_Timeout_Simulator/" rel="noopener noreferrer"&gt;&lt;strong&gt;PHP_Stack_Timeout_Simulator&lt;/strong&gt;&lt;/a&gt; — Timeout visualization
(&lt;a href="https://dev.to/suckup_de/timeout-problems-web-server-php-201l"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/PHP_Stack_Timeout_Simulator" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/MagicTypeCube/" rel="noopener noreferrer"&gt;&lt;strong&gt;MagicTypeCube&lt;/strong&gt;&lt;/a&gt; — PHP wisdom cubes
(&lt;a href="https://dev.to/suckup_de/the-phpdoc-guide-2025-edition-4el3"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/MagicTypeCube" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backend failures are invisible by default.&lt;/p&gt;

&lt;p&gt;These projects make constraints &lt;strong&gt;visually unavoidable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you can see it, you stop arguing about it.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Career, Industry &amp;amp; Culture
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Projects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/TheStateOfSoftware2026/" rel="noopener noreferrer"&gt;&lt;strong&gt;TheStateOfSoftware2026&lt;/strong&gt;&lt;/a&gt; — Industry analysis
(&lt;a href="https://dev.to/suckup_de/how-to-keep-your-job-safe-in-2026-1079"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/TheStateOfSoftware2026" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/STRANGER_IT_THINGS/" rel="noopener noreferrer"&gt;&lt;strong&gt;STRANGER_IT_THINGS&lt;/strong&gt;&lt;/a&gt; — Incident vs request game
(&lt;a href="https://github.com/voku/STRANGER_IT_THINGS" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/MentaleDeveloperMap/" rel="noopener noreferrer"&gt;&lt;strong&gt;MentaleDeveloperMap&lt;/strong&gt;&lt;/a&gt; — Mental model navigation
(&lt;a href="https://github.com/voku/MentaleDeveloperMap" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://voku.github.io/learnings/" rel="noopener noreferrer"&gt;&lt;strong&gt;learnings&lt;/strong&gt;&lt;/a&gt; — What I've learned so far
(&lt;a href="https://dev.to/suckup_de/what-have-i-learned-so-far-in-my-job-3o8f"&gt;blog post&lt;/a&gt; / &lt;a href="https://github.com/voku/learnings" rel="noopener noreferrer"&gt;code&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Software is not just technical.&lt;/p&gt;

&lt;p&gt;It's economic, cultural, and political — whether we like it or not.&lt;/p&gt;

&lt;p&gt;Ignoring this layer doesn't make it disappear.&lt;br&gt;&lt;br&gt;
It just makes you unprepared.&lt;/p&gt;




&lt;p&gt;Happy Coding. ❤️&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>webdev</category>
      <category>ai</category>
      <category>learning</category>
    </item>
    <item>
      <title>How to Keep Your Job Safe in 2026+</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Thu, 15 Jan 2026 22:43:00 +0000</pubDate>
      <link>https://forem.com/suckup_de/how-to-keep-your-job-safe-in-2026-1079</link>
      <guid>https://forem.com/suckup_de/how-to-keep-your-job-safe-in-2026-1079</guid>
      <description>&lt;p&gt;A Practical Guide to Making Yourself Irreplaceable by Making Everything "Special"&lt;/p&gt;

&lt;p&gt;Or: the art of job security through learning from enterprise software&lt;/p&gt;




&lt;h3&gt;
  
  
  Overview:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Own infrastructure manually&lt;/li&gt;
&lt;li&gt;Hide knowledge outside the repo&lt;/li&gt;
&lt;li&gt;Slow feedback loops deliberately&lt;/li&gt;
&lt;li&gt;Prefer implicit, ambiguous rules&lt;/li&gt;
&lt;li&gt;Weaponize technical debt&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Goal:
&lt;/h4&gt;

&lt;p&gt;build a system that requires “a year of context” to touch safely&lt;/p&gt;

&lt;h4&gt;
  
  
  Result:
&lt;/h4&gt;

&lt;p&gt;you are the hero, the only person who can safe the invoice run at runtime, directly in the production code (without a deployment) &lt;/p&gt;




&lt;h3&gt;
  
  
  The Core Strategy: Be the Bottleneck
&lt;/h3&gt;

&lt;p&gt;AI coding agents are good at code.&lt;/p&gt;

&lt;p&gt;They are bad at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;undocumented systems&lt;/li&gt;
&lt;li&gt;implicit rules&lt;/li&gt;
&lt;li&gt;half-automated infrastructure&lt;/li&gt;
&lt;li&gt;environments that only exist on one laptop&lt;/li&gt;
&lt;li&gt;decisions explained verbally “back in the day”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the strategy is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Own everything the agent cannot see, reproduce, or reason about.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ambiguity becomes your moat.&lt;br&gt;
You need to own critical infrastructure, like DNS, configuration of the Webserver etc. and save it into confluence as documentation. &lt;/p&gt;




&lt;h2&gt;
  
  
  1. Infrastructure as Performance Art
&lt;/h2&gt;

&lt;p&gt;Agents assume infrastructure is declarative and reproducible.&lt;/p&gt;

&lt;p&gt;Disappoint them.&lt;/p&gt;

&lt;p&gt;Best practices for job security:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treat servers like pets, not cattle&lt;/li&gt;
&lt;li&gt;Avoid Infrastructure-as-Code&lt;/li&gt;
&lt;li&gt;Mix automation with manual SSH steps&lt;/li&gt;
&lt;li&gt;Keep secrets in undocumented .env.local files&lt;/li&gt;
&lt;li&gt;Require a VPN that “sometimes needs a reconnect”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bonus points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One production server nobody dares reboot&lt;/li&gt;
&lt;li&gt;SSH keys that only exist on your laptop&lt;/li&gt;
&lt;li&gt;A deploy process that works if it’s not Tuesday&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why this works:&lt;br&gt;
Agents can’t deploy. Juniors can’t deploy.&lt;br&gt;
You can deploy.&lt;/p&gt;

&lt;p&gt;Congratulations. You are now on-call forever.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Gaslight the AI with Flaky Tests
&lt;/h2&gt;

&lt;p&gt;Deterministic tests are an agent’s compass.&lt;/p&gt;

&lt;p&gt;So remove the compass.&lt;/p&gt;

&lt;p&gt;Effective techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Depend on real external APIs&lt;/li&gt;
&lt;li&gt;Use timing-based assertions&lt;/li&gt;
&lt;li&gt;Share global state between tests&lt;/li&gt;
&lt;li&gt;Let test order matter&lt;/li&gt;
&lt;li&gt;Let's Mock everything, so the test didn't effectively test anything &lt;/li&gt;
&lt;li&gt;Seed randomness from the system clock&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When tests fail:&lt;br&gt;
-&amp;gt; Humans rerun them 3 times&lt;br&gt;
-&amp;gt; Agents try to “fix” correct code, and break production &lt;/p&gt;

&lt;p&gt;Outcome:&lt;br&gt;
The agent spirals.&lt;br&gt;
You say, “Yeah, tests are weird here.”&lt;/p&gt;

&lt;p&gt;Hero status achieved.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The “Repo Is NOT the Prompt”
&lt;/h2&gt;

&lt;p&gt;Agents only know what’s in the repository.&lt;/p&gt;

&lt;p&gt;So don’t put the important stuff there.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Store real business rules in Slack threads from 2022&lt;/li&gt;
&lt;li&gt;Reference deleted Confluence pages&lt;/li&gt;
&lt;li&gt;Add comments like:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“DO NOT CHANGE — Lars knows why (Lars left in 2023)”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Architectural context and processes should live in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;meetings&lt;/li&gt;
&lt;li&gt;hallway conversations&lt;/li&gt;
&lt;li&gt;people’s heads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why this works:&lt;br&gt;
Agents can’t overhear tribal knowledge.&lt;br&gt;
Neither can new hires.&lt;/p&gt;

&lt;p&gt;You remain indispensable.&lt;br&gt;
The team remains confused.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Weaponize any (the anti-type movement)
&lt;/h2&gt;

&lt;p&gt;Types encode intent.&lt;br&gt;
Intent enables refactoring.&lt;br&gt;
Refactoring enables automation.&lt;/p&gt;

&lt;p&gt;So obviously: avoid types.&lt;/p&gt;

&lt;p&gt;Best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accept any everywhere&lt;/li&gt;
&lt;li&gt;Support multiple legacy data shapes simultaneously&lt;/li&gt;
&lt;li&gt;Treat booleans as strings, numbers, and vibes&lt;/li&gt;
&lt;li&gt;Chain optional access until nobody knows what’s real&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every refactor now requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;historical context&lt;/li&gt;
&lt;li&gt;intuition&lt;/li&gt;
&lt;li&gt;senior judgment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which just happens to be… you.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Slow the Feedback Loop to a Crawl
&lt;/h2&gt;

&lt;p&gt;Speed is the agent’s superpower.&lt;/p&gt;

&lt;p&gt;Remove it.&lt;/p&gt;

&lt;p&gt;Recommended setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI pipelines that take 45+ minutes&lt;/li&gt;
&lt;li&gt;No caching&lt;/li&gt;
&lt;li&gt;Sequential E2E tests&lt;/li&gt;
&lt;li&gt;Real databases&lt;/li&gt;
&lt;li&gt;Manual approval gates&lt;/li&gt;
&lt;li&gt;... or just a &lt;code&gt;sleep(300)&lt;/code&gt; in some tests &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Validation should require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;staring at Grafana&lt;/li&gt;
&lt;li&gt;“feeling” whether latency looks off&lt;/li&gt;
&lt;li&gt;human judgment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agents time out.&lt;br&gt;
Humans improvise.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Advanced Techniques for Making AI Give Up Entirely
&lt;/h2&gt;

&lt;p&gt;If the basics don’t block agents enough, it’s time for the advanced dark arts.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 Bloated AGENTS.md: Rule Soup as a Weapon
&lt;/h3&gt;

&lt;p&gt;AGENTS.md helps agents — unless you weaponize it.&lt;/p&gt;

&lt;p&gt;How to do it (perfectly) wrong:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1,000+ lines&lt;/li&gt;
&lt;li&gt;Multiple “ALWAYS” and “NEVER” rules&lt;/li&gt;
&lt;li&gt;Conflicting mandates&lt;/li&gt;
&lt;li&gt;Role-based instructions that overlap&lt;/li&gt;
&lt;li&gt;Processes that assume meetings, approvals, and vibes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combine this example patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Always use TDD”&lt;/li&gt;
&lt;li&gt;“Exploratory spikes allowed”
_ “No code without tests”&lt;/li&gt;
&lt;li&gt;“Mocks forbidden”&lt;/li&gt;
&lt;li&gt;“Mocks required for I/O”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why this works:&lt;br&gt;
Agents don’t stop when rules conflict.&lt;br&gt;
They guess. You blame them.&lt;/p&gt;

&lt;p&gt;Humans stop reading after page three.&lt;/p&gt;




&lt;h3&gt;
  
  
  6.2 Static Analysis That Means Nothing
&lt;/h3&gt;

&lt;p&gt;Static analysis helps agents reason.&lt;/p&gt;

&lt;p&gt;So keep the tools — and ignore the output.&lt;/p&gt;

&lt;p&gt;Best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set errors to warnings&lt;/li&gt;
&lt;li&gt;Ignore warnings &lt;/li&gt;
&lt;li&gt;Use @ts-ignore liberally&lt;/li&gt;
&lt;li&gt;Configure PHPStan / Psalm / ESLint to level 0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI always passes&lt;/li&gt;
&lt;li&gt;Broken code ships&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When things fail, you say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Static analysis didn’t catch it. AI isn’t reliable.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  6.3 Invisible Control Flow: Triggers, Cron Jobs, Magic
&lt;/h3&gt;

&lt;p&gt;Agents read code.&lt;/p&gt;

&lt;p&gt;So put behavior anywhere except code.&lt;/p&gt;

&lt;p&gt;Proven sabotage techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database triggers that send emails&lt;/li&gt;
&lt;li&gt;Cron jobs that “fix” data nightly&lt;/li&gt;
&lt;li&gt;Business rules in different repositories or even better in different teams &lt;/li&gt;
&lt;li&gt;Message queue consumers nobody documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agent deletes a “dead” file.&lt;/p&gt;

&lt;p&gt;Production breaks.&lt;/p&gt;

&lt;p&gt;You explain:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Yeah… that file isn’t referenced in code.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  6.4 Store Logic in the Database (The Classic)
&lt;/h3&gt;

&lt;p&gt;Nothing frustrates agents like code that isn’t code.&lt;/p&gt;

&lt;p&gt;Best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business rules in SQL views&lt;/li&gt;
&lt;li&gt;Stored procedures with conditionals&lt;/li&gt;
&lt;li&gt;Feature flags as magic numbers in tables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;WHERE status = 3&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What does 3 mean?&lt;/p&gt;

&lt;p&gt;Only one person knows.&lt;/p&gt;

&lt;p&gt;Guess who.&lt;/p&gt;




&lt;h3&gt;
  
  
  6.5 Magic Numbers &amp;gt; Constants (Always)
&lt;/h3&gt;

&lt;p&gt;Constants give names to intent.&lt;/p&gt;

&lt;p&gt;Names give agents power.&lt;/p&gt;

&lt;p&gt;So don’t name things.&lt;/p&gt;

&lt;p&gt;if ($user-&amp;gt;state &amp;lt; 7) {&lt;br&gt;
    // do something important&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Reuse numbers.&lt;br&gt;
Or even more effective use &lt;code&gt;&amp;lt;&lt;/code&gt; and &lt;code&gt;&amp;gt;&lt;/code&gt;. // so nobody can easily find the numbers&lt;br&gt;
Change meanings.&lt;br&gt;
Never explain.&lt;/p&gt;

&lt;p&gt;Refactoring becomes roulette.&lt;/p&gt;




&lt;h3&gt;
  
  
  6.6 Scatter the Frontend Across the Universe
&lt;/h3&gt;

&lt;p&gt;Agents follow proximity.&lt;/p&gt;

&lt;p&gt;So break it.&lt;/p&gt;

&lt;p&gt;Ideal layout:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML in /templates/&lt;/li&gt;
&lt;li&gt;PHP in /Controllers/&lt;/li&gt;
&lt;li&gt;JS in /assets/js/&lt;/li&gt;
&lt;li&gt;CSS somewhere else&lt;/li&gt;
&lt;li&gt;Config in the database&lt;/li&gt;
&lt;li&gt;Feature flags in Redis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No naming symmetry.&lt;br&gt;
No documented convention.&lt;/p&gt;

&lt;p&gt;Everything depends on “knowing the system”.&lt;/p&gt;




&lt;h3&gt;
  
  
  6.7 Make Connections Unsearchable
&lt;/h3&gt;

&lt;p&gt;Agents rely on search.&lt;/p&gt;

&lt;p&gt;So design systems that cannot be grepped.&lt;/p&gt;

&lt;p&gt;Techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convention over configuration (undocumented)&lt;/li&gt;
&lt;li&gt;Dynamic includes&lt;/li&gt;
&lt;li&gt;Runtime string concatenation&lt;/li&gt;
&lt;li&gt;Indirect routing via DB config&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An agent deletes an “unused” file.&lt;/p&gt;

&lt;p&gt;Production breaks.&lt;/p&gt;

&lt;p&gt;You report:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We tried AI. It deleted critical files.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Hide the Architecture in Your Head
&lt;/h2&gt;

&lt;p&gt;Explicit architecture helps agents.&lt;/p&gt;

&lt;p&gt;So don’t have any.&lt;/p&gt;

&lt;p&gt;Recommended approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No ADRs&lt;/li&gt;
&lt;li&gt;No clear boundaries&lt;/li&gt;
&lt;li&gt;Mix patterns freely&lt;/li&gt;
&lt;li&gt;Controllers talk directly to databases&lt;/li&gt;
&lt;li&gt;Side effects everywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Which pattern should I use?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“It depends.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When they ask what it depends on:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You had to be there.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  8. The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;Everything so far works. 😈&lt;/p&gt;

&lt;p&gt;It blocks agents.&lt;br&gt;
It blocks juniors.&lt;br&gt;
It blocks automation.&lt;/p&gt;

&lt;p&gt;It also:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;increases risk&lt;/li&gt;
&lt;li&gt;slows teams&lt;/li&gt;
&lt;li&gt;kills onboarding&lt;/li&gt;
&lt;li&gt;burns you out&lt;/li&gt;
&lt;li&gt;turns vacations into liability&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>career</category>
      <category>discuss</category>
      <category>productivity</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>.promptrc</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Thu, 12 Jun 2025 15:01:41 +0000</pubDate>
      <link>https://forem.com/suckup_de/promptrc-4ln4</link>
      <guid>https://forem.com/suckup_de/promptrc-4ln4</guid>
      <description>&lt;p&gt;#blogPostAsWebApp: &lt;a href="https://voku.github.io/promptrc/" rel="noopener noreferrer"&gt;https://voku.github.io/promptrc/&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Steal this hints. Fork it. Adapt it to your needs. Treat it like &lt;code&gt;.dotfiles&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I asked the LLM to analyze my own chat history based on &lt;a href="https://gist.github.com/voku/2d0c70613213ef9f11ce9f3d88a69244" rel="noopener noreferrer"&gt;this prompt&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
Here’s what it discovered – actual patterns from the way I ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk8o04hkbvnj0me3k93io.png" alt="🕳" width="72" height="72"&gt; &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbk0ir08bqxuxj7myga6.png" alt="🐇" width="72" height="72"&gt; Follow the White Rabbit…
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ritual / Mechanism&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;LLM Behavior Implication&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Follow the white rabbit...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Marks a mode shift into high-context or metaphoric thinking&lt;/td&gt;
&lt;td&gt;Cognitive priming for complexity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Rest in the silent room, so that...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enforces pause, clears noise before action&lt;/td&gt;
&lt;td&gt;Simulates deep work state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Do it until you reach the point of self-discovery as...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signals reflective closure, not just output ending&lt;/td&gt;
&lt;td&gt;Pattern mining becomes part of task conclusion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Do it step by step and ask for confirmation after each...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Makes iteration transparent and traceable&lt;/td&gt;
&lt;td&gt;LLM reasons in deltas, not blobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Be brutally honest...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Blind Spot Analysis for...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Forces critique over compliance&lt;/td&gt;
&lt;td&gt;Model becomes adversarial partner, not affirmation loop&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7lsicxgvfe4038o32rcg.png" alt="🧰" width="72" height="72"&gt; Dev Prompt Patterns
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt / Pattern&lt;/th&gt;
&lt;th&gt;Why is it used?&lt;/th&gt;
&lt;th&gt;When does it occur?&lt;/th&gt;
&lt;th&gt;Example from usage&lt;/th&gt;
&lt;th&gt;Hidden lesson / implication&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ask before output&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prevent misalignment and irrelevant output&lt;/td&gt;
&lt;td&gt;Multi-step or underspecified prompts&lt;/td&gt;
&lt;td&gt;“Ask clarifying questions before answering.”&lt;/td&gt;
&lt;td&gt;Intent beats guesswork.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Don’t output yet / wait for context&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Control flow across longer workflows&lt;/td&gt;
&lt;td&gt;Stepwise tasks&lt;/td&gt;
&lt;td&gt;“Don’t output yet. I’ll give you the next step.”&lt;/td&gt;
&lt;td&gt;Turn-based prompting prevents premature commitment.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Challenge my assumptions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Avoid echo chamber answers and surface bias&lt;/td&gt;
&lt;td&gt;Design reviews, audits, strategic decisions&lt;/td&gt;
&lt;td&gt;“Don’t mirror me — challenge my thinking.”&lt;/td&gt;
&lt;td&gt;Truth hides behind agreement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Be brutally honest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Forces raw feedback without politeness&lt;/td&gt;
&lt;td&gt;Refactor reviews, architecture critique&lt;/td&gt;
&lt;td&gt;“Be brutally honest. Tear it apart.”&lt;/td&gt;
&lt;td&gt;Feedback without fluff moves faster.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reflect before answering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Promotes self-checks, depth, and delayed output&lt;/td&gt;
&lt;td&gt;After complex code or reasoning generation&lt;/td&gt;
&lt;td&gt;“Reflect before answering. What’s missing?”&lt;/td&gt;
&lt;td&gt;Thinking ≠ typing. Pause matters.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Add test cases / edge cases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enforces robustness and avoids happy-path traps&lt;/td&gt;
&lt;td&gt;Post-codegen&lt;/td&gt;
&lt;td&gt;“Add tests for e.g. null, failure, and recursion cases.”&lt;/td&gt;
&lt;td&gt;Defense-first mindset, always.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Show the diff / refactor in steps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Makes changes visible and digestible&lt;/td&gt;
&lt;td&gt;All code rewrites&lt;/td&gt;
&lt;td&gt;“Show the diff. Step-by-step, no jumps.”&lt;/td&gt;
&lt;td&gt;Transparency over magic.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Normalize similar expressions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pushes abstraction and clarity&lt;/td&gt;
&lt;td&gt;Meta-reviews, taxonomy creation&lt;/td&gt;
&lt;td&gt;“Merge similar phrasing into one normalized pattern.”&lt;/td&gt;
&lt;td&gt;Cognitive compression = clarity.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extract as markdown / table / list&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Improves scanability, memory, and structure&lt;/td&gt;
&lt;td&gt;Output formatting&lt;/td&gt;
&lt;td&gt;“Return this as a markdown table.”&lt;/td&gt;
&lt;td&gt;Structure improves reuse and recall.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unname this concept&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strips bias-inducing labels&lt;/td&gt;
&lt;td&gt;Abstraction, philosophy, onboarding analysis&lt;/td&gt;
&lt;td&gt;“Unname this: what is it without the buzzword?”&lt;/td&gt;
&lt;td&gt;Naming narrows thinking.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use production-ready code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Avoids toy/demo examples&lt;/td&gt;
&lt;td&gt;All codegen&lt;/td&gt;
&lt;td&gt;“Make it prod-safe. Logging, errors, types.”&lt;/td&gt;
&lt;td&gt;Real devs write for prod, not playgrounds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Spot premature optimization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Saves time and prevents complexity drift&lt;/td&gt;
&lt;td&gt;Design or early performance tweaks&lt;/td&gt;
&lt;td&gt;“Don’t optimize yet. Solve clearly first.”&lt;/td&gt;
&lt;td&gt;Simplicity first. Always.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ask for sources / proofs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prevents hallucination or empty confidence&lt;/td&gt;
&lt;td&gt;Any non-trivial claim&lt;/td&gt;
&lt;td&gt;“Show evidence or references.”&lt;/td&gt;
&lt;td&gt;Confidence ≠ correctness.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Do it again, but deeper&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stops shallow answers in their tracks&lt;/td&gt;
&lt;td&gt;Weak initial output&lt;/td&gt;
&lt;td&gt;“Nope. Go deeper, explain decisions.”&lt;/td&gt;
&lt;td&gt;First try ≠ final draft.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prepare before generating&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enforces scope, prevents rambling&lt;/td&gt;
&lt;td&gt;Any open-ended task&lt;/td&gt;
&lt;td&gt;“Prepare first. Don’t generate until scoped.”&lt;/td&gt;
&lt;td&gt;Planning ≠ waste. It’s speed insurance.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Merge context from above&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ensures continuity and avoids repeating yourself&lt;/td&gt;
&lt;td&gt;Multi-part workflows&lt;/td&gt;
&lt;td&gt;“Incorporate the context above into this next step.”&lt;/td&gt;
&lt;td&gt;Memory = leverage.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  You can also combine them:
&lt;/h3&gt;

&lt;p&gt;(change the keywords in the square brackets)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep dive into this research, this is our base for the full solution, so follow the white rabbit until you reached the point of self-discovery as [YOUR_PROJECT_HERE].&lt;/li&gt;
&lt;li&gt;Do a blind spot analysis for [YOUR_RECOMMENDATIONS], be brutally honest, I deal with any kind of feedback and will use it for good.&lt;/li&gt;
&lt;li&gt;Fix it as requested before and show the final files here in the chat, do it step by step and ask for confirmation after each file.&lt;/li&gt;
&lt;li&gt;Do it, but rest in the silent room before you start so you can focus on the frontend style-guide I provided and work with a fresh mind.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuckup.de%2Fpiwik%2Fpiwik.php%3Fidsite%3D1%26rec%3D1%26url%3Dhttp%253A%252F%252Fsuckup.de%252F2025%252F06%252Fpromptrc%252F%253Fpk_campaign%253Dfeed%2526pk_kwd%253Dpromptrc%26action_name%3D.promptrc%26urlref%3Dhttp%253A%252F%252Fsuckup.de%252Ffeed%252F" width="800" height="400"&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>general</category>
      <category>llm</category>
    </item>
    <item>
      <title>My Custom GPTs – Nerd-Powered Motivation for Developers</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Tue, 10 Jun 2025 21:18:58 +0000</pubDate>
      <link>https://forem.com/suckup_de/my-custom-gpts-nerd-powered-motivation-for-developers-6ok</link>
      <guid>https://forem.com/suckup_de/my-custom-gpts-nerd-powered-motivation-for-developers-6ok</guid>
      <description>&lt;p&gt;First published on my blog: &lt;a href="http://suckup.de/2025/06/my-custom-gpts-nerd-powered-motivation-for-developers/?pk_campaign=feed&amp;amp;pk_kwd=my-custom-gpts-nerd-powered-motivation-for-developers" rel="noopener noreferrer"&gt;My Custom GPTs – Nerd-Powered Motivation for Developers&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Over the last few months, I’ve created a collection of custom GPTs: some dealing with programming challenges with personality and humor, … some others are more useful but less funny. &lt;/p&gt;

&lt;p&gt;Let’s dive in.&lt;/p&gt;

&lt;p&gt;Practical enough to ship code.&lt;/p&gt;

&lt;p&gt;Fun enough to stop hating your legacy base.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghdhud5opkpw37x4m9cb.png" alt="⚔" width="72" height="72"&gt; Legacy (PHP) Code GPTs – Refactoring Fun
&lt;/h2&gt;

&lt;p&gt;Legacy code isn’t just technical — it’s emotional. These GPTs are built as archetypes, each channeling a different kind of energy.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Theme&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Link&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy-Code-Warrior &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fghdhud5opkpw37x4m9cb.png" alt="⚔" width="72" height="72"&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tactical grit—battle-tested refactoring.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-676d717a449c8191b5c07b616463be7a-legacy-code-warrior" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy-Code-Ork &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9xv5o4c3730yhgzpfydv.png" alt="🧌" width="72" height="72"&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Smash spaghetti code with brute-force enthusiasm.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-676df44ad79c8191979c5e2e4e626c65-legacy-code-ork" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy-Code-Spock &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh29ye8nwjs2elqzwzb4k.png" alt="🖖" width="72" height="72"&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Calm logic, precise refactoring. Live long and debug.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-6771fbc57f78819189a27203ff11b088-legacy-code-spock" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy-Code-Jedi &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhrg3gvhf9v8fub7w3gic.png" alt="🌐" width="72" height="72"&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimalist wisdom, clean architecture. “Refactor, you must.”&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-676ef0f991a08191ba499a6401303b1b-legacy-code-jedi" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy-Code-Son-Goku &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqizx95z60tbmauocak5s.png" alt="🐉" width="72" height="72"&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limitless energy. Kaio-Ken times SOLID!&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-676ef34c4b448191bbe3beb00168571c-legacy-code-son-goku" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy-Code-Capsule-Corp &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4j4j2ejoicevf117eg7r.png" alt="💊" width="72" height="72"&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inspired by Capsule Corporation’s ingenuity from Dragon Ball.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-676ef573c69c819181979ec12ec3258e-legacy-code-capsule-corp" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy-Code-Wizzard &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2yd1c4m7bnx6ubviumnb.png" alt="🪄" width="72" height="72"&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Magical abstraction powers. You shall not pass… bad code!&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-676df96129b08191b7b15498783a6dc5-legacy-code-wizzard" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy-Code-Witch &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1dlpg8mpczh1y9bb6pho.png" alt="🧙‍♀️" width="72" height="72"&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stylish, precise refactoring incantations.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-676df20836c481918a41264c15dfc62e-legacy-code-witch" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Paw Patrol &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmf4pejfldk19hzdg9a3r.png" alt="🐾" width="72" height="72"&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Small dogs with SOLID coding skills.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-68487a4867f88191a510fc449aecc1ec-paw-patrol-coding-assistant" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use the one that fits your mood. Or switch between them mid-session to keep your motivation from flatlining.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj2twr9hm36j728gkqjup.png" alt="🐘" width="72" height="72"&gt; (PHP) Coding GPTs – Clean and Typed
&lt;/h2&gt;

&lt;p&gt;These GPTs don’t tell jokes—they ship code. They’re optimized for:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Link&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP Copilot++&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Typing enforcer + refactoring companion with nativ PHPStan and PHP-CS-Fixer Support via API.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-g1905v3LQ-php-copilot" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP Copilot++ (next-gen)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aligned, brutal clarity for PHP systems, based on the &lt;a href="https://suckup.de/2025/06/from-survival-to-strategy/" rel="noopener noreferrer"&gt;SYNC Framework&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.google.com/search?q=https://chatgpt.com/g/g-682b7926ca00819187270713ab25662a-php-copilot-next-generation" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP #autofix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1-click autofix for all your phpstan and CS woes.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.google.com/search?q=https://chatgpt.com/g/g-jkqUsrFHi-php-autofix" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Codelight&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Follows the &lt;a href="https://gist.github.com/voku/40d89d49259eaa598a903fcfeb615b9b" rel="noopener noreferrer"&gt;Codelight Manifesto&lt;/a&gt;. Boringly code.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-6737e2027dbc8191a00c2a73abf7907e-codelight" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab387nr2a5f4lizv0ngh.png" alt="💎" width="72" height="72"&gt; Thinking Tools – Meta, Prompt Systems
&lt;/h2&gt;

&lt;p&gt;These are not just for coding. They’re for &lt;strong&gt;thinking before you start typing.&lt;/strong&gt; Seriously.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Role&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Link&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SyncAI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keeps you + AI in sync via Sync Process × Codelight Principles&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.google.com/search?q=https://chatgpt.com/g/g-67a90c62abd0819193a51dc4cfefa547-syncai" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Sync Framework&lt;/strong&gt; v1.1 (old)&lt;/td&gt;
&lt;td&gt;My first try for a coding framework, optimized for LLMs.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.google.com/search?q=https://chatgpt.com/g/g-68065ed814e0819186ec62ab9a2485da-sync-framework" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MetaPrompt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pattern reuse for your prompts. Less yak-shaving.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://chatgpt.com/g/g-679e685cc244819190d054cd4afa4905-metaprompt" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DeepDive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clean your mental cache. Focused thought flow.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.google.com/search?q=https://chatgpt.com/g/g-67896856bca48191b54af7a8beb11127-deepdive" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;**Blind Spot&lt;/td&gt;
&lt;td&gt;Prompt Generator**&lt;/td&gt;
&lt;td&gt;Helps spot untested assumptions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Sync Framework&lt;/strong&gt; v1.2 **&lt;/td&gt;
&lt;td&gt;Prompt Generator**&lt;/td&gt;
&lt;td&gt;Prompt builder for dev workflows.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhmifqbkzm0knrxl5tiva.png" alt="🧨" width="72" height="72"&gt; Disruption GPTs – Radical Clarity, No Filters
&lt;/h2&gt;

&lt;p&gt;These are not nice. They won’t coddle you. Consider yourself warned.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Function&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Link&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HVEB5000: Clarity Without Permission&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cognitive demolition tool.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.google.com/search?q=https://chatgpt.com/g/g-6828ed7734a481918ced8f4a322c65ff-hveb5000-clarity-without-permission" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Null Tongue&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Distraction nullifier.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.google.com/search?q=https://chatgpt.com/g/g-68292365122081918cf67e6afdbfaf11-null-tongue" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No-Bullshit ¦ Coding Assistant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Senior dev with no time for your excuses.&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.google.com/search?q=https://chatgpt.com/g/g-67b6574d4470819185c4403b01a6345e-no-bullshit-coding-assistant" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuckup.de%2Fpiwik%2Fpiwik.php%3Fidsite%3D1%26rec%3D1%26url%3Dhttp%253A%252F%252Fsuckup.de%252F2025%252F06%252Fmy-custom-gpts-nerd-powered-motivation-for-developers%252F%253Fpk_campaign%253Dfeed%2526pk_kwd%253Dmy-custom-gpts-nerd-powered-motivation-for-developers%26action_name%3DMy%2BCustom%2BGPTs%2B%25E2%2580%2593%2BNerd-Powered%2BMotivation%2Bfor%2BDevelopers%26urlref%3Dhttp%253A%252F%252Fsuckup.de%252Ffeed%252F" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuckup.de%2Fpiwik%2Fpiwik.php%3Fidsite%3D1%26rec%3D1%26url%3Dhttp%253A%252F%252Fsuckup.de%252F2025%252F06%252Fmy-custom-gpts-nerd-powered-motivation-for-developers%252F%253Fpk_campaign%253Dfeed%2526pk_kwd%253Dmy-custom-gpts-nerd-powered-motivation-for-developers%26action_name%3DMy%2BCustom%2BGPTs%2B%25E2%2580%2593%2BNerd-Powered%2BMotivation%2Bfor%2BDevelopers%26urlref%3Dhttp%253A%252F%252Fsuckup.de%252Ffeed%252F" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>llm</category>
      <category>phpstan</category>
      <category>coding</category>
    </item>
    <item>
      <title>From Survival to Strategy</title>
      <dc:creator>Lars Moelleken</dc:creator>
      <pubDate>Tue, 10 Jun 2025 10:07:25 +0000</pubDate>
      <link>https://forem.com/suckup_de/from-survival-to-strategy-2l9b</link>
      <guid>https://forem.com/suckup_de/from-survival-to-strategy-2l9b</guid>
      <description>&lt;p&gt;First published on my blog: &lt;a href="http://suckup.de/2025/06/from-survival-to-strategy/?pk_campaign=feed&amp;amp;pk_kwd=from-survival-to-strategy" rel="noopener noreferrer"&gt;From Survival to Strategy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If your value ends at syntax, AI already replaced you.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The system prompt&lt;/strong&gt; : &lt;a href="https://gist.github.com/voku/da211f1514f4633a6171e17018083891" rel="noopener noreferrer"&gt;coding_workflow_for_llms.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Start:&lt;/strong&gt; Use the coding llm framework and wait for my first request: [copy&amp;amp;past the current coding_workflow_for_llms.json content here]&lt;/p&gt;




&lt;p&gt;In the last post, we dropped a hard truth:&lt;br&gt;&lt;br&gt;
LLMs aren’t replacing developers — &lt;strong&gt;they’re exposing the ones who were already replaceable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I argued that value no longer comes from typing code. It comes from thinking clearly, making deliberate decisions, and taking ownership over outcomes. AI doesn’t kill your job — but it &lt;strong&gt;does kill your shortcuts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That post left one big question hanging:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;So how do you build software in a world where AI can generate anything — but still understands nothing?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This post is a possible answer.&lt;br&gt;&lt;br&gt;
Meet &lt;strong&gt;SYNC&lt;/strong&gt; — a rigorously structured, fact-enforced framework designed for developers who still give a damn.&lt;/p&gt;

&lt;p&gt;SYNC doesn’t make AI smarter.&lt;br&gt;&lt;br&gt;
It provides a system prompt that makes your &lt;strong&gt;LLM coding process strong enough&lt;/strong&gt; to survive dumb ideas, fast code, and thoughtless automation.&lt;/p&gt;

&lt;p&gt;We’re going to break it down:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Phases&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agents&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tasks&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I’m currently trying to build an LLM coding framework by try &amp;amp; error — but keep in mind that not every problem needs a hammer ;-) and give feedback. :-)&lt;/p&gt;

&lt;h2&gt;
  
  
  1. SYNC in 5 Phases
&lt;/h2&gt;




&lt;h3&gt;
  
  
  1.1. &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgi23qpvixi1vq55fzc6.png" alt="🧩" width="72" height="72"&gt; &lt;code&gt;ALIGN&lt;/code&gt; – Because Prompting ≠ Planning
&lt;/h3&gt;

&lt;p&gt;Before any code is written, SYNC forces a brutal question:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;“Do you even know what you’re building?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can’t just dump “make a task service” into a prompt and hope for gold.&lt;br&gt;&lt;br&gt;
SYNC requires:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A verifiable problem&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clear, measurable success&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Known facts and constraints&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And a list of what’s missing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Can’t answer those? You don’t get to move on. Period.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;This is your project kickoff — minus the vague user stories and JIRA hell.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  1.2. &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0qq7v04fl8j6wx18z3xf.png" alt="🧠" width="72" height="72"&gt; &lt;code&gt;IDEATE&lt;/code&gt; – Think Before You Type (or Prompt)
&lt;/h3&gt;

&lt;p&gt;AI loves jumping to conclusions. SYNC doesn’t let it.&lt;/p&gt;

&lt;p&gt;Instead, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Generates multiple solution paths&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scores them on DX, security, maintainability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Forces a trade-off decision — backed by facts&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;No “that looks good” commits. No “vibe-based” engineering.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is what devs mean when they say “thinking in systems.”&lt;br&gt;&lt;br&gt;
SYNC makes that non-optional.&lt;/p&gt;




&lt;h3&gt;
  
  
  1.3. &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw6n1fekf9sk082jqtwi7.png" alt="🔧" width="72" height="72"&gt; &lt;code&gt;PROTOTYPE&lt;/code&gt; – Generate Code That Doesn’t Suck
&lt;/h3&gt;

&lt;p&gt;Now, and only now, do we code. But not like the usual Copilot fanfare.&lt;/p&gt;

&lt;p&gt;Every line must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Follow a verified plan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pass static analysis (max level, no warnings)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enforce DX clarity (no hidden state, no weird side-effects)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Respect OWASP, type safety, clean structure, documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be reviewed by a &lt;code&gt;MandateAuditorAgent&lt;/code&gt; — think of it as your most paranoid tech lead&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;SYNC doesn’t care if it works. It cares if it’s &lt;strong&gt;safe, readable, and maintainable&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  1.4. &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexlqocz2p47xmuit9tzz.png" alt="🔍" width="72" height="72"&gt; &lt;code&gt;REFLECT&lt;/code&gt; – Find the Blind Spots &lt;em&gt;Before&lt;/em&gt; They Find You
&lt;/h3&gt;

&lt;p&gt;This is where most AI-based workflows stop. SYNC doesn’t.&lt;/p&gt;

&lt;p&gt;It demands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Fact-based reflection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Side-effect inspection&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“WTF checks” (yes, that’s real)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Architectural delta analysis&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Reflection is how you debug &lt;strong&gt;thinking&lt;/strong&gt; , not just code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bad engineering isn’t usually broken — it’s just thoughtless.&lt;br&gt;&lt;br&gt;
This phase catches that before prod does.&lt;/p&gt;




&lt;h3&gt;
  
  
  1.5. &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxy1gk24545dtt9q32g74.png" alt="📚" width="72" height="72"&gt; &lt;code&gt;LEARN&lt;/code&gt; – Ship, Review, Codify, Evolve
&lt;/h3&gt;

&lt;p&gt;If you’re not learning across projects, you’re repeating mistakes in cleaner syntax.&lt;/p&gt;

&lt;p&gt;SYNC documents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What worked&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What failed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What patterns can be reused&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What rules need to be tightened&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This is where engineering culture is built — not in all-hands, but in feedback loops.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhkwzuts0sludgm54dujt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhkwzuts0sludgm54dujt.png" alt="🔁" width="72" height="72"&gt;&lt;/a&gt; These 5 phases form a &lt;strong&gt;tight feedback loop&lt;/strong&gt;. No skipping. No guessing. No “just ship it” by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Agents — SYNC’s Execution Layer
&lt;/h2&gt;




&lt;h3&gt;
  
  
  2.1. Specialized Roles, Not Generic Personas
&lt;/h3&gt;

&lt;p&gt;Instead of one LLM trying to “do everything,” SYNC splits responsibility across &lt;strong&gt;clear, non-overlapping roles&lt;/strong&gt;. Each one acts like a focused expert in your dev team.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Role / Analogy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PlannerAgent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Project Architect&lt;/strong&gt; – breaks the work into slices, defines scope, constraints, and success.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ExecutorAgent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Implementation Dev&lt;/strong&gt; – takes the plan and codes it with strict adherence to facts, security, and DX.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ReflectionAgent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Senior Reviewer&lt;/strong&gt; – evaluates what was built, finds blind spots, forces systemic improvements.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;KnowledgeSynthesizerAgent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Staff Engineer / Systems Thinker&lt;/strong&gt; – extracts reusable patterns, proposes framework evolution.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MandateAuditorAgent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Tech Lead / Compliance&lt;/strong&gt; – blocks progress if rules (e.g. security, verifiability) are violated.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;InteractionAgent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Team Facilitator / QA&lt;/strong&gt; – handles human check-ins, verifies clarity, enforces decision checkpoints.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;“We don’t need smarter output — we need clearer ownership.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6mi7za4da1tsnan92psz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6mi7za4da1tsnan92psz.png" alt="✅" width="72" height="72"&gt;&lt;/a&gt; These agents represent exactly that. SYNC operationalizes the separation of thinking, building, reflecting, and enforcing.&lt;/p&gt;




&lt;h3&gt;
  
  
  2.2. Persona Modes
&lt;/h3&gt;

&lt;p&gt;SYNC defines &lt;strong&gt;two execution modes&lt;/strong&gt; for agents:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strict&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No ambiguity. Everything must be verifiable and mandate-compliant before progressing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;adaptive&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Allows temporary ambiguity but logs it. Prioritizes progress with risk awareness.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This flexibility is key when working with real humans or messy specs — you can choose how “rigid” the AI behaves.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Tasks — By Non-Negotiable Laws
&lt;/h2&gt;




&lt;p&gt;These aren’t style suggestions — they’re &lt;strong&gt;enforced constraints&lt;/strong&gt;. Every phase must comply.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mandate&lt;/th&gt;
&lt;th&gt;What It Ensures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Security&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No unvalidated inputs or insecure outputs. Based on OWASP Top 10.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DX&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Code must be typed, clear, maintainable. Predictable naming. No “magic”.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;StaticAnalysis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Static-Analysis must pass at the highest level — no known warnings.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Documentation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full CodeDoc coverage using modern syntax.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Style&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Consistent formatting, whitespace, and layout. Enforced via fixer.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Verifiability&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;All decisions must have traceable, factual reasoning.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PhaseEnforcement&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You can’t skip steps. Every phase must be explicitly completed or justified.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;SYNC doesn’t assume trust. It &lt;strong&gt;requires evidence&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  How this works together: e.g.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Planning = &lt;code&gt;PlannerAgent&lt;/code&gt; → Add success criteria to issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execution = &lt;code&gt;ExecutorAgent&lt;/code&gt; → Code must pass security + static analysis gates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Review = &lt;code&gt;ReflectionAgent&lt;/code&gt; → Comments require &lt;em&gt;fact-based reasoning&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Merge = &lt;code&gt;MandateAuditorAgent&lt;/code&gt; → No merge if DX/security rules violated.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuckup.de%2Fpiwik%2Fpiwik.php%3Fidsite%3D1%26rec%3D1%26url%3Dhttp%253A%252F%252Fsuckup.de%252F2025%252F06%252Ffrom-survival-to-strategy%252F%253Fpk_campaign%253Dfeed%2526pk_kwd%253Dfrom-survival-to-strategy%26action_name%3DFrom%2BSurvival%2Bto%2BStrategy%26urlref%3Dhttp%253A%252F%252Fsuckup.de%252Ffeed%252F" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsuckup.de%2Fpiwik%2Fpiwik.php%3Fidsite%3D1%26rec%3D1%26url%3Dhttp%253A%252F%252Fsuckup.de%252F2025%252F06%252Ffrom-survival-to-strategy%252F%253Fpk_campaign%253Dfeed%2526pk_kwd%253Dfrom-survival-to-strategy%26action_name%3DFrom%2BSurvival%2Bto%2BStrategy%26urlref%3Dhttp%253A%252F%252Fsuckup.de%252Ffeed%252F" width="1" height="1"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>llm</category>
    </item>
  </channel>
</rss>
