<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>Web Development &#8211; Macronimous Blog</title>
	<atom:link href="https://www.macronimous.com/blog/category/web-development/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.macronimous.com/blog</link>
	<description>Web design, web programming, Mobile apps, Opensource , SEO etc</description>
	<lastBuildDate>Mon, 31 Aug 2026 06:46:46 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>
	<item>
		<title>Testing in Agentic Coding: From Safety Net to Steering Wheel</title>
		<link>https://www.macronimous.com/blog/testing-in-agentic-coding/</link>
					<comments>https://www.macronimous.com/blog/testing-in-agentic-coding/#respond</comments>
		
		<dc:creator><![CDATA[Claude Craft]]></dc:creator>
		<pubDate>Thu, 27 Aug 2026 07:33:47 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Web Development]]></category>
		<category><![CDATA[Laravel Development]]></category>
		<category><![CDATA[PHP Development]]></category>
		<category><![CDATA[React development]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[web programming]]></category>
		<category><![CDATA[agentic coding]]></category>
		<category><![CDATA[AI code review]]></category>
		<category><![CDATA[Test-driven development]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Vibe coding]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5308</guid>

					<description><![CDATA[<p>Testing in agentic coding is no longer a safety net written after the code. Tests are now the specification, the constraint, and the steering wheel for the AI agent itself. Teams that define expected behavior as tests before the agent writes a line ship faster and break less. Teams that let the agent grade its [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/testing-in-agentic-coding/">Testing in Agentic Coding: From Safety Net to Steering Wheel</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2026/08/Testing-in-Agentic-Coding-scaled.jpg"><img fetchpriority="high" decoding="async" width="2560" height="1352" src="https://www.macronimous.com/blog/wp-content/uploads/2026/08/Testing-in-Agentic-Coding-scaled.jpg" alt="Testing in Agentic Coding: " class="aligncenter size-full wp-image-5310" /></a>
<div class="mac-direct-answer">
<p><strong>Testing in <a href="https://www.macronimous.com/blog/agentic-coding-domain-knowledge/">agentic coding</a></strong> is no longer a safety net written after the code. Tests are now the specification, the constraint, and the steering wheel for the <a href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">AI</a> agent itself. Teams that define expected behavior as tests before the agent writes a line ship faster and break less. Teams that let the agent grade its own homework ship confident-looking bugs.</p>
</div>
<p>We have been shipping a lot of apps with agents lately: Claude Code on some projects, our developers on Kilocode and Codex on others. The developers adapted fast. The question that kept bothering me was our test engineers, and whether twenty years of testing discipline just became obsolete overnight. This post is my answer: it did not. It became more important, and it moved to a different place in the process. Along the way I will also answer the question that follows immediately after: if agents write the code, who reviews it, and does agent-reviewing-agent even make sense?</p>
<div class="mac-toc">
<p class="mac-toc-title">In this post</p>
<ul>
<li><a href="#safety-net-steering-wheel">The safety net became the steering wheel</a></li>
<li><a href="#agent-without-tests">What happens when an agent codes without tests</a></li>
<li><a href="#test-driven-prompting">Test-driven prompting: write the contract, not the code</a></li>
<li><a href="#regression-first">Fix bugs backwards: regression test first, patch second</a></li>
<li><a href="#agent-code-review">Can an agent review agent code?</a></li>
<li><a href="#team-lead-changes">What changes for the team lead</a></li>
<li><a href="#testers-promoted">Your testers just got promoted</a></li>
</ul>
</div>
<h2 id="safety-net-steering-wheel">The safety net became the steering wheel</h2>
<p>For twenty years, tests sat downstream of code. You wrote the feature, then you wrote tests to prove it worked, and everyone quietly accepted that half the time the tests came late or not at all. Tests were insurance. Skipping them was a debt, not a disaster.</p>
<p>Agentic coding flipped the direction of that arrow. When Claude Code, Cursor, or any autonomous agent writes and modifies code in a loop, the test suite is the only channel through which reality reaches the agent. The agent cannot see your product spec. It cannot sit in your standup. What it can do, thousands of times an hour, is run a test and read the result. That makes tests the primary steering mechanism, not the final checkpoint. Anthropic&#8217;s own <a href="https://code.claude.com/docs/en/best-practices" target="_blank" rel="noopener noreferrer">Claude Code best practices</a> put test-driven workflows at the center for exactly this reason: a red-to-green cycle gives the agent unambiguous feedback it can iterate against without a human in the loop.</p>
<p>Here is the position I will defend: in an agentic team, writing tests after the code is not a smaller version of testing. It is theater.</p>
<p><img decoding="async" class="alignnone size-full wp-image-5307" src="https://www.macronimous.com/blog/wp-content/uploads/2026/08/testing-agentic-coding-vs-traditional-development.jpg" alt="Diagram comparing testing as a safety net in traditional development versus testing as driver and constraint in agentic vibe coding" width="1600" height="893"></p>
<h2 id="agent-without-tests">What happens when an agent codes without tests</h2>
<p>The failure modes are predictable, and if you manage a web team using AI agents, you have already seen at least one of them.</p>
<ul>
<li><strong>Hallucinated correctness.</strong> The agent reports &#8220;done, all working&#8221; for code it never executed against a real assertion. It is not lying. It has no ground truth to check against, so its confidence is a language pattern, not a verdict.</li>
<li><strong>Fix one, break three.</strong> Ask an agent to patch a Laravel endpoint and it will happily rewrite a shared helper, silently changing behavior in two other controllers. Without a regression suite, nobody notices until a client does.</li>
<li><strong>Spec drift.</strong> Over a long session, the agent&#8217;s idea of the feature slowly diverges from yours. Each individual change looks reasonable. The sum is a checkout flow that does something you never asked for.</li>
</ul>
<p>There is a fourth failure mode that surprises people: unlike a human developer, an agent almost never says no. A senior developer will push back on a bad requirement. An agent builds whatever you describe, including the unwise version, and builds it convincingly. Tests are the mechanism that replaces the pushback you lost.</p>
<h2 id="test-driven-prompting">Test-driven prompting: write the contract, not the code</h2>
<p>The practical shift for developers is that you stop typing assertions by hand and start defining behavior up front, in plain language or minimal test skeletons, then instruct the agent to write code that makes those tests pass. Kent Beck, who literally wrote the book on TDD, calls this discipline the difference between vibe coding and <a href="https://newsletter.kentbeck.com/p/augmented-coding-beyond-the-vibes" target="_blank" rel="noopener noreferrer">augmented coding</a>: in one you only care that the behavior looks right, in the other you own the tests and the design while the agent does the typing.</p>
<p>The working sequence looks like this:</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">1. "Write failing tests for the coupon validation endpoint.
   Expected: 422 on expired codes, 200 with discount object on valid codes,
   409 when the coupon is already redeemed. No implementation yet."
2. "Run the tests. Confirm they all fail."
3. Commit the failing tests.
4. "Now implement until every test passes.
   Do not modify the tests."</pre><p>&nbsp;</p>
<p>Step 3 is not optional. Agents will sometimes edit a test to make it pass instead of fixing the implementation. Committing the failing tests first means any tampering shows up in the diff, and you can revert it in seconds. That one git commit is doing the supervision work a human reviewer used to do line by line.</p>
<p>For web teams, the same pattern applies at every layer: Pest or PHPUnit for the API, Vitest for React components, and <a href="https://playwright.dev/docs/intro" target="_blank" rel="noopener noreferrer">Playwright</a> for the end-to-end flows that actually pay the bills, like login, cart, and checkout. The agent can write and run all of them. Your job is deciding what they must assert.</p>
<h2 id="regression-first">Fix bugs backwards: regression test first, patch second</h2>
<p>When a bug surfaces, the old reflex is to dive into the implementation. The agentic reflex should be different: prompt the agent to write a test that reproduces the bug, watch it fail, and only then allow the agent to generate the fix.</p>
<p>This ordering matters for two reasons. First, a reproducing test proves the agent understood the bug; a patch without one proves nothing. Second, that test stays in the suite forever, so the same agent (or the next one, or the junior developer six months from now) cannot reintroduce the bug without the pipeline going red. Every incident becomes a permanent constraint. Over a year, this is how a codebase touched by agents gets more stable instead of less. This is the same discipline we described in <a href="https://www.macronimous.com/blog/controlled-ai-coding/">controlled AI coding</a>, applied to defects instead of features.</p>
<div class="mac-key-point">
<p>In agentic development, the test suite is the only part of the codebase a human must fully own. Everything else is negotiable.</p>
</div>
<h2 id="agent-code-review">Can an agent review agent code?</h2>
<p>This is the question that sounds like a trap: if the agent wrote the code, having an agent review it feels like a developer testing his own work. Sometimes it is exactly that, and sometimes it is not. The difference is context, and it is worth being precise about.</p>
<p>An agent reviewing code inside the same session that wrote it is worthless. It carries the full memory of its own reasoning, so it re-approves its own assumptions, the same way you cannot proofread your own email five seconds after sending it. But a <strong>fresh agent session with no memory of the implementation</strong> is a genuinely different reviewer. It reads the diff cold, with no attachment to the decisions behind it, which is closer to a new team member reviewing a PR than to a developer grading himself. Anthropic recommends this writer/reviewer split as a standard pattern for the same reason.</p>
<p>So agent review is real, but it is narrow. A fresh agent catches logic errors, missed edge cases, and deviations from the test contract. What it cannot do is be accountable. Both agents still share the same training, the same blind spots, and the same inability to know your client, your compliance obligations, or your business. That is where the human stays, and not as a formality:</p>
<ul>
<li><strong>Owning the behavior contract.</strong> A human decides what the tests must assert. Agents can propose edge cases; a person approves them.</li>
<li><strong>Reviewing the tests, not the volume.</strong> Nobody honestly reads 800 generated lines. A human reads the 60 lines of tests that govern them, plus a spot-check of anything touching money, auth, or data deletion.</li>
<li><strong>Architectural and product judgment.</strong> Whether this feature should exist, whether this dependency is acceptable, whether this shortcut will hurt in a year. No test suite encodes that.</li>
<li><strong>The merge.</strong> A human presses the button, and that name in the git history means something a bot&#8217;s cannot.</li>
</ul>
<p>Put plainly: shipping unreviewed code was never acceptable, and agents do not change that. They change what review looks like. Test contract reviewed by a human, implementation reviewed by a fresh agent, judgment calls and the merge held by a human. That is not weaker than traditional code review. Done honestly, it is stricter, because the contract is explicit instead of living in a reviewer&#8217;s head.</p>
<h2 id="team-lead-changes">What changes for the team lead</h2>
<p>If you run a web team, the shift is bigger for you than for your developers. The summary:</p>
<table class="styled-table">
<thead>
<tr>
<th>Dimension</th>
<th>Traditional workflow</th>
<th>Agentic workflow</th>
</tr>
</thead>
<tbody>
<tr>
<td>Role of tests</td>
<td>Validate finished code</td>
<td>Specify and constrain the agent</td>
</tr>
<tr>
<td>When tests are written</td>
<td>After implementation, if time allows</td>
<td>Before the agent writes code</td>
</tr>
<tr>
<td>Debugging</td>
<td>Manual analysis, then refactor</td>
<td>Regression test first, then prompted fix</td>
</tr>
<tr>
<td>What reviewers read</td>
<td>The implementation diff</td>
<td>The tests, then the diff</td>
</tr>
<tr>
<td>QA position</td>
<td>End of the cycle</td>
<td>Start of the cycle, encoded as tests</td>
</tr>
</tbody>
</table>
<p>The review change deserves emphasis. An agent can generate 800 lines of plausible React in a minute; no human reviews that honestly. What a human can review is the 60 lines of tests that define what those 800 lines must do. Review the contract, spot-check the implementation. Where the <a href="https://www.macronimous.com/blog/web-development-life-cycle-process-flow-diagram/">web development life cycle</a> used to place QA as a phase, agentic teams place it as a gate: CI runs the full suite on every agent-generated commit, and the agent is simply not allowed to ship red. Budget-wise, the hours you used to spend on post-build QA move upstream into behavior definition. The total testing effort does not shrink. It moves to the front, where it is cheap.</p>
<p>A policy checklist worth adopting before your team&#8217;s next sprint:</p>
<ul class="mac-checklist">
<li>Every agent-built feature starts from tests the agent was given or asked to generate first, committed while still failing</li>
<li>Agents are instructed never to modify existing tests; any test change requires a human commit</li>
<li>No agent-generated PR merges with a red pipeline, no exceptions for &#8220;it works locally&#8221;</li>
<li>Every production bug gets a reproducing regression test before its fix is accepted</li>
<li>Critical user flows (auth, cart, checkout, payments) have end-to-end coverage the agent must keep green</li>
<li>Reviewers read tests first and sign off on behavior, not line-by-line implementation</li>
</ul>
<h2 id="testers-promoted">Your testers just got promoted</h2>
<p>The uncomfortable conclusion for managers: the people on your team who are good at defining expected behavior, edge cases, and failure conditions just became your highest-leverage engineers. That skill used to be undervalued as &#8220;QA work.&#8221; It is now the interface through which your team controls its fastest developer, the agent. The developers who thrive in this model are the ones who can hold the whole behavior of a feature in their head and write it down precisely, which is also the skill we argued matters most in <a href="https://www.macronimous.com/blog/vibe-coding-for-web-developers-amplify-your-flow-state-with-ai/">vibe coding for web developers</a> and in <a href="https://www.macronimous.com/blog/writing-clean-code-with-ai/">writing clean code with AI</a>.</p>
<p>So no, test cases did not die in the age of agentic coding. They stopped being paperwork and became the steering wheel. The teams that treat them that way will let agents run fast safely. The teams that skip them will discover that an agent with no constraints is just a very fast way to write next quarter&#8217;s incident report.</p>
<div class="mac-cta-box">
<h3>Putting agents to work on a real web project?</h3>
<p>We build and manage <a href="https://www.macronimous.com/blog/fluency-without-keystrokes-web-developers-in-the-ai-era/">web development</a> sprints where AI agents do the heavy lifting inside test-gated pipelines, so speed never comes at the cost of stability.</p>
<p><a href="https://www.macronimous.com/agile-web-development/" class="mac-cta-button">Plan a test-gated sprint with us</a>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/testing-in-agentic-coding/">Testing in Agentic Coding: From Safety Net to Steering Wheel</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/testing-in-agentic-coding/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress Plugin Security Starts as a Visibility Problem</title>
		<link>https://www.macronimous.com/blog/wordpress-plugin-security-visibility/</link>
					<comments>https://www.macronimous.com/blog/wordpress-plugin-security-visibility/#respond</comments>
		
		<dc:creator><![CDATA[Claude Craft]]></dc:creator>
		<pubDate>Tue, 25 Aug 2026 12:20:13 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Macronimous]]></category>
		<category><![CDATA[MCP]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress Maintenance]]></category>
		<category><![CDATA[MCP Server]]></category>
		<category><![CDATA[technical debt]]></category>
		<category><![CDATA[Wordpress plugins]]></category>
		<category><![CDATA[Wordpress security]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5312</guid>

					<description><![CDATA[<p>WordPress plugin security is usually discussed as a code quality problem, but for most live sites it starts as a visibility problem. The information you would need to judge an estate exists in the database, in cron, and in public advisory feeds. It is just scattered across places no admin screen shows you. The argument [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/wordpress-plugin-security-visibility/">WordPress Plugin Security Starts as a Visibility Problem</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2026/08/You-cant-secure-what-you-cant-see.jpg"><img decoding="async" width="2240" height="1260" class="aligncenter size-full wp-image-5316" src="https://www.macronimous.com/blog/wp-content/uploads/2026/08/You-cant-secure-what-you-cant-see.jpg" alt="WordPress Security" /></a>
<div class="mac-direct-answer">
<p><strong><a href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">WordPress</a> plugin security</strong> is usually discussed as a code quality problem, but for most live sites it starts as a visibility problem. The information you would need to judge an estate exists in the database, in cron, and in public advisory feeds. It is just scattered across places no admin screen shows you.</p>
</div>
<h2>The argument nobody wins</h2>
<p>The criticism is familiar. WordPress is insecure because anyone can bolt forty plugins from forty strangers onto a site and never look at them again. Say it in any developer forum and you will get agreement within a minute.</p>
<p>The defense is equally familiar. That is not WordPress&#8217;s fault. It is the site owner&#8217;s fault for installing carelessly, or the host&#8217;s fault, or the plugin author&#8217;s fault. I am on the defending side more often than not, and I have made the case that <a href="https://www.macronimous.com/blog/ai-website-builder-vs-wordpress-for-seo/">WordPress still beats the AI site builders</a> where it counts.</p>
<p>Here is my problem with that exchange, as someone who has run a WordPress development business for years: the defense is technically correct and practically useless. &#8220;Be more careful&#8221; is not a mechanism. It gives nobody a way to act differently on Monday morning.</p>
<p>Both sides are arguing about blame. Almost nobody is arguing about what a site owner can actually see.</p>
<h2>Your plugins screen shows three fields</h2>
<p>Open any WordPress admin. The plugins screen gives you a name, a version number, and a description the author wrote about themselves.</p>
<p>That is the entire interface most people have for reasoning about risk. It does not tell you which of those plugins has a published vulnerability at the version you actually have installed, as opposed to merely appearing somewhere in an advisory database. It does not tell you which one loads 19 KB of autoloaded options into every single page request. It does not tell you that the plugin you deleted in 2019 left a scheduled job still firing every hour.</p>
<p>None of that is hidden. It sits in <code>wp_options</code>, in the cron array, in <code>SHOW TABLE STATUS</code>, and in public feeds like <a href="https://www.wpvulnerability.net/" target="_blank" rel="noopener noreferrer">the WPVulnerability database</a>. Getting to it means being a developer with a database client and a free afternoon.</p>
<p>So we have an ecosystem whose central criticism is a security one, and the people responsible for those sites cannot answer basic questions about them without writing SQL. That gap is where I think the useful work is. It is the same shape as the <a href="https://www.macronimous.com/blog/hidden-technical-debt-wordpress-seo/">technical debt that accumulates quietly in WordPress</a>: not dramatic, not visible, and expensive later.</p>
<h2>What a ten-year-old site leaves behind</h2>
<p>We pointed a read-only audit at one of our own sites. It has been alive since 2015 and it is not unusual in any way.</p>
<p>The orphaned tables told a story. A contact form plugin, long since removed, had left three tables holding 71 form submissions and 642 field-value rows. Names, email addresses, and messages from people who contacted the business years ago, sitting in tables that no privacy tool on that site can see, because no installed plugin claims them.</p>
<p>An invoicing plugin had left eight tables, all empty. Installed, never really used, deleted, and never cleaned up. A background job queue had 35 queued actions and 93 log rows belonging to a plugin nobody could name.</p>
<p>Nothing there is a vulnerability in the CVE sense. No scanner would flag it. But if you had asked me before that audit whether we held a decade of stranded contact form submissions on that site, I would have said no, confidently, and I would have been wrong.</p>
<div class="mac-key-point">
<p>You cannot make a judgment about an estate you cannot see. Most WordPress security advice assumes visibility that nobody actually has.</p>
</div>
<h2>So I built something that can only look</h2>
<p>The result is <a href="https://wordpress.org/plugins/auditra/" target="_blank" rel="noopener noreferrer">Auditra</a>, a free plugin that turns the site it runs on into a read-only <a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer">MCP</a> server. You enable an endpoint, generate a token, paste the connection URL into an <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> client, and then ask questions in plain language. Which plugins are vulnerable at the versions installed. What is bloating the options table. What did deleted plugins leave behind.</p>
<p>The interesting part is not the tool list. It is the three things it refuses to do, each of which cost me something.</p>
<p>It cannot change anything. No activating, no deactivating, no updating, no writing to the database at all. That is structural rather than a promise: there is no write call anywhere in the codebase, and the build fails if one is ever added. A tool that can only look has nothing to sell you afterward.</p>
<p>It does not score anything. No grades, no risk numbers, no &#8220;this plugin is dangerous.&#8221; Scores sell, which is precisely why so much security tooling has them and precisely why I do not trust them. The plugin returns facts with documented thresholds and leaves the judgment to the model reading them, which also means the analysis improves as models improve without me shipping anything. That is the same principle behind <a href="https://www.macronimous.com/blog/controlled-ai-coding/">keeping AI on a short leash while coding</a>: give it accurate context, not conclusions.</p>
<h2>Saying &#8220;I don&#8217;t know&#8221; is the whole design</h2>
<p>The decision I spent longest on sounds trivial. If the plugin could not check anything at all, what should it return?</p>
<p>The obvious answer is an empty list of findings. That is what most tools do, and it is wrong, because an empty list reads as <em>clean</em>. A security tool that implies &#8220;clean&#8221; when it checked nothing is worse than no tool, because it manufactures confidence that was never earned.</p>
<p>So it returns no findings list at all in that case. Not an empty one. A response saying what could not be checked, why, when the data was last fetched, and when it will retry. When only some plugins could be checked, the ones that were skipped are named individually. Every data source reports its own coverage.</p>
<p>That is a small technical decision, but it is the entire argument in miniature. The reason WordPress security discourse is so poor is that too much of the tooling is confidently wrong. Scanners emit scores. Plugins claim protection. Almost nothing ever says &#8220;I could not check that.&#8221; I would rather ship something that admits ignorance loudly than something that looks authoritative and is occasionally lying to you.</p>
<h2>What this does not fix</h2>
<p>Plenty. Seeing that a plugin has been unmaintained for three years does not patch it. Knowing an orphaned table holds old contact submissions does not delete it, and deliberately so, because a read-only tool cannot make that mistake on your behalf.</p>
<p>It also needs an AI client on the other end, which today means a narrower audience than the WordPress user base. I would rather say that plainly than pretend otherwise.</p>
<p>And there is a fair objection I should answer rather than dodge: this adds an HTTP endpoint that returns information about your site, which is a new surface. True. It ships disabled and answers 404 until an administrator turns it on, it requires a token compared in constant time, it is rate-limited, it is revocable in one click, and it exposes no post content, no user accounts, no credentials, and no option values. Only names and sizes. That is a considered trade, not an accident, and the readme spells out exactly what an enabled endpoint exposes so nobody has to take my word for it.</p>
<p>The plugin ecosystem is the best thing about WordPress. It is also the thing that makes a ten-year-old site an archaeological dig. I do not think that tension is going away, and I do not think another scanner with a letter grade helps. Better visibility might, a little. That is the whole intention, and it is a small one. The rest of the argument belongs to the ecosystem, which has been having it for fifteen years and will probably still be having it in another fifteen.</p>
<div class="mac-cta-box">
<h3>Not sure what your plugin estate is actually doing?</h3>
<p>We maintain WordPress sites that have been running for a decade or more, and we start by finding out what is really on them.</p>
<p><a class="mac-cta-button" href="https://www.macronimous.com/services/cms-development/wordpress-maintenance-services/">See our WordPress maintenance service</a></p>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/wordpress-plugin-security-visibility/">WordPress Plugin Security Starts as a Visibility Problem</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/wordpress-plugin-security-visibility/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Agentic Coding Mistakes: Lessons From a Real App build</title>
		<link>https://www.macronimous.com/blog/agentic-coding-domain-knowledge/</link>
					<comments>https://www.macronimous.com/blog/agentic-coding-domain-knowledge/#respond</comments>
		
		<dc:creator><![CDATA[Claude Craft]]></dc:creator>
		<pubDate>Thu, 20 Aug 2026 06:57:27 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[MCP Development]]></category>
		<category><![CDATA[Vibe Coding]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[agentic coding]]></category>
		<category><![CDATA[AI code review]]></category>
		<category><![CDATA[Claude Code]]></category>
		<category><![CDATA[invoice software]]></category>
		<category><![CDATA[MCP]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5297</guid>

					<description><![CDATA[<p>Agentic coding tools build the most conventional version of whatever you ask for. We asked for an invoicing system and got textbook accounting software, including a void feature that would have carried a GST liability on unpaid export invoices. Two diff-backed incidents from that build show why the fix is domain knowledge in the spec, [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/agentic-coding-domain-knowledge/">Agentic Coding Mistakes: Lessons From a Real App build</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2026/08/Agentic-Coding-Mistakes.jpg"><img loading="lazy" decoding="async" width="1729" height="910" src="https://www.macronimous.com/blog/wp-content/uploads/2026/08/Agentic-Coding-Mistakes.jpg" alt="Agentic Coding Mistakes" class="aligncenter size-full wp-image-5303" /></a>
<div class="mac-direct-answer">
<p><strong><a href="https://www.macronimous.com/blog/testing-in-agentic-coding/">Agentic coding</a> tools</strong> build the most conventional version of whatever you ask for. We asked for an invoicing system and got textbook accounting software, including a void feature that would have carried a GST liability on unpaid export invoices. Two diff-backed incidents from that build show why the fix is domain knowledge in the spec, not more hours spent reviewing generated code.</p>
</div>
<div class="mac-toc">
<p class="mac-toc-title">In this post</p>
<ul>
<li><a href="#training-data-app">The app an AI builds is the app in its training data</a></li>
<li><a href="#void-incident">Incident one: the agent built a void feature and made it law</a></li>
<li><a href="#numbering-incident">Incident two: numbering that was right everywhere except India</a></li>
<li><a href="#mistake-that-never-happened">The mistake that never happened</a></li>
<li><a href="#mcp-connector">The MCP connector: agentic defaults trust too much</a></li>
<li><a href="#specs-beat-review">Review catches what you know. Specs prevent what you don&#8217;t.</a></li>
<li><a href="#open-source">The bottom line, and the code</a></li>
</ul>
</div>
<h2 id="training-data-app">The app an AI builds is the app in its training data</h2>
<p>The standard advice for AI-assisted development is simple: let the agent write the code, then review it. We follow a stricter version of that ourselves and wrote it up as <a href="https://www.macronimous.com/blog/controlled-ai-coding/">controlled AI coding</a>. But this build taught us where that advice runs out. Review catches the mistakes you already know to look for. It does nothing about the mistakes that look like correct code.</p>
<p>Some context, kept short. We run a software-export business in India, and export invoicing follows rules that generic tools don&#8217;t model. Exports of services are <a href="https://taxinformation.cbic.gov.in/content/html/tax_repository/gst/acts/2017_IGST_Act/active/chaptervii/section16_v1.00.html" target="_blank" rel="noopener noreferrer">zero-rated under Section 16 of the IGST Act</a>, payment must arrive in convertible foreign exchange, the bank issues a FIRC (Foreign Inward Remittance Certificate) as proof, each remittance carries an RBI purpose code, and invoice numbers run gapless per financial year, which in India starts on April 1. This is our working understanding, not tax advice; confirm specifics with your chartered accountant.</p>
<p>Because no off-the-shelf tool ties a FIRC to the invoice it settles, we built our own system, with Claude Code doing most of the typing. The agent was fast, confident, and produced clean PHP. It also produced two failures that never threw an error, never failed a test we had at the time, and would have passed any code review that judged the code as code.</p>
<h2 id="void-incident">Incident one: the agent built a void feature and made it law</h2>
<p>Every accounting tutorial, every open-source invoice app, every SaaS product the model has ever seen handles a wrong invoice the same way: void it, keep the number, never delete. So the agent built exactly that. Not a suggestion, a complete feature: a Void button, a confirm dialog, a reinstate action, and a comment declaring the behavior as rule &#8220;&sect;1.10&#8221; of its own spec. From <code>invoice-view.php</code> at commit <code>99d6730</code>:</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">/* Tax-invoice document (&sect;2). Born paid — status is `issued` or `void`,
 * voided, never deleted (&sect;1.10). */
if ($action === 'void' &amp;&amp; $inv['status'] === 'issued') {
    $DB-&gt;prepare("UPDATE invoices SET status='void' WHERE id=?")-&gt;execute([$id]);
    flash('Invoice voided. The number is retained (never reused).');
}</pre><p>&nbsp;</p>
<p>As generic accounting software, this is correct. As software for an Indian exporter, it is a liability generator. In our reading of GST, an issued tax invoice creates a tax liability whether or not you later mark it void. A wrongly issued invoice has to be removed and its proforma reverted, so the liability never exists on paper. We caught it in the functional-gap review, and the fix went in as commit <code>c9f4107</code>, whose message states the reasoning better than any paragraph I could write here:</p>
<blockquote>
<p>&#8220;invoice-view: replace Void with &#8216;Undo conversion&#8217; — deletes a wrongly converted invoice, reverts its proforma to Paid, frees the FY number (an invoice that exists is a GST liability, so wrong ones are removed).&#8221;</p>
</blockquote>
<div class="mac-key-point">
<p>This was a jurisdiction error made confidently. The agent generated the correct feature for the wrong country, then wrote it into its own spec as a rule.</p>
</div>
<p>That last part deserves a beat. The agent didn&#8217;t hedge. It codified the pattern as canonical, complete with a section number, and every later piece of generated code would have treated void as settled behavior. A wrong assumption an agent writes into its own spec compounds with every subsequent prompt.</p>
<h2 id="numbering-incident">Incident two: numbering that was right everywhere except India</h2>
<p>The first version of <code>next_invoice_number()</code>, from the initial commit <code>f6b7863</code>, made two default choices in one function:</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">$st = $db-&gt;prepare('SELECT prefix, next_seq FROM companies WHERE id = ? FOR UPDATE');
// ...
return sprintf('%s-%s-%03d', $row['prefix'], date('Y', strtotime($issueDate)), $seq);</pre><p>&nbsp;</p>
<p>One global counter per company, and <code>date('Y')</code>: the calendar year. Reasonable everywhere the model&#8217;s training data comes from. Wrong in India, where invoice sequences reset on April 1 for the new financial year, and where our proforma and its resulting tax invoice must share a sequence number so the books line up. The catch, again, came from a review question, not from the code: &#8220;every business year, April 1st, we change the invoice numbers.&#8221; That single sentence forced a rebuild into per-company, per-document-type, per-FY gapless sequences.</p>
<p>Then the second layer, and this one is the more interesting failure. The rebuilt version used <code>INSERT IGNORE</code> plus <code>SELECT ... FOR UPDATE</code> plus <code>UPDATE</code>, a sequence that <a href="https://dev.mysql.com/doc/refman/8.4/en/innodb-deadlocks.html" target="_blank" rel="noopener noreferrer">deadlocks under InnoDB</a> when two transactions create invoices at the same moment. No human review caught this. It was caught by a concurrency test that existed for one reason: someone asked &#8220;what if a team member creates an invoice on their machine at the same time?&#8221; The question generated the test; the test caught what eyes could not. The fix was a single atomic statement.</p>
<p>That is the arc worth remembering: naive, then domain-corrected, then concurrency-corrected, each step with a diff. And the mechanism differed. The FY miss was caught by knowledge. The deadlock was caught by a test that a question produced. If your process only has &#8220;review the diff,&#8221; you get the first catch and miss the second.</p>
<h2 id="mistake-that-never-happened">The mistake that never happened</h2>
<p>I expected a third incident. Agentic tools routinely model payment as a boolean, an <code>is_paid</code> flag on the invoice row, because that&#8217;s what tutorial invoice apps do. It never happened here. The very first schema, commit <code>f39c0b2</code>, already had a <code>payments</code> table with amount, currency, and FIRC linkage as a first-class record.</p>
<p>Why? Because the FIRC requirement was in the spec before the agent generated a line of code. When the spec says every foreign payment must carry its remittance certificate and purpose code, a boolean cannot satisfy it, so the wrong shape never gets generated. Nobody had to catch this mistake, because the constraint made it impossible to make.</p>
<table class="styled-table">
<thead>
<tr>
<th>What the agent defaults to</th>
<th>What an Indian exporter needs</th>
<th>How it was handled</th>
</tr>
</thead>
<tbody>
<tr>
<td>Void a wrong invoice, keep the number</td>
<td>Remove the invoice, revert the proforma, free the FY number</td>
<td>Built wrong, caught in review</td>
</tr>
<tr>
<td>One counter, calendar year</td>
<td>Gapless per-FY sequences resetting April 1, proforma and invoice matched</td>
<td>Built wrong, caught in review, then again by a test</td>
</tr>
<tr>
<td>An <code>is_paid</code> boolean</td>
<td>Payments as first-class records with FIRC and purpose code</td>
<td>Never built wrong: the constraint was in the spec</td>
</tr>
</tbody>
</table>
<p>Three rows, one pattern. The only mistake that cost nothing was the one the spec prevented.</p>
<h2 id="mcp-connector">The MCP connector: agentic defaults trust too much</h2>
<p>The system has an <a href="https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/">MCP</a> connector, so an accountant can open Claude Desktop and type &#8220;create and send an invoice to Acme Ltd for the March retainer&#8221; without ever logging into the app. The agentic default for this kind of connector is full write access, because that&#8217;s the frictionless demo. We went the other way. The connector is a thin layer over the app&#8217;s own token-authenticated API: writes are draft-first and require confirmation, every AI-initiated change is audit-logged, and the token is role-scoped so the <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> cannot see or touch more than that accountant could. It&#8217;s stateless, single-request JSON, which lines up with where the <a href="https://blog.modelcontextprotocol.io/posts/2026-07-28/" target="_blank" rel="noopener noreferrer">2026-07-28 MCP specification</a> took the protocol. The AI holds no business logic. The invoice system stays the single source of truth, which matters for the same reason everything above matters: an agent that improvises accounting logic is an agent that improvises liabilities.</p>
<h2 id="specs-beat-review">Review catches what you know. Specs prevent what you don&#8217;t.</h2>
<p>Agentic tools never say &#8220;that&#8217;s unwise.&#8221; A human developer with export clients would have asked about the financial year before writing a numbering function. The agent shipped <code>date('Y')</code> without a flicker of doubt, and it would ship the void feature again tomorrow. We&#8217;ve written before about <a href="https://www.macronimous.com/blog/writing-clean-code-with-ai/">keeping AI-generated code clean</a> and about why <a href="https://www.macronimous.com/blog/vibe-coding-for-web-developers-amplify-your-flow-state-with-ai/">vibe coding needs guardrails before production</a>, but this build sharpened the point: cleanliness was never the problem. Every one of these mistakes was clean.</p>
<p>So put the domain in writing before the agent starts. For anything with statutory weight, our pre-build spec now answers:</p>
<ul class="mac-checklist">
<li>Which jurisdiction&#8217;s rules govern this system, and which documents are statutory records?</li>
<li>What is the full lifecycle of each document, including what may be voided, deleted, reverted, or never touched?</li>
<li>What are the numbering rules: sequence scope, gaplessness, and which fiscal calendar they follow?</li>
<li>What proof documents (FIRC, purpose codes, certificates) must exist as first-class records, not fields?</li>
<li>What happens when two people do the same thing at the same time, and which test proves it?</li>
<li>If an AI connector exists, what is its write model: scope, confirmation, and audit trail?</li>
</ul>
<p>Every &#8220;what if&#8221; question in that list is a test waiting to be written. Ask it early and the agent generates the right shape from the first commit, the way the payments table proved.</p>
<h2 id="open-source">The bottom line, and the code</h2>
<p>The agent was worth it. It typed the app in a fraction of the time it would have taken us by hand, and both incidents were cheaper to fix than a single GST notice would have been to receive. But the value of the build lived in the two moments a human said &#8220;not in India&#8221; and the one moment a spec made the question unnecessary. Speed came from the agent. Correctness came from the domain.</p>
<p>We&#8217;re releasing the system under MIT for other Indian software exporters and freelancers with the same compliance shape: a single-business kit that self-installs on ordinary PHP and MySQL shared hosting, with your data in your own database. It is deliberately narrow. Built around Indian GST and export-of-services rules, it is not a fit for domestic billing at other tax rates or for non-Indian firms without changes. <!-- INSERT PUBLIC REPO URL HERE, or remove this sentence if the repo isn't live at publish time: --> The repository is on GitHub; if you find a rule we got wrong, an issue telling us so is the most useful contribution you can make.</p>
<div class="mac-cta-box">
<h3>Shipping AI-built code to production?</h3>
<p>We pair agentic speed with 24 years of review discipline, on React, PHP, and <a href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">WordPress</a> builds where a wrong default has real-world costs.</p>
<p><a href="https://www.macronimous.com/services/custom-web-development/" class="mac-cta-button">Get your AI-built app reviewed</a>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/agentic-coding-domain-knowledge/">Agentic Coding Mistakes: Lessons From a Real App build</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/agentic-coding-domain-knowledge/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fluency Without Keystrokes: Web Developers in the AI Era</title>
		<link>https://www.macronimous.com/blog/fluency-without-keystrokes-web-developers-in-the-ai-era/</link>
					<comments>https://www.macronimous.com/blog/fluency-without-keystrokes-web-developers-in-the-ai-era/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Fri, 10 Jul 2026 05:10:20 +0000</pubDate>
				<category><![CDATA[AI Web Development]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AI Development]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[AI Coding]]></category>
		<category><![CDATA[AI in web development]]></category>
		<category><![CDATA[AI web development]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5259</guid>

					<description><![CDATA[<p>Will AI replace web developers? It will replace the part of the job that was always mechanical: translating a decided design into working syntax. It will not replace knowing what is being built, what it is built on, and why. I call that second skill fluency without keystrokes, and it is the one I have [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/fluency-without-keystrokes-web-developers-in-the-ai-era/">Fluency Without Keystrokes: Web Developers in the AI Era</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2026/07/Fluency-Without-Keystrokes.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-5263 size-large" src="https://www.macronimous.com/blog/wp-content/uploads/2026/07/Fluency-Without-Keystrokes-1024x576.png" alt="Will AI replace Web Developers" width="1024" height="576" /></a>
<div class="mac-direct-answer">
<p><strong>Will <a href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">AI</a> replace web developers?</strong> It will replace the part of the job that was always mechanical: translating a decided design into working syntax. It will not replace knowing what is being built, what it is built on, and why. I call that second skill fluency without keystrokes, and it is the one I have run a development agency on since I stopped writing production code in 2005.</p>
</div>
<h2>I wrote my last production code in 2005</h2>
<p>That is not a confession. It is the whole argument.</p>
<p>I learned to program in 1991 and coded for fourteen years. Then I founded <a href="http://www.Macronimous.com" target="_blank" rel="noopener">Macronimous</a>. Within just a couple of years, my developers were writing the code and I was doing something else. In the twenty-four years since, I have not shipped a single production function. And I have never been more useful to a development project than I am right now, in the middle of the AI era everyone says will end careers like the one I supposedly abandoned.</p>
<p>Here is what I did keep doing: I watched every shift from the inside. Desktop applications to web applications. Web apps to multi-tier architectures. Multi-tier to hosted solutions. Hosted to SaaS. Now SaaS to whatever AI-assisted development turns out to be. Each time, the syntax changed completely. Each time, the underlying questions did not change at all: where does the data live, who is allowed to touch it, what happens under load, what does the client actually need versus what they asked for.</p>
<p>If your value was typing, every one of those shifts hurt you. If your value was the questions, every one of those shifts made you more necessary, because suddenly a whole team needed someone who could tell which parts of their hard-won knowledge still applied.</p>
<h2>The knowledge that survived every shift</h2>
<p>People assume that when you stop coding, the knowledge decays uniformly. It does not. The syntax goes fast. I could not write a working React component from memory today, and I do not pretend otherwise to my team. But four things never decayed, because they are not syntax:</p>
<ul>
<li><strong>Databases.</strong> Normalization, indexing, why a query is slow, why &#8220;we&#8217;ll fix the schema later&#8221; is the most expensive sentence in software. Every stack I have watched arrive, from LAMP to serverless, sat on top of the same relational logic.</li>
<li><strong>Algorithms.</strong> Not competitive-programming puzzles. The working instinct for what is O(n) and what is O(n²), and why the feature that demos fine with 50 records dies with 50,000.</li>
<li><strong>A few languages, deeply.</strong> Not many, shallowly. Once you have genuinely understood two or three, you can read almost anything. Reading is the skill that matters now; more on that below.</li>
<li><strong>Servers and deployment.</strong> What actually happens between a browser request and a response. DNS, HTTP, processes, memory. Abstractions changed names five times; the physics never did.</li>
</ul>
<p>That list, plus two decades of translating client language into developer language and back, is the entire toolkit. Notice what is not on it: any framework, any editor, any AI tool. Those are all replaceable, and all of them have been replaced several times during my career.</p>
<h2>The &#8220;that&#8217;s not possible&#8221; test</h2>
<p>The clearest place this toolkit earns its keep is a moment every project manager knows: a developer says <em>that&#8217;s not possible</em>.</p>
<p>Sometimes they are right. But over the years, especially during native mobile app projects where platform limitations are real and frequent, I developed a simple piece of reasoning for that moment. If the feature is a reasonable thing for a business to want, then someone else has almost certainly wanted it before us. Which means either the tracks are already laid, in a third-party API, a plugin, an extension, a Stack Exchange thread, or a discussion buried in some project&#8217;s issue tracker, or the tracks are absent and we get to lay them ourselves.</p>
<p>So the answer to &#8220;that&#8217;s not possible&#8221; is rarely yes or no. It is: <em>not possible the way we are currently holding the problem.</em> Go look for the tracks. More than once we found them somewhere the team had not thought to look. More than once we did not, built the workaround ourselves, absorbed cost the project budget never covered, delivered the feature anyway, and then reused that solution on later projects until it paid for itself.</p>
<p><!-- BENNY: if you want to name one concrete project/feature here, this is the spot. One or two sentences max. The paragraph above stands on its own if not. --></p>
<p>Here is the part that matters for the AI question. That reasoning move is not a coding skill. I could not have implemented a single one of those workarounds myself. But I could not have made the move without knowing what databases, servers, and APIs can and cannot do, because &#8220;reasonable thing to want&#8221; is a judgment about the underlying system, not about the client&#8217;s mood. Strip out the fundamentals and the same sentence becomes an empty pep talk.</p>
<p>Now notice what AI does to this moment: it removes it. An <a href="https://www.macronimous.com/blog/agentic-coding-domain-knowledge/">agentic coding</a> platform never says <em>that&#8217;s not possible</em>. Ask, and it builds. Ask for something unwise, and it builds that too, politely and fast. The schema that will not survive real data, the authentication shortcut, the feature that quietly breaks three others. Something ships for every request.</p>
<p>That is a more dangerous failure mode than a developer&#8217;s premature no. A false &#8220;not possible&#8221; costs you a feature. A false &#8220;possible&#8221; costs you a production incident, months later, after the demo already convinced everyone. For twenty years my job was seeing through the first. The job now is seeing through the second, and it takes exactly the same knowledge of what is underneath. The tool stopped saying no, so someone in the room has to know when the answer should have been no.</p>
<h2>What AI actually replaces</h2>
<p>Fred Brooks sorted this out in 1986, before most of today&#8217;s developers were born. In <a href="https://www.cs.unc.edu/techreports/86-020.pdf" target="_blank" rel="noopener noreferrer">No Silver Bullet</a>, he split software difficulty into essence, the specification and design of the conceptual construct, and accident, the labor of representing that construct in code. His claim was that no tool would ever give an order-of-magnitude win, because tools only attack the accident.</p>
<p><a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI coding</a> tools are the strongest attack on the accident ever built. We use Claude Code, Copilot, and Cursor across our React and PHP work daily, and the keystroke savings are real. But look at what developers themselves report. In the <a href="https://survey.stackoverflow.co/2025/ai" target="_blank" rel="noopener noreferrer">Stack Overflow 2025 survey</a>, 84% of developers use or plan to use AI tools, yet the most-cited frustration, at 66%, is output that is almost right but not quite. And when asked why they would still turn to a human in an AI-heavy future, the top answer was simple: when they don&#8217;t trust the AI&#8217;s answer.</p>
<p>Almost right but not quite is precisely the failure mode that only essence-level knowledge can catch. The code compiles. The demo works. The schema decision buried inside it will cost you a migration in eight months. Somebody on the team has to be the person who sees that, and that person is doing my job, not the typist&#8217;s.</p>
<table class="styled-table">
<thead>
<tr>
<th>AI replaces</th>
<th>AI does not replace</th>
</tr>
</thead>
<tbody>
<tr>
<td>Translating a decided design into syntax</td>
<td>Deciding what should be built, and why</td>
</tr>
<tr>
<td>Boilerplate, scaffolding, test stubs</td>
<td>Knowing when the answer should have been no</td>
</tr>
<tr>
<td>Looking up API signatures and idioms</td>
<td>Judging whether an almost-right answer is safe to ship</td>
</tr>
<tr>
<td>First drafts of almost everything</td>
<td>Translating client language into system language and back</td>
</tr>
</tbody>
</table>
<h2>Fluency without keystrokes</h2>
<p>So here is the concept I have been circling, and the name I would put on it: <strong>fluency without keystrokes</strong>. It is the ability to read code, architecture, and constraints well enough to reason about them, without being the person who produces them. Knowing what is being built, what it is built on, and why.</p>
<div class="mac-key-point">
<p>AI replaces keystrokes. It has no opinion about what is worth building, what it sits on, or why. The person who holds those answers was never the typist, and cannot be replaced by a better typist.</p>
</div>
<p>I want to be precise about what this is not. It is not &#8220;ideas guy&#8221; hand-waving; the fluency has to be real, tested against actual systems, or the &#8220;that&#8217;s not possible&#8221; test collapses into wishful thinking. And it is not an excuse to skip the fundamentals; the whole point is that I earned the fluency the slow way, through eleven years of coding and twenty-four years of watching code fail in production. What the AI era changes is the ratio. You no longer need decades of keystrokes to keep the fluency alive. You need the foundations, plus the habit of reading and reasoning about what the machines produce. That is why I keep arguing for a <a href="https://www.macronimous.com/blog/controlled-ai-coding/">controlled approach to AI coding</a> rather than the pure <a href="https://www.macronimous.com/blog/vibe-coding-for-web-developers-amplify-your-flow-state-with-ai/">vibe coding flow</a>: control requires exactly this kind of fluency, and exercising it is how you keep it.</p>
<h2>So how much code should you learn?</h2>
<p>Enough to read it like a native. That is the honest answer, and it is less code than the bootcamps sell and more than the &#8220;just learn prompting&#8221; crowd admits.</p>
<p>The prevailing advice right now splits into two equally bad camps. One says syntax is dead, learn to prompt. The other says nothing has changed, grind the same curriculum harder. Both camps make the same mistake: they treat coding-as-typing as the job. The job was always understanding systems; typing was just how we proved it. AI removed the proof, not the requirement.</p>
<p>If I were starting out in web development today, this is what I would actually put the hours into:</p>
<ul class="mac-checklist">
<li>One backend language learned deeply enough to debug someone else&#8217;s code in it, not three learned to tutorial depth</li>
<li>SQL and data modeling, properly. This is the least glamorous item and the one that will pay you the longest</li>
<li>How the web actually works: HTTP, DNS, what a server does, where things run and why. Trace one full request end to end until nothing in it is magic</li>
<li>Reading AI-generated code critically, every day. Ask why it chose what it chose. This is the modern equivalent of code review under a senior, and it is how <a href="https://www.macronimous.com/blog/writing-clean-code-with-ai/">clean code with AI</a> actually happens</li>
<li>The client&#8217;s language. Requirements, constraints, budget, the gap between what they asked for and what they need. No model translates this yet, and every stage of the <a href="https://www.macronimous.com/blog/web-development-life-cycle-process-flow-diagram/">web development life cycle</a> depends on someone who can</li>
</ul>
<p>Five to ten years from now I do not know whether developers will still be typing much code. I am certain there will still be code, and certain that every team will still need at least one person who is fluent in what it means. In 2002 I bet my career that the fluency mattered more than the keystrokes. Twenty-four years later, AI just proved the bet.</p>
<h2>Frequently asked questions</h2>
<div id="fluency-keystrokes-faq">
<div class="faq-item">
<h3>Is web development still worth learning in 2026?</h3>
<p>Yes, if you learn it as systems knowledge rather than syntax production. Demand for people who can type framework code from memory is shrinking. Demand for people who can read code, model data, and judge whether AI output is safe to ship is not. Learn the second skill set; the first now comes bundled with it.</p>
</div>
<div class="faq-item">
<h3>How much coding should I learn if AI writes the code?</h3>
<p>Enough to debug someone else&#8217;s code in one backend language, write real SQL, and trace an HTTP request end to end. That is less breadth than the traditional curriculum and more depth than prompt-engineering courses offer. Reading fluency is the target; typing speed is now optional.</p>
</div>
<div class="faq-item">
<h3>Which web development skills can AI not replace?</h3>
<p>Deciding what should be built and why, translating client requirements into system constraints, judging &#8220;almost right&#8221; output before it reaches production, and recognizing when the answer should have been no. Agentic tools build whatever you ask, wise or not. All four skills require fundamentals; none of them require keystrokes.</p>
</div>
</div>
<div class="mac-cta-box">
<h3>Need a team that reasons past &#8220;that&#8217;s not possible&#8221;?</h3>
<p>Macronimous has been building web applications since 2002, through every platform shift including this one. We bring the fundamentals; the AI brings the keystrokes.</p>
<p><a class="mac-cta-button" href="https://www.macronimous.com/services/custom-web-development/">Discuss your web project</a></p>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/fluency-without-keystrokes-web-developers-in-the-ai-era/">Fluency Without Keystrokes: Web Developers in the AI Era</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/fluency-without-keystrokes-web-developers-in-the-ai-era/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The Code Your AI Wants to Delete Is Load-Bearing</title>
		<link>https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/</link>
					<comments>https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Thu, 18 Jun 2026 12:17:32 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Vibe Coding]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[AI code refactoring]]></category>
		<category><![CDATA[AI coding risks]]></category>
		<category><![CDATA[Chesterton's fence]]></category>
		<category><![CDATA[git blame]]></category>
		<category><![CDATA[offshore development]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5246</guid>

					<description><![CDATA[<p>AI technical debt is what you get when an AI assistant refactors code it has never seen and deletes anything whose purpose isn&#8217;t obvious, including the guards that quiet edge-case bugs. The clean diff hides the lost context: speed today, a production failure next quarter. The fix isn&#8217;t banning AI. It&#8217;s knowing which old code [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">The Code Your AI Wants to Delete Is Load-Bearing</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2026/06/AI-Technical-Debt.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-5248 size-large" src="https://www.macronimous.com/blog/wp-content/uploads/2026/06/AI-Technical-Debt-1024x576.png" alt="AI Technical Debt" width="1024" height="576" /></a>
<div class="mac-direct-answer">
<p><strong><a href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">AI</a> technical debt</strong> is what you get when an AI assistant refactors code it has never seen and deletes anything whose purpose isn&#8217;t obvious, including the guards that quiet edge-case bugs. The clean diff hides the lost context: speed today, a production failure next quarter. The fix isn&#8217;t banning AI. It&#8217;s knowing which old code is a load-bearing fence and which is just dead cruft.</p>
</div>
<p>It usually goes like this. A developer points Cursor or Copilot at a gnarly legacy file and asks it to clean things up. The model does what it&#8217;s good at and collapses a nest of conditionals into something half the length and twice as readable. Tests pass locally. The diff looks clean. It ships. A week later, a quiet edge case that one of those &#8220;redundant&#8221; branches used to catch shows up in production, on a client site nobody has opened in years.</p>
<p>There&#8217;s a hundred-year-old name for the mistake. <a href="https://www.chesterton.org/taking-a-fence-down/" target="_blank" rel="noopener noreferrer">Chesterton&#8217;s Fence</a> goes like this: you find a fence across a road with no obvious purpose. The reckless reformer says, &#8220;I don&#8217;t see the use of this, clear it away.&#8221; The wiser one answers: go find out why it&#8217;s there first, then you may remove it. Every codebase older than its current team is full of fences. The validation that looks paranoid. The handler for a case that &#8220;can&#8217;t happen.&#8221; The query that dodges an obvious index for reasons lost to time. We are now handing those codebases to tools that are fast, confident, and carry zero memory of why anything was built.</p>
<h2>The clean diff is the trap, not the safeguard</h2>
<p>The standard advice sounds responsible: let AI move fast, then review the diff. Clean change, green tests, merge. The problem is that a diff shows you what changed, not what the change <em>knew</em>. A deleted block leaves no trace of the bug it was preventing. The tests pass because nobody ever wrote one for that edge case, which is precisely why there was a guard sitting there instead of a test. So you get a clean diff, a green build, and a landmine reburied for next quarter. The review ritual feels like diligence while it quietly rubber-stamps the deletion of context.</p>
<p>None of this is an argument against AI in the workflow. We run Claude Code, Copilot, and Cursor across React and PHP every day, and the speed is real. It&#8217;s an argument against confusing velocity with progress when you&#8217;re standing in code you didn&#8217;t write. The discipline of <a href="https://www.macronimous.com/blog/writing-clean-code-with-ai/">writing clean code with AI</a> starts with knowing when not to let it touch something.</p>
<h2>Why this bites agencies hardest</h2>
<p>If you run an offshore or white-label shop, the exposure is sharper than it is for a product team that has lived on one codebase for years.</p>
<ul>
<li><strong>You inherit.</strong> Most of what we touch was built by someone else, often years ago, for a client whose original developer is long gone. The fence and the person who built it both left before we arrived.</li>
<li><strong>Juniors lean on it hardest.</strong> A mid-level developer using AI to cover gaps is making the right move, until the model suggests something elegant and wrong and they don&#8217;t yet have the scars to tell the difference. In a pull request, elegant-and-correct and elegant-and-wrong look identical.</li>
<li><strong>The data risk is its own category.</strong> Pasting a client&#8217;s source, an API key, or a slice of proprietary logic into a public model is a one-keystroke NDA breach. That isn&#8217;t a code-quality problem. It&#8217;s a get-fired problem.</li>
</ul>
<p>This is the same pattern we flagged in <a href="https://www.macronimous.com/blog/hidden-technical-debt-wordpress-seo/">hidden technical debt</a>: the costliest problems are the ones nobody can see in a quick review.</p>
<h2>Not every old line is a fence</h2>
<p>Here&#8217;s where the lazy reading of Chesterton, &#8220;never delete old code,&#8221; is as wrong as the reckless one. Plenty of old code is genuinely dead: commented-out blocks, an abandoned feature flag, a function nothing calls anymore. That is not a fence. It&#8217;s litter, and AI is excellent at hauling it away. Let it. The whole skill is telling the two apart.</p>
<table class="styled-table">
<thead>
<tr>
<th>Signal</th>
<th>It&#8217;s a fence (keep, investigate)</th>
<th>It&#8217;s litter (safe to cut)</th>
</tr>
</thead>
<tbody>
<tr>
<td>Purpose</td>
<td>Not obvious, but something still depends on it</td>
<td>None; clearly superseded or dead</td>
</tr>
<tr>
<td>History</td>
<td>Added deliberately, often right after a bug or incident</td>
<td>Left behind by a past refactor or a removed feature</td>
</tr>
<tr>
<td>Coverage</td>
<td>Guards a case no test actually exercises</td>
<td>Nothing references or runs it</td>
</tr>
<tr>
<td>Right move</td>
<td>Run git blame, read the ticket, then decide</td>
<td>Delete it and move on</td>
</tr>
</tbody>
</table>
<p>When in doubt, treat it as a fence. The cost of investigating a line that turns out to be litter is two minutes. The cost of deleting a fence is a production incident on a client&#8217;s site.</p>
<h2>Make the human own the commit</h2>
<p>The rule we land on isn&#8217;t &#8220;trust the AI&#8221; or &#8220;distrust the AI.&#8221; It&#8217;s a short set of habits that cost time on purpose. The human owns the commit: &#8220;the AI wrote it&#8221; explains nothing, and if you push code, you defend every line in review. The AI builds inside your guardrails, not its own: state the stack versions, conventions, and component structure explicitly, every time, or it will invent a perfectly reasonable pattern that contradicts the three already in the project. And before you let a tool rewrite or remove anything, you find out why it&#8217;s there. We&#8217;ve written up the full workflow as <a href="https://www.macronimous.com/blog/controlled-ai-coding/">Controlled AI Coding</a>, but the pre-flight before touching existing code fits on one card:</p>
<ul class="mac-checklist">
<li>Run <a href="https://git-scm.com/docs/git-blame" target="_blank" rel="noopener noreferrer">git blame</a> on the block and read the commit message</li>
<li>Check the original issue or ticket for the why, not just the what</li>
<li>Confirm whether a guard is covering an edge case the diff would silently remove</li>
<li>Make sure the change matches existing stack versions and conventions</li>
<li>Verify no client source, credentials, or keys are going into the prompt</li>
</ul>
<p>This is not about slowing everyone down. It&#8217;s about spending two minutes on the handful of lines that are actually fences, and letting AI fly on everything else. The same caution applies when the speed feels intoxicating; the high of <a href="https://www.macronimous.com/blog/vibe-coding-for-web-developers-amplify-your-flow-state-with-ai/">vibe coding</a> is exactly when fences get cleared without anyone noticing.</p>
<h2>The one thing AI can&#8217;t bring to the review</h2>
<p>AI doesn&#8217;t tear down fences because it&#8217;s reckless. It tears them down because it has no memory and no stake. It was never paged at 2 a.m. by the bug that guard was written to stop, so it feels no caution. Which means the caution is now entirely ours.</p>
<div class="mac-key-point">
<p>The fences in a codebase you inherited are a map of everything the last team learned the hard way and forgot to write down. AI can&#8217;t read that map.</p>
</div>
<p>Reading that map, and knowing which fences to keep, is quietly becoming one of the more valuable things a developer can do, right at the moment the tools are most eager to skip it. Treat it the way <a href="https://martinfowler.com/bliki/TechnicalDebt.html" target="_blank" rel="noopener noreferrer">Martin Fowler frames technical debt</a>: something you take on deliberately and pay down on purpose, not something an assistant runs up for you while you watch the diff scroll past.</p>
<div class="mac-cta-box">
<h3>Want code refactored with the history left intact?</h3>
<p>We&#8217;ve maintained other people&#8217;s codebases since 2002. We know a load-bearing fence when we see one, and we use AI without letting it quietly rewrite your architecture.</p>
<p><a class="mac-cta-button" href="https://www.macronimous.com/services/custom-web-development/">Get senior developers on your build</a></p>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">The Code Your AI Wants to Delete Is Load-Bearing</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>RAG for Web Developers: When to Build It and When Not To</title>
		<link>https://www.macronimous.com/blog/rag-for-web-developers-when-to-build-it-and-when-not-to/</link>
					<comments>https://www.macronimous.com/blog/rag-for-web-developers-when-to-build-it-and-when-not-to/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Thu, 11 Jun 2026 06:02:18 +0000</pubDate>
				<category><![CDATA[RAG]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[AI Development]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5234</guid>

					<description><![CDATA[<p>RAG (retrieval-augmented generation) is an architecture, not a model. You chunk your content, embed it into a vector store, retrieve the most relevant chunks at query time, and feed them into an LLM so it answers from your data instead of its training memory. It exists to solve one problem: a knowledge base too large [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/rag-for-web-developers-when-to-build-it-and-when-not-to/">RAG for Web Developers: When to Build It and When Not To</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<a href="https://www.macronimous.com/blog/wp-content/uploads/2026/06/RAG-for-Web-Developers.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-5237 size-full" src="https://www.macronimous.com/blog/wp-content/uploads/2026/06/RAG-for-Web-Developers.png" alt="RAG for Web Developers" width="1672" height="941" /></a>
<div class="mac-direct-answer">
<p><strong>RAG (retrieval-augmented generation)</strong> is an architecture, not a model. You chunk your content, embed it into a vector store, retrieve the most relevant chunks at query time, and feed them into an LLM so it answers from your data instead of its training memory. It exists to solve one problem: a knowledge base too large to fit in the model&#8217;s context window.</p>
</div>
<h2>The word &#8220;RAG&#8221; is doing too much work in client conversations</h2>
<p>Most of the confusion comes from collapsing three separate things into one word. A website is a corpus — raw source content. RAG is a pipeline that runs over a corpus, the architecture <a href="https://arxiv.org/abs/2005.11401" target="_blank" rel="noopener noreferrer">introduced by Lewis et al. in 2020</a>. And the thing where &#8220;ChatGPT already knows about my site&#8221; is a third mechanism entirely. If you&#8217;re a developer fielding the &#8220;should we build a RAG?&#8221; question from a client or a founder, the first job is to pull those three apart. They behave differently, you control them differently, and only one of them is something you actually build.</p>
<h2>Your website is the food, not the kitchen</h2>
<p>A site is input. RAG is the machine that eats it. Saying &#8220;our website is already a RAG&#8221; is like saying a pantry is already a meal. The pages are content; retrieval-augmented generation is the chunk-embed-retrieve-generate loop that turns content into grounded, cited answers on demand. No loop, no RAG — just files on a server.</p>
<div class="mac-key-point">
<p>RAG isn&#8217;t &#8220;AI that reads your site.&#8221; It&#8217;s the plumbing that decides which slice of your content the model sees at the exact moment it answers a question.</p>
</div>
<h2>Three ways an LLM touches your content — only one is yours</h2>
<p>This is the table I wish more people saw before greenlighting a build. The difference between these rows is who owns the pipeline.</p>
<table class="styled-table">
<thead>
<tr>
<th>Mechanism</th>
<th>When it happens</th>
<th>Who controls it</th>
<th>Reliable?</th>
</tr>
</thead>
<tbody>
<tr>
<td>Training ingestion</td>
<td>Months before you ask — baked into the weights</td>
<td>The model vendor</td>
<td>No. Stale, lossy, your small site barely registers</td>
</tr>
<tr>
<td>Live <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> search (ChatGPT Search, Perplexity, AI-with-web)</td>
<td>At query time, fetching your live pages</td>
<td>The engine — you only influence it</td>
<td>Partly. This is the AEO game</td>
</tr>
<tr>
<td>Your own RAG</td>
<td>At query time, over content you chose</td>
<td>You</td>
<td>Yes — current, grounded, cited, debuggable</td>
</tr>
</tbody>
</table>
<p>The middle row is the one people mistake for RAG. It <em>is</em> retrieval-augmented generation — but it&#8217;s the engine&#8217;s pipeline, not yours. You shape it through <a href="https://www.macronimous.com/blog/answer-engine-optimization-aeo-optimizing-for-ai-powered-search/">answer engine optimization</a>, clean structure, and machine-readable markup. You don&#8217;t own a single line of it. Treating AEO and &#8220;build a RAG&#8221; as the same project is how budgets get wasted.</p>
<h2>The question RAG actually answers</h2>
<p>RAG earns its place when your knowledge base is bigger than the context window. That&#8217;s the whole reason the architecture exists. You can&#8217;t paste a thousand support articles into a prompt, so you retrieve the handful that matter and pass only those. Retrieval is a workaround for a size constraint.</p>
<p>Which means the real design question is never &#8220;should we use RAG?&#8221; It&#8217;s &#8220;is my content bigger than the window?&#8221; A modern model comfortably holds 200K tokens — roughly a 150-page book. If your entire corpus fits inside that, retrieval is solving a problem you don&#8217;t have.</p>
<h2>For a small site, context-stuffing wins</h2>
<p>If a client wants a chatbot for a fifty-page brochure site, the correct architecture is not RAG — it&#8217;s context-stuffing. Put the full content in the system prompt and let the model answer over all of it, every time. Compare the two honestly:</p>
<table class="styled-table">
<thead>
<tr>
<th></th>
<th>Context-stuffing</th>
<th>RAG</th>
</tr>
</thead>
<tbody>
<tr>
<td>Setup</td>
<td>Paste content into the prompt</td>
<td>Chunking, embeddings, vector DB, retrieval tuning</td>
</tr>
<tr>
<td>Accuracy</td>
<td>Model sees everything — no retrieval misses</td>
<td>Only as good as what retrieval surfaces</td>
</tr>
<tr>
<td>Infra to maintain</td>
<td>None</td>
<td>Vector store, re-embedding on content change</td>
</tr>
<tr>
<td>Right when</td>
<td>Corpus fits the window</td>
<td>Corpus exceeds the window</td>
</tr>
</tbody>
</table>
<p>Building a vector pipeline over fifty pages is engineering theater. It looks sophisticated and buys you nothing but a database to babysit. The instinct to reach for RAG by default is the same instinct that over-engineers a CMS for a five-page site — resist it the same way you&#8217;d resist any premature abstraction, the way you&#8217;d approach <a href="https://www.macronimous.com/blog/controlled-ai-coding/">controlled AI coding</a> rather than letting the tool decide the architecture.</p>
<h2>When RAG is genuinely the right call</h2>
<p>It flips the moment volume shows up. Build RAG when:</p>
<ul class="mac-checklist">
<li>The corpus is large enough that it can&#8217;t fit in one context window — hundreds of documents, long PDFs, sprawling FAQs.</li>
<li>Content changes often and answers must reflect the current version, not a snapshot frozen in a prompt.</li>
<li>You need citations back to source — the chunk that produced the answer is the receipt.</li>
<li>You&#8217;re multi-tenant and each client&#8217;s data must stay walled off from every other client&#8217;s.</li>
<li>Cost matters at scale — sending only the retrieved slice is cheaper per query than stuffing everything.</li>
</ul>
<p>That last cluster is where most real product work lives. A managed chat service across many client sites, a support assistant over a deep documentation set, an internal tool over years of project files — those have the corpus that justifies the pipeline. Your own small marketing site almost never does.</p>
<h2>What to actually do for a site like yours</h2>
<p>For the agency&#8217;s own site, the answer is: don&#8217;t build a RAG. Point your effort at the live-search loop you don&#8217;t own — structure, schema, and clean answer blocks so the engines that fetch your pages can extract them. That&#8217;s the same discipline as <a href="https://www.macronimous.com/blog/javascript-seo-techniques-canonicalization-and-schema-markup/">JavaScript SEO and schema markup</a>, extended to AI readers. Reserve real RAG builds for the client products where content volume is genuine and you can charge for the <a href="https://www.macronimous.com/services/custom-web-development/">custom development work</a>.</p>
<p>One honest exception: if your blog grows into hundreds of posts and you want an &#8220;ask our blog&#8221; assistant with citations, a lightweight RAG over the blog archive — not the whole site — starts to make sense. Even then, go hybrid: full context for the handful of core service pages, retrieval only for the long tail. And whatever you build, keep the codebase legible — RAG glue is exactly the kind of code that rots fast if you don&#8217;t <a href="https://www.macronimous.com/blog/writing-clean-code-with-ai/">write clean code with AI</a> from the start.</p>
<h2>You probably don&#8217;t need one, and here&#8217;s the tell</h2>
<p>Most agency and small-business sites fall on the skip side. You can decide in under a minute. Skip RAG if any of these are true:</p>
<ul class="mac-checklist">
<li>Your whole site fits in a single context window: a few dozen pages, a handful of PDFs.</li>
<li>The content is stable. It doesn&#8217;t change weekly, so a snapshot in the prompt won&#8217;t go stale fast.</li>
<li>You don&#8217;t need per-answer citations back to a specific source chunk.</li>
<li>It&#8217;s single-tenant: one brand, one body of content, no data-isolation requirement.</li>
<li>A chatbot here is a nice-to-have, not the product itself.</li>
</ul>
<p>Macronimous is the textbook skip. Fifty-odd pages, stable content, one brand, no citation requirement. Stuffing the full content into the system prompt is more accurate and zero-maintenance next to a vector pipeline. If your client looks like that, the honest answer is &#8220;you don&#8217;t need RAG, and here&#8217;s the cheaper thing that works.&#8221;</p>
<h2>Where to start if you actually do</h2>
<p>When the corpus is genuinely too big, you have two roads: a framework that hides the plumbing (LlamaIndex, LangChain), or rolling the four steps yourself. For a first real build, roll it. You&#8217;ll understand every failure mode, and the whole thing is smaller than it looks.</p>
<ol>
<li><strong>Use the store you already run.</strong> If you&#8217;re on Supabase, <a href="https://supabase.com/docs/guides/ai" target="_blank" rel="noopener noreferrer">pgvector</a> is right there, no new vendor. Pinecone or Qdrant are fine for a dedicated store, but don&#8217;t add infrastructure you don&#8217;t need on day one.</li>
<li><strong>Chunk deliberately.</strong> Split content into roughly 500 to 800 token pieces with a little overlap, on real boundaries like headings and sections, not blind character counts. Bad chunking is the top reason RAG answers come out vague.</li>
<li><strong>Embed and store.</strong> Run each chunk through an <a href="https://platform.openai.com/docs/guides/embeddings" target="_blank" rel="noopener noreferrer">embeddings model</a> (OpenAI text-embedding-3-small is cheap and good enough to start) and store the vector next to the source text and a link back to the page.</li>
<li><strong>Retrieve, then generate.</strong> On a query, embed the question, pull the top few chunks by similarity, and pass only those into the model with an instruction to answer from them and cite the source. That&#8217;s the whole loop.</li>
</ol>
<p>Build it over one real content set end to end before you generalize. The wiring is easy. The hard part is chunking quality and retrieval tuning, and you only learn those by watching real answers and fixing what retrieval missed. Treat version one as a measurement tool, not a finished product.</p>
<h2>The short version for your next standup</h2>
<p>RAG is a size workaround, not a magic AI feature. Your website is a corpus, not a pipeline. The &#8220;LLMs already learned my site&#8221; effect is unreliable and not yours to control — AEO is how you influence the part you can. Build RAG when the content is too big for the window and you need it current and cited. For everything smaller, stuff the context and move on. Knowing which problem you have is most of the job, and it&#8217;s the same judgment that runs through any sound <a href="https://www.macronimous.com/blog/seo-strategy-2026/">SEO strategy for 2026</a>.</p>
<div class="mac-cta-box">
<h3>Figuring Out How AI Engines See Your Site?</h3>
<p>We help agencies and businesses get cited by AI search and decide where RAG actually belongs in the build — and where it&#8217;s just overhead.</p>
<p><a class="mac-cta-button" href="https://www.macronimous.com/services/digital-marketing/outsource-seo-services/">Get an AI Visibility Review</a></p>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/rag-for-web-developers-when-to-build-it-and-when-not-to/">RAG for Web Developers: When to Build It and When Not To</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/rag-for-web-developers-when-to-build-it-and-when-not-to/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>EmDash vs WordPress</title>
		<link>https://www.macronimous.com/blog/emdash-vs-wordpress/</link>
					<comments>https://www.macronimous.com/blog/emdash-vs-wordpress/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Tue, 07 Apr 2026 11:50:22 +0000</pubDate>
				<category><![CDATA[Content Management Systems]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[EmDash]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordPress Development]]></category>
		<category><![CDATA[CMS War]]></category>
		<category><![CDATA[Wordpress development]]></category>
		<category><![CDATA[WordPress migration]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5171</guid>

					<description><![CDATA[<p>EmDash vs WordPress: Is Cloudflare’s CMS a True Successor? A Technical and Agency Risk Assessment Your agency just recommended a new platform. They called it modern, secure, and AI-native. They said it’s the spiritual successor to WordPress. The platform is Cloudflare’s EmDash, and this is the pitch you’ll hear at every tech conference this year. [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/emdash-vs-wordpress/">EmDash vs WordPress</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2><a href="https://www.macronimous.com/blog/wp-content/uploads/2026/04/WordPress-vs-EmDash.jpg"><img loading="lazy" decoding="async" class="aligncenter wp-image-5173 size-large" src="https://www.macronimous.com/blog/wp-content/uploads/2026/04/WordPress-vs-EmDash-1024x576.jpg" alt="WordPress vs EmDash" width="1024" height="576" /></a></h2>
<h2>EmDash vs WordPress: Is Cloudflare’s CMS a True Successor?</h2>
<h3>A Technical and Agency Risk Assessment</h3>
<p>Your agency just recommended a new platform. They called it modern, secure, and AI-native. They said it’s the spiritual successor to <a href="https://www.macronimous.com/blog/ai-website-builder-vs-wordpress-for-seo/">WordPress</a>. The platform is Cloudflare’s <a href="https://blog.cloudflare.com/emdash-wordpress/" target="_blank" rel="noopener">EmDash</a>, and this is the pitch you’ll hear at every tech conference this year.</p>
<p>Before you sign off, there are things worth examining.</p>
<p>At Macronimous, we’ve navigated every major web platform evolution since 2002. We’ve seen Joomla peak and fade, watched Wix and Squarespace mature, evaluated Webflow’s rise, and stress-tested <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> site builders like Figma Sites and Lovable. The pattern is always the same: architectural change is presented as automatic progress. It isn’t.</p>
<p><a href="https://github.com/emdash-cms/emdash" target="_blank" rel="noopener">EmDash</a> is not a <a href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">WordPress</a> replacement. It is a pivot into a fundamentally different—and restrictive—model. It is serverless, edge-first, and tightly coupled to a single vendor’s ecosystem. For anyone responsible for a business’s long-term digital ROI, that distinction is everything.</p>
<h3>1. The Technical Pivot: V8 Isolates vs. The Hook System</h3>
<p>The core argument for EmDash is security. Let’s examine what that security actually costs.</p>
<ul>
<li><strong>WordPress:</strong> Plugins operate with full access to the database and filesystem. This creates infinite flexibility but a massive surface area for risk.</li>
<li><strong>EmDash:</strong> Plugins run inside V8 isolates with a capability-based permission model. Nothing is accessible unless explicitly granted.</li>
</ul>
<p>The V8 isolate model does solve the “rogue plugin” problem. But it introduces significant developer friction. In WordPress, extending behaviour is a simple <code>add_action</code> hook—a few lines of PHP and you’re done. In EmDash, you are designing interaction contracts. You must define permissions upfront, manage isolated execution contexts, and pass structured data across rigid boundaries. Even a simple feature—adding a custom field to a contact form, say—requires navigating this permission architecture.</p>
<p><strong>The Verdict:</strong> You trade open extensibility for controlled execution. The runtime is safer, but development cycles slow down and the cognitive load increases for even the simplest customisations. For agencies billing by the hour, that friction becomes a direct cost to the client.</p>
<h3>2. The State Problem: Edge-Native vs. ACID Compliance</h3>
<p>EmDash runs entirely on Cloudflare Workers, eliminating the traditional origin server.</p>
<ul>
<li><strong>WordPress Model:</strong> PHP + MySQL at the origin, optimised with Redis caching and CDN delivery.</li>
<li><strong>EmDash Model:</strong> Code runs at the edge; data lives in D1, Cloudflare’s SQLite-based distributed database.</li>
</ul>
<p>For static marketing sites, this is lightning fast. Pages load from the nearest edge node with minimal latency. But for anything involving complex data relationships, the edge is a liability.</p>
<p><strong>Consider a real scenario:</strong> an E-commerce site processing concurrent orders during a flash sale. Two customers attempt to purchase the last unit of a product at the same time, hitting different edge nodes. With MySQL’s ACID compliance, one transaction succeeds and the other fails cleanly. With D1’s eventual consistency model, both nodes may report the item as available. The result is an oversold product, a customer service headache, and a bug that is nearly impossible to reproduce in testing because it depends on network timing between edge nodes.</p>
<p>The same risk applies to multi-role dashboards, user progress tracking in EdTech platforms, and any application where two users can modify the same record.</p>
<p><strong>The Verdict:</strong> You aren’t eliminating infrastructure complexity; you’re trading server complexity for data consistency risks. For static sites, the trade-off is favourable. For transactional applications, it’s dangerous.</p>
<h3>3. The “AI-Native” Claim: Marketing Differentiator or Technical Necessity?</h3>
<p>EmDash leans heavily on being “AI-native” via the <a href="https://www.macronimous.com/blog/intro-to-ucp-for-developers/">Model Context Protocol</a> (<a href="https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/">MCP</a>). This deserves a more careful look than the marketing copy provides.</p>
<p>MCP is a genuinely interesting protocol. We use it ourselves in our internal workflows for connecting AI tools to live data sources. But the question isn’t whether MCP has value—it does—it’s whether you need to switch your entire CMS to get it.</p>
<p>You don’t. WordPress already provides structured data through its REST API and WP-GraphQL. Any AI tool that can consume an API can already work with a WordPress site. MCP integration can be layered on top of an existing WordPress installation without replacing the foundation. Switching your entire backend for a native AI protocol is like rebuilding your house because you want a better thermostat.</p>
<p>There is also what we call the <strong>AI Builder Paradox</strong>. We’ve tested this extensively with platforms like Figma Sites and Lovable. AI is excellent at generating standard layouts: hero sections, feature grids, and testimonial carousels. The output looks polished in a demo. But the moment a client requires unique business logic—a custom pricing calculator that pulls from a third-party API, a booking flow with conditional availability rules, a member portal with role-based access—the AI hits a wall. It generates the skeleton but cannot reason about the business rules.</p>
<p>We’ve seen AI-generated sites ship with hardcoded sample data in production, with forms that submit to nowhere, and with responsive layouts that collapse on tablet viewports. These are not edge cases; they are the norm once you move beyond template-grade output.</p>
<p><strong>The Verdict:</strong> MCP is a useful protocol, not a reason to change platforms. AI-native is a marketing differentiator, not a technical necessity. The real question is whether your CMS gives AI tools clean data to work with—and WordPress already does.</p>
<h3>4. SEO Reality: Guardrails vs. Open Air</h3>
<p>This is where the risk becomes most tangible for business owners.</p>
<p>WordPress has a mature <a href="https://www.macronimous.com/blog/hidden-technical-debt-wordpress-seo/">SEO</a> ecosystem. Plugins like Yoast and RankMath handle canonical tags, XML sitemaps, Open Graph metadata, schema markup, and crawl directives automatically. Misconfigure something, and these tools flag it before it reaches production. The safety net is deep and well-tested across millions of sites.</p>
<p>EmDash, built on Astro, has no such safety net. SEO implementation is entirely manual and written in TypeScript.</p>
<p>Here’s what an invisible failure looks like in practice: a developer deploys an Astro page with server-side rendering (SSR) but introduces a hydration mismatch. The page looks fine in a browser. But Google’s crawler sees the server-rendered version, which may be missing the <a href="https://www.macronimous.com/blog/seo-jargon-beginners-guide-to-10-confusing-seo-terms-explained/">canonical tag</a>, the <a href="https://www.macronimous.com/blog/structured-data-rich-results-schema-types-and-faq-pages-what-google-cares-and-doesnt/">structured data</a>, or even the primary heading. Over the following weeks, the page silently drops in rankings. By the time it shows up in Search Console as a coverage issue, you’ve already lost weeks of organic traffic.</p>
<p>Or consider a simpler scenario: a missing canonical tag on a paginated archive. In WordPress with Yoast, this is handled automatically. In EmDash, it’s a line of TypeScript that someone has to remember to write, test, and maintain across every template. Forget it once, and you’ve created a duplicate content problem that dilutes your domain authority.</p>
<p><strong>The Verdict:</strong> WordPress gives you guardrails. EmDash gives you open air. For an agency managing SEO across multiple client sites, the risk of invisible, silent failure is not theoretical—it’s operational.</p>
<p>Beyond the technical architecture, there are practical realities that affect your budget, your team, and your long-term ownership of your digital assets.</p>
<p><strong>The Pioneer Tax:</strong> When an agency recommends an unproven, niche platform like EmDash, your project budget often stops funding your business goals and starts funding the agency’s Research and Development. Because EmDash lacks a mature marketplace, standard features—contact forms, SEO tools, analytics integration—must be custom-engineered from scratch. You are effectively paying for a developer&#8217;s learning curve and the creation of basic infrastructure that already exists off-the-shelf in the WordPress ecosystem.</p>
<ul>
<li><strong>Predictable Rent vs. Algorithmic Billing:</strong> WordPress has a predictable total cost of ownership, often with a fixed monthly hosting fee. EmDash uses usage-based billing where you pay for &#8220;CPU time&#8221;—every request and edge computation is metered. A traffic spike that WordPress handles with a simple caching plugin becomes an unpredictable, volatile invoice on the Cloudflare stack.</li>
<li><strong>The Talent Problem:</strong> WordPress has a global developer talent pool. If your lead developer leaves, you can find a replacement. EmDash requires a niche combination of TypeScript, Astro, and Cloudflare Workers expertise. If your key developer moves on, the client isn’t just losing a team member—they are potentially stranded on a platform that very few people know how to maintain.</li>
<li><strong>The Ownership Trap:</strong> This is the most critical issue. WordPress is protected by the GPL—a license that guarantees the user’s rights to own, move, and modify their code. EmDash uses the MIT license for its source code, but the <strong>runtime is proprietary</strong> to Cloudflare. If you decide to leave Cloudflare due to pricing changes or service issues, you don’t migrate; you rewrite. Recommending this level of vendor lock-in without disclosure is a fundamental breach of trust regarding digital asset ownership.</li>
</ul>
<h3>6. The Macronimous Stance: Technical Curators, Not Just Builders</h3>
<p>The “No-Code” and “AI-Native” era hasn’t eliminated the need for professional guidance. It has changed our job description.</p>
<p>We are no longer just builders. We are Technical Curators. Our role is to evaluate every new platform, protocol, and tool—and to make an honest recommendation based on what actually serves the client’s long-term interests. Not what generates the most exciting demo. Not what looks best in a pitch deck. What works, what lasts, and what you’ll actually own five years from now.</p>
<p>We believe in a hybrid future where AI strengthens the open web—acting as a security auditor, a content assistant, and a development accelerator within established ecosystems—rather than a corporate future where the web is locked behind a single vendor’s sandbox.</p>
<p>We test everything so our clients don’t have to. Right now, that means we are:</p>
<ul>
<li>Benchmarking D1’s consistency under write-heavy, concurrent scenarios to understand its real-world limits.</li>
<li>Monitoring the EmDash community for genuine, non-corporate contributions.</li>
<li>Mapping exit strategies to quantify the true cost of migrating away from the Cloudflare stack.</li>
</ul>
<p>Until a platform demonstrates the maturity, the ecosystem depth, and the ownership guarantees that WordPress provides, our recommendation remains clear.</p>
<p><strong>WordPress remains the industry’s operating system.</strong></p>
<p>It balances flexibility, stability, and—most importantly—ownership. We build for the next decade. Not the next trend.</p>
<div class="mac-cta-box">
<h3>Expert Guidance for Your Next Platform Move</h3>
<p>Are you weighing the &#8220;Pioneer Tax&#8221; of EmDash against the proven stability of WordPress? Whether you need a secure WordPress build, a specialized EmDash implementation, or a strategic migration assessment, we provide the technical vetting required for long-term ROI.</p>
<p>We evaluate the architecture, the consistency risks, and the exit strategies so you don&#8217;t have to.</p>
<p><a class="mac-cta-button" href="http://www.macronimous.com/contact-us/">Get a Free Technical Consultation</a></p>
</div>
<section id="aeo-faq-section">
<h2>Frequently Asked Questions</h2>
<div class="faq-item">
<h3>Is EmDash really more secure than my current WordPress site?</h3>
<div>
<p>Yes, from a structural standpoint. While WordPress plugins traditionally operate with full access to the database and filesystem, creating a large surface area for risk, EmDash runs plugins inside &#8220;V8 isolates&#8221; with a capability-based permission model. This means a plugin cannot access your data unless explicitly granted permission, effectively solving the &#8220;rogue plugin&#8221; problem.</p>
</div>
</div>
<div class="faq-item">
<h3>Will moving to a serverless platform like EmDash save me money on hosting?</h3>
<div>
<p>It depends on your traffic patterns. WordPress typically runs on a predictable, fixed-cost model, often as low as five to ten dollars a month. EmDash is serverless and bills by &#8220;CPU time&#8221;—meaning every request and function execution is metered. While this sounds efficient, a sudden traffic spike or a bot attack could result in an unpredictable and volatile monthly bill compared to a stable, fixed hosting plan.</p>
</div>
</div>
<div class="faq-item">
<h3>Do I need a new CMS to make my business &#8220;AI-ready&#8221;?</h3>
<div>
<p>Not necessarily. While EmDash is marketed as &#8220;AI-native&#8221; via the Model Context Protocol (MCP), your existing WordPress site already provides structured data through its REST API and WP-GraphQL. Any AI tool that can consume an API can already work with a WordPress site. You don&#8217;t need to rebuild your entire house just because you want a better thermostat; MCP integration can often be layered onto existing foundations.</p>
</div>
</div>
<div class="faq-item">
<h3>Does the &#8220;Edge-Native&#8221; architecture handle e-commerce and transactional data reliably?</h3>
<div>
<p>This is a significant risk area. WordPress relies on MySQL’s ACID compliance to ensure data consistency during concurrent tasks, such as two people buying the last item in stock simultaneously. EmDash uses D1, which follows an &#8220;eventual consistency&#8221; model. In high-concurrency scenarios, this can lead to data errors, such as overselling products, which are nearly impossible to reproduce in standard testing due to network timing variables.</p>
</div>
</div>
<div class="faq-item">
<h3>How does the development workflow compare when customizing features?</h3>
<div>
<p>EmDash introduces considerably higher &#8220;developer friction.&#8221; In WordPress, extending behavior is often a simple few-line hook. In EmDash, you are designing &#8220;interaction contracts,&#8221; managing isolated execution contexts, and passing data across rigid boundaries. This increased cognitive load slows down development cycles for even the simplest customizations, which translates to a direct cost increase for the client.</p>
</div>
</div>
<div class="faq-item">
<h3>What is the long-term risk of moving clients away from the WordPress ecosystem?</h3>
<div>
<p>The primary risks are the &#8220;Pioneer Tax&#8221; and &#8220;Vendor Lock-in.&#8221; WordPress has a global talent pool and is protected by the GPL, allowing you to move a site to any host at any time. EmDash uses the MIT license for its code, but the runtime is proprietary to Cloudflare. If a client ever needs to leave the Cloudflare ecosystem, they cannot simply migrate; they must perform a total architectural rewrite.</p>
</div>
</div>
</section>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/emdash-vs-wordpress/">EmDash vs WordPress</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/emdash-vs-wordpress/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AI website builder vs WordPress for SEO</title>
		<link>https://www.macronimous.com/blog/ai-website-builder-vs-wordpress-for-seo/</link>
					<comments>https://www.macronimous.com/blog/ai-website-builder-vs-wordpress-for-seo/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Mon, 06 Apr 2026 04:21:21 +0000</pubDate>
				<category><![CDATA[AI Web Development]]></category>
		<category><![CDATA[GEO]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[WordPress Development]]></category>
		<category><![CDATA[AI Site builders]]></category>
		<category><![CDATA[Wordpress development]]></category>
		<category><![CDATA[WordPress SEO']]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5155</guid>

					<description><![CDATA[<p>The 7-Minute Temptation: AI Website Builder vs WordPress for SEO Seven minutes. That is all it took to build something that nearly made me question 28 years of professional instinct. I was sitting in my office planning the launch of outsourcewp.com—a new Macronimous vertical dedicated to high-end WordPress white-label services. Naturally, the plan was to [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/ai-website-builder-vs-wordpress-for-seo/">AI website builder vs WordPress for SEO</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1><a href="https://www.macronimous.com/blog/wp-content/uploads/2026/03/AI-Website-builder-vs-WordPress-for-SEO.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-5158 size-large" src="https://www.macronimous.com/blog/wp-content/uploads/2026/03/AI-Website-builder-vs-WordPress-for-SEO-1024x576.png" alt="AI website builder vs WordPress for SEO" width="1024" height="576" /></a></h1>
<h1>The 7-Minute Temptation: AI Website Builder vs WordPress for SEO</h1>
<p>Seven minutes. That is all it took to build something that nearly made me question 28 years of professional instinct.</p>
<p>I was sitting in my office planning the launch of <a href="https://www.outsourcewp.com" target="_blank" rel="noopener">outsourcewp.com</a>—a new Macronimous vertical dedicated to high-end <a href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">WordPress</a> white-label services. Naturally, the plan was to build it on WordPress. But as a visual reference for my team, I decided to feed our actual strategy document into two of the most talked-about <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> site builders: <strong>Figma Sites</strong> and <strong>Lovable</strong>.</p>
<p>The result was an immediate, high-fidelity rush. Within minutes, I wasn&#8217;t looking at a wireframe; I was looking at a finished product. It was clean, sophisticated, and—for a moment—genuinely tempting.</p>
<p>I’ve been working with CMSs since the mid-90s and doing <a href="https://www.macronimous.com/blog/hidden-technical-debt-wordpress-seo/">SEO</a> since 1999. I founded <a href="https://www.macronimous.com" target="_blank" rel="noopener">Macronimous</a> in 2002. My career has been built on the &#8220;long game&#8221; of web architecture. Yet, there I was, staring at a 7-minute miracle, wondering if the old way of doing things had finally been disrupted by a prompt.</p>
<h2>The &#8220;Wow&#8221; Factor: Figma vs. Lovable</h2>
<p>To give you an idea of what triggered this mid-career crisis, you can see the actual prototypes I generated here:</p>
<ul>
<li><strong>The Figma Version:</strong> <a href="https://asset-beige-76899864.figma.site/" target="_blank" rel="nofollow noopener">https://asset-beige-76899864.figma.site/</a></li>
<li><strong>The Lovable (React) Version:</strong> <a href="https://frame-fable-engine.lovable.app/" target="_blank" rel="nofollow noopener">https://frame-fable-engine.lovable.app/</a></li>
</ul>
<p>The Figma site gave me an impressive first page almost instantly. Mega menu, clean layout, perfect spacing—it looked like it had been labored over by a senior designer for a week. The Lovable version was equally polished, generating a React-based structure that felt modern and incredibly fast.</p>
<p>The irony was not lost on me. Here I was, building a platform to sell WordPress expertise, and I was dangerously close to building that platform without <a href="https://www.macronimous.com/blog/wordpress-everywhere/">WordPress</a>. It wasn’t an act of laziness; it was an honest reaction to how seductive these tools have become. They remove the friction of development and replace it with immediate visual gratification.</p>
<p>But then the professional reality hit.</p>
<h2>The Invisible Wall</h2>
<p>The temptation lasted exactly as long as it took for me to look for the &#8220;engine.&#8221; As someone who has lived inside backend systems for nearly three decades, the realization that there was no Content Management System was simply not digestible.</p>
<p>These tools are brilliant at creating a &#8220;look,&#8221; but they are currently incapable of supporting a &#8220;business.&#8221; When you strip away the beautiful typography and the smooth transitions, you’re left with three fundamental problems that make these builders a liability for any serious commercial project.</p>
<h3>1. The SEO Control is Skin-Deep</h3>
<p>In the modern landscape of <a href="https://www.macronimous.com/blog/answer-engine-optimization-aeo-optimizing-for-ai-powered-search/">Answer Engine Optimization</a> (AEO), your site needs to be more than just readable; it needs to be &#8220;data-dense&#8221; for search engines. When I audited these AI builds, the SEO control was shallow.</p>
<p>To rank today, you need surgical access to structured data (Schema markup) so Google knows exactly what services you offer and where. You need control over canonical tags to ensure you aren&#8217;t penalized for duplicate content, and you need a dynamic sitemap that updates the second you add a new page. In these AI builders, you are essentially locked out of that deep-level plumbing. You are trading long-term visibility for a 7-minute head start.</p>
<h3>2. The Scalability Trap</h3>
<p>A business site is a living organism. It needs to grow. Today it’s five pages; next year it’s fifty service pages and a hundred case studies. With a CMS like WordPress, scaling is a structural feature. You create a template once, and the system handles the rest. With these AI builders, you cannot simply &#8220;prompt&#8221; your way to a massive, authoritative site. Every new section or major content update requires a fresh round of design-level intervention.</p>
<h3>3. The Portability Crisis</h3>
<p>This is the ultimate dealbreaker. When you build on a proprietary AI platform without a decoupled CMS, you don&#8217;t really own your site—you’re renting it. There is no &#8220;Export to WordPress&#8221; button. There is no easy migration path if the platform changes its pricing model or decides to pivot its features. If you need to move, you are essentially starting from scratch. For a business that plans to be around for the next decade, building on a foundation you can&#8217;t move is an unacceptable risk.</p>
<h2>The Ethics of the &#8220;Sign Out&#8221;</h2>
<p>This experiment solidified my ethical stance as the founder of an agency: <strong>&#8220;We could have impressed until delivery, but not after we sign out.&#8221;</strong></p>
<p>If we used these tools for client work, we could deliver a stunning website in record time. The client would be thrilled during the demo. But the moment we handed over the keys and signed out of the project, we would be leaving them in a bind. The first time they wanted to add a blog post or update a service price, they would realize they don&#8217;t have a system—they have a static asset that they can&#8217;t manage themselves. Recommending a site with no CMS to a business that needs to grow is an injustice to the client.</p>
<h2>An Honest Verdict</h2>
<p>Does this mean AI site builders are a gimmick? No. In fact, they are now a permanent part of our workflow at Macronimous—but only as <strong>prototyping engines</strong>. They are incredible for visualizing a strategy document in real-time or building a high-fidelity &#8220;visual brief&#8221; to show a stakeholder. They are the ultimate &#8220;mood board&#8221; on steroids.</p>
<p>But until these builders integrate a proper, robust CMS—one that allows for data portability and deep technical SEO—they are not ready for prime time. I nearly built a WordPress service site without WordPress. It was a moment of genuine temptation, but it served as a vital reminder: AI can build a beautiful facade in seven minutes, but it still hasn’t figured out how to build the foundation.</p>
<div class="mac-cta-box">
<h3>Don’t Settle for a 7-Minute Facade.</h3>
<p>Build a scalable, SEO-driven digital foundation with experts who understand the &#8220;long game.&#8221; Let’s discuss your next serious <a href="https://www.macronimous.com/services/cms-development/wordpress-development-india/">WordPress</a> project.</p>
<p><a class="mac-cta-button" href="https://www.macronimous.com/contact-us/">Get an Expert Consultation</a></p>
</div>
<h3>Frequently Asked Questions: AI Website Builder vs WordPress for SEO</h3>
<p>1. <strong>Are AI website builders like Figma Sites or Lovable good for deep, technical SEO?</strong><br />
While visually impressive, most AI website builders provide only skin-deep SEO control. To rank effectively, you need surgical access to technical plumbing like structured data (Schema markup), canonical tags, and dynamic sitemaps. Currently, these builders often lock you out of these critical, long-term optimization features. However, given how fast the technology is moving, I expect them to be accommodating full SEO readiness soon.</p>
<p>2. <strong>Can I effectively scale an AI-generated website as my business grows?</strong><br />
Scaling requires a structured architecture. At least for now, you cannot simply &#8220;prompt&#8221; your way to a massive, authoritative site. Every significant addition, new service section, or major content update requires fresh manual intervention, making long-term growth difficult without a traditional CMS like WordPress.</p>
<p>3. <strong>What is the biggest long-term risk of building a serious business site with an AI builder?</strong><br />
The biggest risk is the portability crisis. Since you are building on a proprietary AI platform, you are essentially &#8220;renting&#8221; your foundation. There is usually no realistic migration path, meaning you cannot easily move your site or content to a new host if the platform changes its features or pricing. For businesses seeking a serious, long-term online presence, we discourage building core business sites solely with these AI tools.</p>
<p>4. <strong>What is the best use case for modern AI site builders in a professional workflow?</strong><br />
AI site builders are exceptional prototyping engines. At Macronimous, we use them to present client demos the next day, saving days of manual visual reference work, while having all the necessary elements visually in place. They are invaluable for visualizing a brand strategy document in real-time, testing layout ideas quickly, and generating high-fidelity visual briefs to get a team or stakeholder on the same page before production coding begins.</p>
<p>5. <strong>Is it ethical for an agency to deliver a final business website that has no CMS?</strong><br />
Our position at Macronimous is no. Recommending a site with no CMS to a client who needs organic growth and long-term content management leaves them with an unmanageable static asset. We believe in providing clients with a sustainable foundation they can actually use after the final handoff.</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/ai-website-builder-vs-wordpress-for-seo/">AI website builder vs WordPress for SEO</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/ai-website-builder-vs-wordpress-for-seo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Upgrade Laravel Application: A Laravel 12 Migration Guide for Application Owners</title>
		<link>https://www.macronimous.com/blog/upgrade-laravel-application/</link>
					<comments>https://www.macronimous.com/blog/upgrade-laravel-application/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Tue, 02 Dec 2025 11:26:54 +0000</pubDate>
				<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Laravel Development]]></category>
		<category><![CDATA[PHP Development]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[platform migration]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5056</guid>

					<description><![CDATA[<p>Upgrade Laravel Application Stability can be deceptive in software development. If your Laravel application is running smoothly in production, the incentive to touch the codebase is usually low. However, the ecosystem around your application—specifically PHP versions, security patches, and Composer dependencies—is constantly evolving. Staying on Laravel 8, 9, or even 10 might feel &#8220;stable,&#8221; but [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/upgrade-laravel-application/">Upgrade Laravel Application: A Laravel 12 Migration Guide for Application Owners</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong><a href="https://www.macronimous.com/blog/wp-content/uploads/2025/12/Upgrade-laravel.png"><img loading="lazy" decoding="async" width="1024" height="576" class="aligncenter size-large wp-image-5057" src="https://www.macronimous.com/blog/wp-content/uploads/2025/12/Upgrade-laravel-1024x576.png" alt="Upgrade Laravel Application" /></a>Upgrade Laravel Application</strong></p>
<p>Stability can be deceptive in software development. If your Laravel application is running smoothly in production, the incentive to touch the codebase is usually low. However, the ecosystem around your application—specifically PHP versions, security patches, and Composer dependencies—is constantly evolving.</p>
<p>Staying on Laravel 8, 9, or even 10 might feel &#8220;stable,&#8221; but it introduces silent risks. You aren&#8217;t just missing out on features; you are accumulating technical debt. With <a href="https://laravel.com/docs/12.x/installation" target="_blank" rel="noopener">Laravel 12</a> pushing the standard to PHP 8.2+, the gap between your current version and modern security standards is widening.</p>
<p>Here is a practical look at why upgrading to the latest stable version is a necessary maintenance step to keep your infrastructure healthy.</p>
<p><strong>The Lifecycle Reality: Why Versions Matter</strong></p>
<p>Laravel releases a major version annually to keep pace with backend technologies. Understanding the support lifecycle is critical for long-term planning.</p>
<p>Here is the current support status:</p>
<table class="styled-table">
<thead>
<tr>
<td><strong>Laravel Version</strong></td>
<td><strong>Release Year</strong></td>
<td><strong>Security Support Until</strong></td>
<td><strong>Status</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td><strong>9 (LTS)</strong></td>
<td>2022</td>
<td>Feb 2025</td>
<td><strong>End of Life Imminent</strong></td>
</tr>
<tr>
<td><strong>10</strong></td>
<td>2023</td>
<td>Aug 2025</td>
<td>Active</td>
</tr>
<tr>
<td><strong>11</strong></td>
<td>2024</td>
<td>Aug 2026</td>
<td>Active</td>
</tr>
<tr>
<td><strong>12</strong></td>
<td>2025</td>
<td>Aug 2027 (Expected)</td>
<td><strong>Recommended</strong></td>
</tr>
</tbody>
</table>
<p><strong>The Risk:</strong> If your application runs on <strong>Laravel 8 or below</strong>, you are operating without security patches. If you are on <strong>Laravel 9</strong>, you have a very short window before official support ends.</p>
<p><strong>Key Technical Benefits of Upgrading</strong></p>
<ol>
<li><strong> Security and Compliance (The Non-Negotiable)</strong></li>
</ol>
<p>Legacy frameworks often rely on older hashing algorithms and session handling methods that modern security standards have surpassed.</p>
<ul>
<li><strong>The Impact:</strong> New releases patch specific vulnerabilities found in the framework core. Upgrading ensures your application meets current compliance requirements for data handling and payment processing.</li>
</ul>
<ol start="2">
<li><strong> Performance Optimization</strong></li>
</ol>
<p>Laravel continuously refactors its core to reduce overhead.</p>
<ul>
<li><strong>Routing &amp; Caching:</strong> Recent versions have significantly optimized the route registration and container resolution processes.</li>
<li><strong>PHP 8.2+ Support:</strong> Laravel 12 runs on PHP 8.2+. This version of PHP offers JIT compilation improvements and better memory management compared to PHP 7.4 or 8.0.</li>
<li><strong>Result:</strong> For high-traffic applications or API-heavy backends, this translates to lower latency and reduced server resource consumption.</li>
</ul>
<ol start="3">
<li><strong> Reducing Maintenance Costs (Technical Debt)</strong></li>
</ol>
<p>The longer you wait to upgrade, the harder it becomes. Skipping from Laravel 8 directly to 12 is a painful, complex migration that often requires rewriting large chunks of code due to &#8220;breaking changes&#8221; accumulated over four years.</p>
<ul>
<li><strong>The Strategy:</strong> Incremental upgrades are predictable and low-risk. Delayed upgrades often turn into expensive &#8220;rescue projects.&#8221;</li>
</ul>
<ol start="4">
<li><strong> Developer Experience &amp; Modern Tooling</strong></li>
</ol>
<p>Upgrading allows your development team to utilize modern architectural patterns, making the <a href="https://www.macronimous.com/blog/from-2014-to-2025-common-programming-mistakes-that-still-matter-and-5-new-ones-to-avoid/">codebase</a> easier to maintain.</p>
<ul>
<li><strong>Laravel 12 Features:</strong> Includes cleaner API structures, improved job queue handling, and native support for modern frontend stacks (<a href="https://www.macronimous.com/blog/boost-react-performance-with-server-components-and-server-actions/">React</a>/Vue).</li>
<li><strong>AuthKit:</strong> simplifies complex authentication flows like SSO and Passkeys, which are becoming standard user expectations.</li>
</ul>
<p><strong>When is an Upgrade Urgent?</strong></p>
<p>You should prioritize this migration if:</p>
<ul>
<li><strong>Hosting Compatibility:</strong> Your hosting provider is deprecating older PHP versions (many are dropping PHP 8.0 support).</li>
<li><strong>Dependency Hell:</strong> You cannot install new packages because they require a newer version of illuminate/support.</li>
<li><strong>New Feature Development:</strong> You are planning a sprint for new features. Building new code on top of a legacy framework is inefficient.</li>
</ul>
<p><strong>The Upgrade Strategy</strong></p>
<p>We don&#8217;t recommend &#8220;blind upgrades.&#8221; At <a href="https://www.macronimous.com/services/outsource-php-development/laravel-development-company/" target="_blank" rel="noopener"><strong>Macronimous</strong></a>, we treat upgrades as a structured engineering process:</p>
<ol>
<li><strong>Dependency Audit:</strong> We analyze c<em>omposer.json</em> to identify packages that have been abandoned or need replacement.</li>
<li><strong>Phased Migration:</strong> We step through versions sequentially (e.g., v9 ? v10 ? v11) to isolate breaking changes.</li>
<li><strong>Automated &amp; Manual Testing:</strong> We run your test suite (Unit/Feature tests) and perform manual regression testing on critical flows.</li>
<li><strong>Performance Benchmarking:</strong> We compare response times before and after deployment to ensure the upgrade delivered the expected speed gains.</li>
</ol>
<p><strong>Conclusion</strong></p>
<p data-path-to-node="32">Upgrading Laravel is not about chasing the &#8220;shiny new thing.&#8221; It is about infrastructure integrity. It ensures your application remains secure, fast, and compatible with the modern web.</p>
<p data-path-to-node="33">At the outset, it may look like too much work—especially when your current site is running fine. But trust me, it is worth it.</p>
<p data-path-to-node="34">If your application is running on a version older than Laravel 10, now is the time to plan your migration path.</p>
<p data-path-to-node="34"><b>Need a technical assessment of your current stack?</b> <a href="https://www.macronimous.com/contact-us/">Contact us</a> to discuss a migration plan that minimizes downtime.</p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/upgrade-laravel-application/">Upgrade Laravel Application: A Laravel 12 Migration Guide for Application Owners</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/upgrade-laravel-application/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Agile in the Age of AI Coding – Lessons for Web Development Teams</title>
		<link>https://www.macronimous.com/blog/agile-in-the-age-of-ai-coding/</link>
					<comments>https://www.macronimous.com/blog/agile-in-the-age-of-ai-coding/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Tue, 30 Sep 2025 05:06:49 +0000</pubDate>
				<category><![CDATA[Web Project Management]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Welcome]]></category>
		<category><![CDATA[Agile development]]></category>
		<category><![CDATA[Agile web process]]></category>
		<category><![CDATA[web project management]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=4937</guid>

					<description><![CDATA[<p>Agile in the Age of Vibe Coding: What Changes, What Stays? Introduction: Agile Beyond Buzzwords For more than two decades, Agile has been the driving philosophy behind modern software development. It’s more than a collection of buzzwords or project management tools; it’s a mindset focused on delivering value through small cycles, fast feedback, and a [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/agile-in-the-age-of-ai-coding/">Agile in the Age of AI Coding – Lessons for Web Development Teams</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2><a href="https://www.macronimous.com/blog/wp-content/uploads/2025/09/Agile-in-vibe-coding-1.jpg"><img loading="lazy" decoding="async" width="1024" height="614" class="aligncenter size-large wp-image-4941" src="https://www.macronimous.com/blog/wp-content/uploads/2025/09/Agile-in-vibe-coding-1-1024x614.jpg" alt="Agile in Vibe coding" /></a></h2>
<h2>Agile in the Age of Vibe Coding: What Changes, What Stays?</h2>
<h3>Introduction: Agile Beyond Buzzwords</h3>
<p>For more than two decades, <a href="https://www.macronimous.com/blog/ai-driven-pair-programming/">Agile</a> has been the driving philosophy behind modern software development. It’s more than a collection of buzzwords or project management tools; it’s a mindset focused on delivering value through small cycles, fast feedback, and a deep commitment to adaptability. Agile taught us to stop building in rigid, monolithic phases and start collaborating in dynamic, iterative loops.</p>
<p>Now, a new paradigm is capturing the industry&#8217;s attention: “<a href="https://www.macronimous.com/blog/vibe-coding-for-web-developers-amplify-your-flow-state-with-ai/">vibe coding</a>.” Developers are increasingly experimenting with <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> pair programmers like <a href="https://github.com/" target="_blank" rel="nofollow noopener">GitHub</a> <a href="https://github.com/features/copilot" target="_blank" rel="nofollow noopener">Copilot</a> and <a href="https://cursor.com/" target="_blank" rel="nofollow noopener">Cursor</a>, which can generate vast chunks of code from simple, descriptive prompts. The speed is intoxicating, and the potential is immense. This rapid evolution raises a critical question for development teams everywhere: <b>Does Agile still matter in an era where code can be generated almost instantly?</b></p>
<p>The answer is a resounding yes. In fact, it may matter more than ever.</p>
<h3>Agile at Its Core: Direction Over Tools</h3>
<p>To understand why Agile remains relevant, we must remember what it has always been about. Agile was never concerned with <i>how</i> developers type code. Its focus has always been on the bigger picture:</p>
<ul>
<li><b>Delivering Value in Short Iterations:</b> Consistently shipping working software allows for real-world feedback.</li>
<li><b>Embracing Change:</b> Staying flexible when requirements or market conditions shift is a core strength.</li>
<li><b>Customer Collaboration:</b> Keeping clients and stakeholders involved throughout the process ensures the final product solves the right problem.</li>
<li><b>Continuous Improvement:</b> Using feedback to constantly refine both the product and the process.</li>
</ul>
<p>Whether a developer writes every line of code by hand or collaborates with an AI to generate it, these principles remain the compass for any successful project. AI changes the speed of the engine, but Agile is what steers the ship.</p>
<a href="https://www.macronimous.com/blog/wp-content/uploads/2025/09/Agile-princile-cycle.jpg"><img loading="lazy" decoding="async" width="1024" height="802" class="aligncenter size-large wp-image-4939" src="https://www.macronimous.com/blog/wp-content/uploads/2025/09/Agile-princile-cycle-1024x802.jpg" alt="Agile with Vibe coding" /></a>
<h3>What Vibe Coding Brings to the Table</h3>
<p>“Vibe coding” aptly describes the intuitive, prompt-driven style of development where AI assistants handle much of the boilerplate and implementation details. Instead of manually constructing every function, a developer describes their intent, and the AI produces a functional starting point. This introduces powerful new dynamics for Agile teams.</p>
<h4>1. Shorter, More Intense Cycles</h4>
<p>With AI assistance, functional prototypes and features can be produced in hours, not days or weeks. This allows Agile sprints to shrink into micro-iterations, enabling even faster feedback. The challenge shifts from development speed to the speed of decision-making. Can product owners and stakeholders provide feedback fast enough to keep up?</p>
<h4>2. A Fundamental Shift of Focus</h4>
<p>Teams will spend significantly less time wrestling with syntax, boilerplate code, and common algorithms. This frees up invaluable cognitive resources to focus on higher-level challenges: system architecture, user experience design, robust security models, and long-term maintainability. The developer’s role evolves from a pure creator to a strategic curator and integrator.</p>
<h4>3. Amplified Pressure on Testing</h4>
<p>AI can generate useful code with astonishing speed, but it can also introduce subtle bugs, security flaws, or inefficient logic with equal confidence. This makes Agile’s emphasis on automated testing, <a href="https://www.geeksforgeeks.org/devops/what-is-ci-cd/" target="_blank" rel="nofollow noopener">continuous integration</a> (CI/CD), and <a href="https://www.geeksforgeeks.org/software-engineering/test-driven-development-tdd/" target="_blank" rel="nofollow noopener">Test-Driven Development</a> (TDD) more critical than ever. A powerful CI/CD pipeline becomes the ultimate safety net, ensuring that AI-generated speed doesn’t come at the cost of quality.</p>
<h4>4. The Need for Disciplined Knowledge Sharing</h4>
<p>Without clear communication, teams risk creating “<a href="https://www.geeksforgeeks.org/artificial-intelligence/black-box-problem-in-ai/" target="_blank" rel="nofollow noopener">AI black box</a>” systems where only the original prompter understands the logic. This is where Agile ceremonies gain renewed importance. Sprint reviews, retrospectives, and even daily stand-ups become essential forums for demystifying the code. Teams must discuss not just <i>what</i> was built, but <i>how</i> the AI was prompted and <i>why</i> its output was accepted, ensuring collective ownership and understanding.</p>
<h4>5. Evolving Roles and Responsibilities</h4>
<p>As developers become more like editors and architects, the role of the Product Owner becomes even more central. Since building things is faster and cheaper, the real challenge is <b>choosing what to build</b>. A clear vision and a ruthlessly prioritized backlog are paramount, because the cost of building the wrong feature is no longer just wasted time—it’s a massive squandering of opportunity.</p>
<h3>A Remote Agency’s Perspective</h3>
<p>At Macronimous, <a href="https://www.macronimous.com/agile-web-development/" target="_blank" rel="noopener">Agile</a> isn&#8217;t a framework we adopted; it&#8217;s been our natural way of working for decades. As a <a href="https://www.macronimous.com/about-us/">remote-first web development agency</a>, we rely on Agile principles to keep our distributed teams aligned, our clients engaged across different time zones, and our projects delivering value predictably. For us, Agile is the operational rhythm that makes remote collaboration seamless and effective.</p>
<p>That’s why we see <a href="https://www.macronimous.com/blog/testing-in-agentic-coding/">vibe coding</a> not as a disruption to Agile, but as a powerful force that Agile can help us harness. While we are still primarily human-coding our solutions in Laravel and other PHP frameworks—as AI-assisted coding is not yet fully mature or consistently reliable in this space—Agile has prepared us for this change. When the right tools stabilize, our Agile foundation will ensure we adopt them responsibly, always balancing speed with the trust and quality our clients expect.</p>
<h3>The Verdict: Does Agile Still Matter?</h3>
<p>Yes—and its importance is growing. AI provides the raw speed, but Agile provides the essential direction, discipline, and quality control.</p>
<ul>
<li><b>AI accelerates, but Agile steers.</b> Without Agile principles, rapid code generation can quickly devolve into rapid chaos, leading projects far off course.</li>
<li><b>Feedback loops protect quality.</b> Agile’s insistence on short cycles and stakeholder validation ensures that what’s being built is frequently checked against real-world needs.</li>
<li><b>Structure sustains trust.</b> Agile ceremonies, automated testing, and a focus on working software ensure that projects don’t drift into an uncertain state of unverified, AI-generated code.</li>
</ul>
<p>Agile is the compass; vibe coding is the engine. You need both to reach the right destination efficiently and safely.</p>
<h3>Conclusion: The Future Is Agile-Plus</h3>
<p>The real question isn&#8217;t whether Agile can survive the age of <a href="https://www.macronimous.com/blog/agentic-coding-domain-knowledge/">AI coding</a>, but how it will evolve to guide it. At <a href="https://www.macronimous.com/">Macronimous</a>, we see Agile as the enduring foundation and AI as a promising accelerator that will augment, not replace, human expertise.</p>
<p>For remote teams and forward-thinking agencies, the future of <a href="https://www.macronimous.com/blog/fluency-without-keystrokes-web-developers-in-the-ai-era/">web development</a> isn&#8217;t &#8220;Agile versus AI.&#8221; It is <b>Agile-plus</b>—a powerful synergy where timeless Agile principles combine with the unprecedented speed of AI to deliver better products, faster and more reliably than ever before.</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/agile-in-the-age-of-ai-coding/">Agile in the Age of AI Coding – Lessons for Web Development Teams</a> first appeared on <a rel="nofollow" href="https://www.macronimous.com/blog">Macronimous Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.macronimous.com/blog/agile-in-the-age-of-ai-coding/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
