<?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>AI &#8211; Macronimous Blog</title>
	<atom:link href="https://www.macronimous.com/blog/category/ai/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>Building a WordPress MCP Server When the Spec Changed</title>
		<link>https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/</link>
					<comments>https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Wed, 29 Jul 2026 05:29:22 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[MCP Development]]></category>
		<category><![CDATA[WordPress Development]]></category>
		<category><![CDATA[MCP Server]]></category>
		<category><![CDATA[Wordpress development]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5282</guid>

					<description><![CDATA[<p>MCP 2026-07-28 is the fifth revision of the Model Context Protocol, and it retires sessions and the initialize handshake in favor of plain request and response. That change suits WordPress unusually well. PHP already treats every request as an independent, shared-nothing process, so a WordPress MCP server no longer has to fake a persistent connection [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/">Building a WordPress MCP Server When the Spec Changed</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/Building-a-WordPress-MCP-Server-When-the-Spec-Changed.jpg"><img loading="lazy" decoding="async" width="1731" height="909" src="https://www.macronimous.com/blog/wp-content/uploads/2026/07/Building-a-WordPress-MCP-Server-When-the-Spec-Changed.jpg" alt="uilding a WordPress MCP Server When the Spec Changed" class="aligncenter size-full wp-image-5284" /></a>
<div class="mac-direct-answer">
<p><strong>MCP 2026-07-28</strong> is the fifth revision of the Model Context Protocol, and it retires sessions and the <code>initialize</code> handshake in favor of plain request and response. That change suits <a href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">WordPress</a> unusually well. PHP already treats every request as an independent, shared-nothing process, so a WordPress MCP server no longer has to fake a persistent connection it was never going to hold open anyway.</p>
</div>
<div class="mac-toc">
<p class="mac-toc-title">What&#8217;s on this page</p>
<ul>
<li><a href="#spec-changed">The spec changed the night before we submitted</a></li>
<li><a href="#right-shape">Why WordPress was already the right shape</a></li>
<li><a href="#what-broke">What broke was the handshake, and only the handshake</a></li>
<li><a href="#both-generations">We&#8217;re supporting both generations, not switching</a></li>
<li><a href="#timing">The timing call was harder than the code</a></li>
<li><a href="#cacheable">The small win: tool lists are cacheable now</a></li>
<li><a href="#read-the-rest">The rest of the changelog, for WordPress builders</a></li>
<li><a href="#simple-survives">Simple survives revisions. Clever gets rewritten.</a></li>
</ul>
</div>
<h2 id="spec-changed">The spec changed the night before we submitted</h2>
<p>On July 28, 2026 the Model Context Protocol shipped its fifth revision. We were hours away from uploading our WordPress MCP plugin to the plugin directory.</p>
<p>The headline change was a stateless core. MCP went from a bidirectional, stateful protocol to plain request and response. Sessions gone. The <code>initialize</code> and <code>initialized</code> handshake, retired outright. You can read the <a href="https://blog.modelcontextprotocol.io/posts/2026-07-28/" target="_blank" rel="noopener noreferrer">maintainers&#8217; release notes</a> for the full list, and Anthropic published <a href="https://claude.com/blog/bringing-mcp-2026-07-28-to-claude" target="_blank" rel="noopener noreferrer">its own summary of what&#8217;s rolling out across Claude</a> the same day.</p>
<p>So the first question was not &#8220;should we adopt this.&#8221; It was &#8220;are we broken.&#8221;</p>
<p>Mostly, no. And for a deeply unglamorous reason.</p>
<h2 id="right-shape">Why WordPress was already the right shape</h2>
<p>In the first week of the build we had a choice about how the server replies. The old spec allowed a persistent event stream, or a single JSON response per request. We took the single response. Not because we saw anything coming, but because server-sent events inside PHP, under a shared host&#8217;s process model, is a bad afternoon that turns into a bad week.</p>
<p>The simpler option was permitted. We took it and moved on.</p>
<p>Eight months later the protocol moved to exactly that shape. Every server that had built the sophisticated version now has a migration to do. We had already accidentally arrived.</p>
<p>There is a general point buried in that, and it&#8217;s the reason this release matters beyond one plugin. WordPress has always been shared-nothing. A PHP request boots, does its work, and dies with no memory of the request before it. The previous MCP spec fought that model by asking for a connection WordPress does not naturally hold. The new spec asks for exactly what WordPress already does.</p>
<h2 id="what-broke">What broke was the handshake, and only the handshake</h2>
<p><code>initialize</code> and <code>initialized</code> were the first code written on this project, the thing that proved a WordPress site could act as an MCP server at all. Both are now retired in favor of an optional <code>server/discover</code> call. The most protocol-shaped part of the build was the part that aged worst.</p>
<p>Everything downstream, reading site data and returning JSON, did not care at all.</p>
<div class="mac-key-point">
<p>The parts of our build that broke were the parts doing protocol ceremony. The parts doing the actual job carried on untouched, because they had never known what a session was.</p>
</div>
<p>Here is what a call looks like now. Note that there is nothing to establish first, and nothing stored between requests.</p>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">POST /mcp HTTP/1.1
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: search

{"jsonrpc":"2.0","id":1,"method":"tools/call",
 "params":{"name":"search","arguments":{"q":"otters"},
 "_meta":{"io.modelcontextprotocol/clientInfo":{"name":"my-app","version":"1.0"}}}}</pre><p>&nbsp;</p>
<p>Protocol version, client identity and client capabilities all travel in the request itself. Any request can land on any instance behind an ordinary load balancer. For a plugin running on shared hosting, that is not an abstract scalability win. It removes the one requirement PHP was worst equipped to meet.</p>
<h2 id="both-generations">We&#8217;re supporting both generations, not switching</h2>
<p>The new spec carries a formal deprecation policy with a twelve-month minimum window. That changes the calculation. A plugin installed on somebody else&#8217;s site has to work with whatever client that person happens to have. You do not get to pick.</p>
<p>So version negotiation decides per request, and nothing is stored between them. Two code paths, one endpoint, no session table.</p>
<p>Agencies will recognize the shape of this problem. If you <a href="https://www.macronimous.com/services/cms-development/wordpress-maintenance-services/">maintain WordPress sites for other people</a>, you already live with the gap between the version you&#8217;d like everyone to run and the version they actually run. Protocol support is the same discipline applied one layer down, and it accumulates the same way <a href="https://www.macronimous.com/blog/hidden-technical-debt-wordpress-seo/">technical debt accumulates in WordPress</a>: quietly, until a release forces the accounting.</p>
<h2 id="timing">The timing call was harder than the code</h2>
<p>Directory review takes weeks. Submitting on the previous spec would have meant being reviewed, approved and listed as already out of date, in a category where the audience reads specifications for a living.</p>
<p>A day of work against several weeks of looking dated is not a close call.</p>
<p>The engineering question was answered in an hour. The publishing question was the harder one, because the cost of shipping something correct-but-stale is paid entirely in credibility, and you cannot patch that in version 1.0.1.</p>
<h2 id="cacheable">The small win: tool lists are cacheable now</h2>
<p>One change we are quietly pleased about. List responses now carry a time-to-live and a cache scope.</p>
<p>Through the entire build, every time we added a capability, we had to disconnect and reconnect the client, because it had cached a stale catalog with no way to learn it was stale. Minor, constant, mildly maddening. Now the protocol handles it.</p>
<p>Nobody will write a headline about that one. It is the change that will show up most often in daily use.</p>
<h2 id="read-the-rest">The rest of the changelog, for WordPress builders</h2>
<p>If you are building or evaluating anything MCP-shaped on WordPress, these are the items worth reading properly in the <a href="https://modelcontextprotocol.io/specification/2026-07-28/" target="_blank" rel="noopener noreferrer">2026-07-28 specification</a> rather than skimming.</p>
<table class="styled-table">
<thead>
<tr>
<th>What changed</th>
<th>What it means for a WordPress MCP server</th>
</tr>
</thead>
<tbody>
<tr>
<td>Sessions and the <code>initialize</code>/<code>initialized</code> handshake retired</td>
<td>Delete the handshake code. Each request carries its own protocol version and client info in <code>_meta</code>. PHP&#8217;s request model already worked this way.</td>
</tr>
<tr>
<td><code>Mcp-Method</code> and <code>Mcp-Name</code> required as HTTP headers</td>
<td>Your endpoint reads them, and anything in front of you must not strip them. Security plugins and aggressive WAF rules are the thing to test here.</td>
</tr>
<tr>
<td>List responses carry <code>ttlMs</code> and <code>cacheScope</code></td>
<td>Clients stop re-fetching your tool catalog on every connect. Adding a tool no longer means telling users to reconnect.</td>
</tr>
<tr>
<td>Sampling, elicitation and roots replaced by Multi Round-Trip Requests</td>
<td>A tool needing user confirmation returns <code>input_required</code>, and the client retries with the answers attached. No held-open stream, which PHP was never going to hold.</td>
</tr>
<tr>
<td>Dynamic Client Registration deprecated in favor of Client ID Metadata Documents</td>
<td>The long-term path away from <a href="https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/" target="_blank" rel="noopener noreferrer">Application Passwords</a> toward standard OAuth. Real, but not a migration to rush.</td>
</tr>
<tr>
<td>Legacy HTTP+SSE transport deprecated, twelve-month minimum window</td>
<td>If you built on the event stream, you have a year. If you built on single JSON responses, you have nothing to do.</td>
</tr>
</tbody>
</table>
<h2 id="simple-survives">Simple survives revisions. Clever gets rewritten.</h2>
<p>Budget for the specification moving. Not as a line in a risk register, as a genuine expectation.</p>
<p>You cannot predict which way it moves, so insulation is not foresight. What actually protected us was choosing the simplest option the spec permitted, at a moment when the constraint was our own platform rather than any theory about the future. And keeping the protocol layer thin and separate from the work, which is the same discipline we apply to <a href="https://www.macronimous.com/blog/controlled-ai-coding/">controlled AI coding</a> and to <a href="https://www.macronimous.com/blog/writing-clean-code-with-ai/">keeping AI-generated code clean</a>.</p>
<ul class="mac-checklist">
<li>Take the simplest option the spec permits, especially when your own platform is the constraint</li>
<li>Keep protocol handling in its own layer, separate from the code doing the actual work</li>
<li>Support two spec generations rather than switching, if your code runs on installs you don&#8217;t control</li>
<li>Negotiate the version per request and store nothing between requests</li>
<li>Test that nothing in front of your endpoint strips <code>Mcp-Method</code> or <code>Mcp-Name</code></li>
<li>Read the deprecation policy before planning a migration, not after</li>
</ul>
<p>We got this one right by accident. That is not a method, and I would not want anyone reading this to treat it as one. A hands-on guide to connecting a live WordPress site to Claude is in progress and will follow this post.</p>
<div class="mac-cta-box">
<h3>Thinking about connecting your WordPress site to an AI assistant?</h3>
<p>We build and maintain WordPress for agencies and site owners in the US, UK and Australia, including the plumbing that makes a site readable by <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> tools rather than just by browsers.</p>
<p><a href="https://www.macronimous.com/services/cms-development/wordpress-development-india/" class="mac-cta-button">Talk to our WordPress team</a>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/">Building a WordPress MCP Server When the Spec Changed</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/building-a-wordpress-mcp-server-when-the-spec-changed/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>WordPress 7.0 AI: The Token Cost Reality for Site Owners</title>
		<link>https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/</link>
					<comments>https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Fri, 10 Jul 2026 05:08:36 +0000</pubDate>
				<category><![CDATA[WordPress Development]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Abilities API]]></category>
		<category><![CDATA[Connectors API]]></category>
		<category><![CDATA[WordPress AI provider plugins]]></category>
		<category><![CDATA[WordPress AI tokens cost]]></category>
		<category><![CDATA[WP AI Client]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5250</guid>

					<description><![CDATA[<p>WordPress 7.0 &#8220;Armstrong&#8221; (released May 20, 2026) adds native AI infrastructure to core: the WP AI Client, a Connectors screen, and the Abilities API. But core ships the wiring, not the intelligence. WordPress itself burns no tokens. Cost only begins when you connect a provider and a plugin actually calls it, and you pay that [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">WordPress 7.0 AI: The Token Cost Reality for Site Owners</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/WordPress-7.0-AI.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-5252 size-large" src="https://www.macronimous.com/blog/wp-content/uploads/2026/06/WordPress-7.0-AI-1024x576.png" alt="WordPress 7 AI Token cost" width="1024" height="576" /></a>
<div class="mac-direct-answer">
<p><strong><a href="https://www.macronimous.com/blog/hidden-technical-debt-wordpress-seo/">WordPress</a> 7.0 &#8220;Armstrong&#8221;</strong> (released May 20, 2026) adds native <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> infrastructure to core: the WP AI Client, a Connectors screen, and the Abilities API. But core ships the wiring, not the intelligence. WordPress itself burns no tokens. Cost only begins when you connect a provider and a plugin actually calls it, and you pay that provider directly, not WordPress.</p>
</div>
<h2>What WordPress 7.0 actually added</h2>
<p>The headline feature in Armstrong isn&#8217;t a chatbot. It&#8217;s plumbing. WordPress 7.0 ships three things: the WP AI Client, a provider-agnostic PHP API that plugins call instead of wiring up OpenAI or Anthropic themselves; the Connectors screen at <code>Settings &gt; Connectors</code>, where API keys live; and the Abilities API, which lets plugins and core expose actions like &#8220;create a post&#8221; or &#8220;add an excerpt&#8221; in a machine-readable form. That last piece is what makes 7.0 natively agentic. An AI agent can now discover and trigger site actions through a defined interface, which is the same shift that&#8217;s reshaping <a href="https://www.macronimous.com/blog/answer-engine-optimization-aeo-optimizing-for-ai-powered-search/">optimizing for AI-powered search</a>. Three provider connectors come pre-registered: OpenAI, Anthropic, and Google. Each still needs its plugin activated and your own API key, on PHP 7.4 or higher.</p>
<h2>Where the token cost actually starts</h2>
<p>Here&#8217;s the part most of the coverage gets wrong. Installing WordPress 7.0 costs you nothing in tokens. The AI Client sits dormant until two things happen: you add a provider key in Connectors, and a plugin makes a call through the client. No key, no calls, no bill. When calls do happen, the provider bills you on its own per-token rates against the key you supplied. WordPress is only the router. It never sees a cent of that traffic, and it has no native spending cap of its own. The credential is entered once, encrypted, and shared across every compatible plugin on the site, which is cleaner than the old habit of each plugin storing its own key.</p>
<div class="mac-key-point">
<p>WordPress 7.0 ships the plumbing, not the water bill. Nothing costs you a token until a plugin actually calls a connected provider.</p>
</div>
<h2>Four ways the AI gets paid for</h2>
<p>Before you connect anything, decide which of these you&#8217;re actually signing up for. They have very different cost profiles.</p>
<table class="styled-table">
<thead>
<tr>
<th>Setup</th>
<th>Who you pay</th>
<th>Cost model</th>
</tr>
</thead>
<tbody>
<tr>
<td>Core only, no provider connected</td>
<td>No one</td>
<td>Free. The AI layer stays dormant.</td>
</tr>
<tr>
<td>Cloud provider key (OpenAI / Anthropic / Google)</td>
<td>The provider, directly</td>
<td>Metered per token. No cap inside WordPress.</td>
</tr>
<tr>
<td>Local model via the Ollama provider plugin</td>
<td>No one external</td>
<td>Server compute only. No outbound calls, no per-token fee.</td>
</tr>
<tr>
<td>Host-bundled tokens (some managed hosts)</td>
<td>Your host</td>
<td>Often a small free monthly allowance, billed with hosting.</td>
</tr>
</tbody>
</table>
<p>For privacy-sensitive clients or high-volume workloads, the community Ollama provider runs open models like Llama or Mistral on your own server. No data leaves the box and there&#8217;s no metered token cost, which is the same instinct behind keeping <a href="https://www.macronimous.com/blog/controlled-ai-coding/">AI on a tight leash</a> in any production workflow. If you&#8217;ve ever weighed a hosted builder against self-managed WordPress, the trade is familiar; we&#8217;ve argued before that <a href="https://www.macronimous.com/blog/ai-website-builder-vs-wordpress-for-seo/">WordPress still wins for SEO</a>, and owning your AI plumbing is part of why.</p>
<h2>The real exposure isn&#8217;t the bill. It&#8217;s who can run it up.</h2>
<p>Because keys live in one screen and every compatible plugin shares them, the risk concentrates instead of spreading out. Anyone who can reach <code>Settings &gt; Connectors</code> can attach a provider and open the meter. The Abilities API widens the surface further: it defines what an AI agent is permitted to do on your site, and the official guidance is blunt that it needs administrator-level capability checks so untrusted users can&#8217;t fire arbitrary prompts at your paid providers. On a multi-author site, or any client install you manage, that&#8217;s the first thing to lock down. The <a href="https://www.macronimous.com/blog/building-a-wordpress-mcp-server-when-the-spec-changed/">MCP</a> Adapter, which ships as a separate plugin, goes further again, letting external assistants like Claude or ChatGPT discover and trigger your site&#8217;s abilities over MCP. Genuinely useful, but only with permissions set deliberately. Left loose, this becomes exactly the kind of <a href="https://www.macronimous.com/blog/hidden-technical-debt-wordpress-seo/">technical debt that piles up quietly</a> until a bill or a breach surfaces it.</p>
<h2>What to do now</h2>
<p>Whether you run one site or forty client installs, the moves are the same.</p>
<ul class="mac-checklist">
<li>Update on staging first. Armstrong rebuilt the admin in React and the release slipped a full month for stability reasons, so test plugin and theme compatibility before production.</li>
<li>Restrict the Connectors screen to a single admin role so no one quietly attaches a key.</li>
<li>Set hard spend caps and rate limits at the provider dashboard, because WordPress has none. Use one project-scoped key per site so you can attribute and kill spend independently.</li>
<li>Decide billing per client up front: you hold the key and bill managed usage, or the client brings their own and owns the invoice. Don&#8217;t leave it ambiguous.</li>
<li>Audit the Abilities API permissions and any MCP Adapter exposure before switching on agentic features.</li>
<li>For privacy-sensitive or high-token work, evaluate the Ollama local-model provider instead of a metered cloud key.</li>
<li>Disable the AI layer entirely on brochure sites that won&#8217;t use it. Less attack surface, zero accidental spend.</li>
</ul>
<h2>My read</h2>
<p>7.0 is the right architecture and the wrong moment to switch your brain off. The provider-agnostic design genuinely protects you from lock-in, and centralizing keys beats the old one-plugin-per-provider mess. But &#8220;native AI&#8221; has been sold as a feature when it&#8217;s really a billing relationship you now own. Treat the AI Client like any outbound paid API: gate who configures it, cap it at the source, and turn it on only where it earns its keep. With 7.1 due in August and 7.2 in December, the agentic surface only gets wider, so get your governance right before then. It pairs directly with <a href="https://www.macronimous.com/blog/seo-strategy-2026/">how search is shifting in 2026</a>.</p>
<div class="mac-cta-box">
<h3>Managing AI Across a Fleet of WordPress Sites?</h3>
<p>We configure Connectors, lock down provider keys, and govern agentic permissions across client installs, so the meter never surprises you.</p>
<p><a class="mac-cta-button" href="https://www.macronimous.com/services/cms-development/wordpress-maintenance-services/">Talk to Our WordPress Team</a></p>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/">WordPress 7.0 AI: The Token Cost Reality for Site 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/wordpress-7-0-ai-the-token-cost-reality-for-site-owners/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>Controlled AI Coding: A Practical Guide for Dev Teams</title>
		<link>https://www.macronimous.com/blog/controlled-ai-coding/</link>
					<comments>https://www.macronimous.com/blog/controlled-ai-coding/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Sat, 02 May 2026 05:33:45 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[agency best practices]]></category>
		<category><![CDATA[AI code review]]></category>
		<category><![CDATA[AI Coding]]></category>
		<category><![CDATA[Ai Coding best practices]]></category>
		<category><![CDATA[code refactoring]]></category>
		<category><![CDATA[development workflow]]></category>
		<category><![CDATA[technical debt]]></category>
		<category><![CDATA[Vibe coding]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5196</guid>

					<description><![CDATA[<p>Controlled AI Coding is the practice of treating AI-generated code with the same engineering discipline you&#8217;d apply to any other code: human review, modular checks, scheduled refactoring, and a repository of known-good components. It is the difference between an AI-assisted codebase you can maintain in three years and one nobody wants to touch in six [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/controlled-ai-coding/">Controlled AI Coding: A Practical Guide for Dev Teams</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/04/Controlled-AI-Coding.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-5199 size-large" src="https://www.macronimous.com/blog/wp-content/uploads/2026/04/Controlled-AI-Coding-1024x576.png" alt="Controlled AI Coding: A Practical Guide for Dev Teams" width="1024" height="576" /></a>
<div class="mac-direct-answer">
<p><strong>Controlled <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> Coding</strong> is the practice of treating AI-generated code with the same engineering discipline you&#8217;d apply to any other code: human review, modular checks, scheduled refactoring, and a repository of known-good components. It is the difference between an AI-assisted codebase you can maintain in three years and one nobody wants to touch in six months. The core loop is simple — Code, Check, <a href="https://www.macronimous.com/blog/upgrade-laravel-application/">Refactor</a> (CCR) — applied at sprint cadence, not whenever something breaks.</p>
</div>
<div class="mac-toc">
<p class="mac-toc-title">What&#8217;s in this guide</p>
<ul>
<li><a href="#problem">The 6-month codebase problem</a></li>
<li><a href="#discipline">Why traditional discipline matters more, not less</a></li>
<li><a href="#ccr-loop">The Code-Check-Refactor (CCR) loop</a></li>
<li><a href="#workflow">How we actually do this at Macronimous</a></li>
<li><a href="#tips">Seven practical tips you can apply Monday morning</a></li>
<li><a href="#comparison">Uncontrolled vs. Controlled AI coding</a></li>
<li><a href="#checklist">The team audit checklist</a></li>
<li><a href="#faq">FAQ</a></li>
<li><a href="#bottom-line">The bottom line</a></li>
</ul>
</div>
<h2 id="problem">The 6-month codebase problem</h2>
<p>If you run a development team in 2026, you&#8217;ve probably already seen this movie. A developer ships a feature in two days that would have taken five. Everyone is happy. The PR gets merged. Three sprints later, somebody else needs to extend that module and finds 400 lines of code nobody fully understands — half of it generated, half of it hand-edited, none of it documented. The original developer says, &#8220;Yeah, I let Copilot handle that part.&#8221; The original Copilot session is gone. The reasoning is gone. What&#8217;s left is working code that nobody can confidently change.</p>
<p>This is not an AI problem. This is a discipline problem that AI has accelerated.</p>
<p>At <a href="https://www.macronimous.com/blog/macronimous-20-glorious-years-of-offshore-web-development/">Macronimous</a> we&#8217;ve been writing PHP and JavaScript for clients since 2002. We&#8217;ve watched every productivity wave — <a href="https://www.macronimous.com/blog/php-frameworks-we-like-laravel/">frameworks</a>, no-code, low-code, and now AI assistants — promise to remove engineering discipline from the picture. None of them have. What they actually do is shift <em>where</em> the discipline needs to live. <a href="https://www.macronimous.com/blog/agentic-coding-domain-knowledge/">AI coding</a> is no different. The teams that will still be maintainable in 2028 are the ones treating AI output the same way a senior engineer would treat code from a junior who&#8217;s fast, prolific, and occasionally confidently wrong.</p>
<div class="mac-key-point">
<p>AI didn&#8217;t invent technical debt. It just made it cheaper to produce. Which means the cost of <em>not</em> reviewing it has gone up, not down.</p>
</div>
<h2 id="discipline">Why traditional discipline matters more, not less</h2>
<p>There&#8217;s a tempting narrative that AI changes everything about how teams should write code. It doesn&#8217;t. The practices that mattered before AI matter more now, because the volume of code being produced has gone up while the per-line attention has gone down.</p>
<p>The four traditional disciplines we lean on hardest:</p>
<ul class="arrowlist">
<li><strong>Modular code review.</strong> A 50-line function reviewed properly is worth more than a 500-line file skimmed. AI makes large files cheap, which means insisting on modularity is more important, not less.</li>
<li><strong>Scheduled refactoring intervals.</strong> If you only refactor when something breaks, you&#8217;ll only refactor what&#8217;s already on fire. We refactor at sprint-end, every two weeks, before the debt compounds.</li>
<li><strong>Reusable component repositories.</strong> The oldest practice in software engineering — keep what works, call it when you need it. AI tempts teams to regenerate similar code from scratch each time. That&#8217;s how you end up with seven slightly different date pickers in one project.</li>
<li><strong>Documented intent.</strong> AI can write the code. It can&#8217;t write why you needed the code. That part is still on you, and it&#8217;s the part that matters in month seven.</li>
</ul>
<h2 id="ccr-loop">The Code-Check-Refactor (CCR) loop</h2>
<p>We organize our AI coding workflow around a three-step loop we call CCR. It&#8217;s deliberately boring. Boring is what survives.</p>
<p><strong>Code</strong> — the AI-assisted writing phase. Cursor, GitHub Copilot, and Claude Code all earn their keep here. The developer is in charge; the AI is a collaborator, not an author. Generation happens against a clear, scoped prompt — a single function, a single component, a single migration. Not &#8220;build me the dashboard.&#8221;</p>
<p><strong>Check</strong> — human review of every AI-generated block before it touches the main branch. This is non-negotiable. Two questions every reviewer asks: <em>Do I understand what this does?</em> and <em>Do I understand why it does it this way?</em> If the answer to either is no, the code goes back, regardless of whether tests pass.</p>
<p><strong>Refactor</strong> — sprint-end consolidation. Every two weeks we set aside time to look at what was added, what duplicated existing utilities, and what should be promoted into the shared repository. This is when AI-generated sprawl gets compressed back into reusable parts.</p>
<div class="mac-key-point">
<p>If you&#8217;re not doing the Refactor step, you&#8217;re not doing Controlled AI Coding. You&#8217;re just doing AI coding with extra steps.</p>
</div>
<h2 id="workflow">How we actually do this at Macronimous</h2>
<p>Specifics matter, so here&#8217;s the actual workflow our <a href="https://www.macronimous.com/blog/react-next-laravel-mysql-web-application-tech-stack-for-custom-web-apps/">React</a> and PHP teams run, not a generalized version of it.</p>
<h3>1. Scoped prompts, not open-ended ones</h3>
<p>We treat the AI like a contractor. Contractors get scopes of work. So does the AI. Instead of &#8220;build the user profile page,&#8221; the prompt is &#8220;write a React functional component that takes a user object as a prop and renders name, avatar, role badge, and last-login timestamp. Use our existing &lt;Avatar /&gt; and &lt;Badge /&gt; components from /shared/ui.&#8221; The narrower the scope, the better the output and the easier the review.</p>
<h3>2. The shared repository is sacred</h3>
<p>Every project has a <code>/shared/</code> directory — components, utilities, hooks, helpers — that&#8217;s been written, reviewed, and battle-tested. AI is instructed to <em>use</em> these, not to regenerate equivalents. When a developer notices the AI has produced something that duplicates shared code, that&#8217;s a Check failure. The PR gets sent back.</p>
<h3>3. Two-pass review on AI-heavy PRs</h3>
<p>Any PR where more than 30% of the diff is AI-generated gets a second reviewer. Not because we don&#8217;t trust the first reviewer, but because AI-generated code has a particular failure mode: it looks reasonable. Two pairs of eyes catch the &#8220;looks reasonable but isn&#8217;t&#8221; cases.</p>
<h3>4. Sprint-end refactor block</h3>
<p>Last day of every sprint, two hours blocked. The team walks through what was added that sprint and asks three questions:</p>
<ul class="arrowlist">
<li>What duplicates something we already had?</li>
<li>What got hand-patched in three places that should be one utility?</li>
<li>What&#8217;s complex enough that future-us will thank present-us for simplifying it now?</li>
</ul>
<h3>5. Commit messages that explain why</h3>
<p>AI is great at commit messages that describe <em>what</em> changed. We require commit messages that describe <em>why</em>. &#8220;Refactored auth flow&#8221; is rejected. &#8220;Refactored auth flow to remove duplicate token validation between middleware and controller&#8221; is accepted. The why is what makes the code base navigable in month seven.</p>
<h3>6. The &#8220;explain it to me&#8221; gate</h3>
<p>Before any AI-generated code merges, the developer who wrote the prompt has to be able to explain the code without referring to the AI. If they can&#8217;t, they don&#8217;t understand it well enough to maintain it. Which means nobody on the team does.</p>
<h2 id="tips">Seven practical tips you can apply Monday morning</h2>
<ol>
<li><strong>Set a &#8220;no main branch from AI alone&#8221; rule.</strong> Every AI-generated change passes through human review and a named human author on the commit. Not as a formality — as a record of accountability.</li>
<li><strong>Build a prompt library, not a prompt history.</strong> Save the prompts that produced good code. Treat them like reusable assets. New developers should be able to read your prompt library and understand how the team works with AI.</li>
<li><strong>Cap AI-generated PR size.</strong> We use a soft 400-line limit. Above that, the PR gets split. Large AI PRs are where review fatigue compounds and bugs slip through.</li>
<li><strong>Tag AI-generated functions during review.</strong> Not forever — just during review. A simple <code>// AI-generated, reviewed by [name]</code> comment makes the second reviewer&#8217;s job easier and creates a temporary audit trail.</li>
<li><strong>Run a duplication check before each sprint-end refactor.</strong> Tools like jscpd for JavaScript or PHP Copy/Paste Detector for PHP take five minutes and surface where AI has reinvented something you already had.</li>
<li><strong>Write the test first when the AI writes the implementation.</strong> If you let the AI write both, you get tests that pass against the implementation rather than tests that prove the implementation is correct. Human-written test, AI-written implementation — that order.</li>
<li><strong>Document the prompt alongside the code, not just the code.</strong> A short comment block at the top of an AI-generated module noting the original prompt and intent saves an hour of archaeology in month nine.</li>
</ol>
<h2 id="comparison">Uncontrolled vs. Controlled AI coding</h2>
<table class="styled-table">
<thead>
<tr>
<th>Dimension</th>
<th>Uncontrolled AI coding</th>
<th>Controlled AI coding</th>
</tr>
</thead>
<tbody>
<tr>
<td>Prompt scope</td>
<td>&#8220;Build the feature&#8221;</td>
<td>&#8220;Write this function with these inputs and these dependencies&#8221;</td>
</tr>
<tr>
<td>Review process</td>
<td>Skimmed if tests pass</td>
<td>Line-by-line, two reviewers on AI-heavy PRs</td>
</tr>
<tr>
<td>Reuse strategy</td>
<td>Regenerate from scratch each time</td>
<td>Shared repository of known-good components, called by reference</td>
</tr>
<tr>
<td>Refactoring</td>
<td>When something breaks</td>
<td>Sprint-end, every two weeks, before debt compounds</td>
</tr>
<tr>
<td>Documentation</td>
<td>&#8220;AI wrote this&#8221;</td>
<td>Intent, scope, and prompt context recorded</td>
</tr>
<tr>
<td>6-month maintainability</td>
<td>Original author needed; archaeology required</td>
<td>Any team member can extend or fix</td>
</tr>
<tr>
<td>Onboarding new developers</td>
<td>&#8220;Good luck&#8221;</td>
<td>Prompt library and shared repo are the orientation</td>
</tr>
</tbody>
</table>
<h2 id="checklist">The team audit checklist</h2>
<p>Run this checklist on your team&#8217;s current AI workflow. If you can&#8217;t tick five of these, you have an emerging maintainability problem — even if everything is shipping fine right now.</p>
<ul>
<li>Every AI-generated PR has a named human reviewer who can explain the code without the AI</li>
<li>The team has a documented shared repository of reusable components, and AI is instructed to use it</li>
<li><a href="https://www.macronimous.com/blog/writing-clean-code-with-ai/">Refactoring</a> is scheduled, not reactive</li>
<li>AI-heavy PRs (above 30% generated) get a second reviewer</li>
<li>Commit messages explain why, not just what</li>
<li>Prompts that produced good code are saved in a team-accessible prompt library</li>
<li>There is a hard or soft cap on AI-generated PR size</li>
<li>Duplication detection runs before each sprint-end refactor</li>
<li>Tests are written by humans for AI-written implementations, not the other way around</li>
<li>New developers are onboarded onto the team&#8217;s AI workflow as part of their first week</li>
</ul>
<h2 id="faq">Frequently asked questions</h2>
<div id="controlled-ai-coding-faq">
<div class="faq-item">
<h3>What is Controlled AI Coding?</h3>
<p>Controlled AI Coding is the practice of applying traditional engineering discipline — modular review, scheduled refactoring, reusable component repositories, and documented intent — to AI-generated code. It treats AI as a collaborator that produces drafts requiring human verification, rather than as an autonomous author whose output goes straight to production.</p>
</div>
<div class="faq-item">
<h3>How is it different from regular AI coding?</h3>
<p>Regular AI coding optimizes for short-term speed. Controlled AI Coding optimizes for long-term maintainability without sacrificing speed. The difference shows up in month six, not week one. Teams using controlled practices can extend, refactor, and onboard against their AI-assisted code base. Teams without those practices end up with code that ships fast but resists change.</p>
</div>
<div class="faq-item">
<h3>Doesn&#8217;t this slow the team down?</h3>
<p>Not measurably, in our experience. The Check step adds minutes per PR. The Refactor step adds two hours per sprint. The time saved is the four-day archaeology session in month seven when somebody has to figure out what an unreviewed AI-generated module actually does. It&#8217;s a slight tax in the present that prevents a large bill in the future.</p>
</div>
<div class="faq-item">
<h3>Which AI coding tools work best with this approach?</h3>
<p>Tool choice matters less than workflow. We use Claude Code, GitHub Copilot, and Cursor across different projects and developers. What matters is how the team handles the output, not which tool produced it. The CCR loop is tool-agnostic by design.</p>
</div>
<div class="faq-item">
<h3>How do you handle AI-generated code from junior developers?</h3>
<p>The &#8220;explain it to me&#8221; gate is most important here. A junior developer who can&#8217;t explain AI-generated code in their own PR doesn&#8217;t understand it well enough to own it. We treat that as a teaching moment, not a blocker — the senior reviewer walks through the code with the junior, and the junior rewrites or annotates until they can explain it without reference to the AI. After a few cycles, juniors learn to scope their prompts more carefully.</p>
</div>
<div class="faq-item">
<h3>Does this apply to small teams or solo developers?</h3>
<p>Yes, with adjustments. Solo developers can&#8217;t do peer review, but they can still scope prompts narrowly, maintain a shared repository, refactor on a schedule, and document intent. The CCR loop scales down. What it doesn&#8217;t tolerate is being skipped entirely, regardless of team size.</p>
</div>
<div class="faq-item">
<h3>How often should we refactor AI-generated code?</h3>
<p>At minimum, once per sprint. We do it at sprint-end because the work is fresh and the team is already in a review mindset. Monthly is the floor — anything less frequent and the duplication and drift compound faster than you can clean them up.</p>
</div>
</div>
<h2 id="bottom-line">The bottom line</h2>
<p>AI coding is not the end of engineering discipline. It&#8217;s the beginning of needing more of it, applied differently. The teams that recognize this and build a controlled workflow — Code, Check, Refactor, sprint after sprint — will own maintainable, extendable code bases that compound in value. The teams that don&#8217;t will spend 2027 and 2028 untangling what they shipped in 2026.</p>
<p>The old practices weren&#8217;t outdated. They were waiting for a moment exactly like this.</p>
<div class="mac-cta-box">
<h3>Need a development partner who treats your code base as a long-term asset?</h3>
<p>At <a href="http://Macronimous.com" target="_blank" rel="noopener">Macronimous</a>, we&#8217;ve been building React, PHP, and <a href="https://www.macronimous.com/blog/hidden-technical-debt-wordpress-seo/">WordPress</a> applications for clients across the USA, UK, and Australia since 2002. Our teams use AI tools where they help — and apply the engineering discipline that keeps your code base maintainable years after launch.</p>
<p><a class="mac-cta-button" href="https://www.macronimous.com/contact-us/">Talk to our team</a></p>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/controlled-ai-coding/">Controlled AI Coding: A Practical Guide for Dev 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/controlled-ai-coding/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>AI Layer for iOS Apps: What Developers Need to Know in 2026 &#124; Macronimous</title>
		<link>https://www.macronimous.com/blog/ai-layer-for-ios-apps/</link>
					<comments>https://www.macronimous.com/blog/ai-layer-for-ios-apps/#respond</comments>
		
		<dc:creator><![CDATA[Benny]]></dc:creator>
		<pubDate>Wed, 01 Apr 2026 06:21:13 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[iOS Development]]></category>
		<category><![CDATA[Mobile development]]></category>
		<category><![CDATA[AI layer for iOS apps]]></category>
		<category><![CDATA[AI Strategy]]></category>
		<category><![CDATA[App development]]></category>
		<category><![CDATA[iOS development]]></category>
		<category><![CDATA[Mobile AI]]></category>
		<category><![CDATA[mobile app development]]></category>
		<guid isPermaLink="false">https://www.macronimous.com/blog/?p=5148</guid>

					<description><![CDATA[<p>I&#8217;ll be honest with you. This blog post about giving &#8220;AI layer for iOS apps&#8221; started as an internal conversation at Macronimous. We&#8217;ve been building web and mobile applications since 2002 — over two decades of shipping products for clients across the USA, UK, and Australia. Right now, we&#8217;re in the process of reaching out [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/ai-layer-for-ios-apps/">AI Layer for iOS Apps: What Developers Need to Know in 2026 | Macronimous</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/03/AI-Layer-for-iOS-Apps.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-5149 size-full" src="https://www.macronimous.com/blog/wp-content/uploads/2026/03/AI-Layer-for-iOS-Apps.png" alt="AI Layer for iOS Apps" width="2240" height="1260" /></a>
<p>I&#8217;ll be honest with you. This blog post about giving &#8220;AI layer for iOS apps&#8221; started as an internal conversation at Macronimous.</p>
<p>We&#8217;ve been building web and mobile applications since 2002 — over two decades of shipping products for clients across the USA, UK, and Australia. Right now, we&#8217;re in the process of reaching out to our mobile app clients about adding <a href="https://www.macronimous.com/blog/the-code-your-ai-wants-to-delete-is-load-bearing/">AI</a> capabilities to their existing apps. For our Android clients, the path is relatively clear. Google&#8217;s Gemini is integrated at the system level, third-party <a href="https://www.macronimous.com/blog/ai-content-strategy/">AI</a> APIs are straightforward to implement, and the ecosystem is moving fast.</p>
<p>But for our <a href="https://www.macronimous.com/services/mobile-development/outsource-iphone-development/">iOS clients</a>? We&#8217;re genuinely unsure how to advise them right now. And we think that uncertainty is worth sharing — because if an agency that&#8217;s been doing this for 23 years is navigating this carefully, chances are you should be too.</p>
<p><!-- ===================== SECTION: THE CATALYST ===================== --></p>
<h2>What Sparked This Conversation about AI layer for iOS apps</h2>
<p>In March 2026, at SXSW in Austin, Nothing CEO Carl Pei made a bold prediction: the app era is ending. AI agents, he argued, will soon replace the app icons on your phone. You&#8217;ll simply state your intent — &#8220;get me a ride,&#8221; &#8220;order dinner,&#8221; &#8220;cancel my subscription&#8221; — and the AI handles everything. No icons. No app switching. No friction.</p>
<p>When we read this at <a href="https://www.macronimous.com/blog/macronimous-20-glorious-years-of-offshore-web-development/">Macronimous</a>, the first reaction wasn&#8217;t &#8220;he&#8217;s right&#8221; or &#8220;he&#8217;s wrong.&#8221; It was: <strong><em>what does this mean for the apps we&#8217;re building for clients right now?</em></strong></p>
<p>Because Pei isn&#8217;t entirely wrong. And the implications are different depending on whether you&#8217;re building for Android or iOS — and that difference is what most articles on this topic completely miss.</p>
<p><!-- ===================== SECTION: WHERE PEI IS RIGHT ===================== --></p>
<h2>Where Pei Is Right: Simple Tasks Will Go to AI</h2>
<p>Pei&#8217;s core argument is that apps have become fragmented and overwhelming. The average smartphone user has dozens of apps, each with its own interface, login, notification system, and learning curve. For simple, transactional tasks — booking a ride, ordering food, checking a flight status — the current process of opening an app, navigating menus, and tapping buttons is unnecessary friction.</p>
<p>He calls this the shift from <strong>app-centric to intent-centric computing</strong>.</p>
<p>We agree with this for a specific category of tasks. At Macronimous, we think of it as &#8220;command tasks&#8221; — one-shot instructions with a clear outcome. &#8220;Book me the cheapest Uber.&#8221; &#8220;Reorder my last Swiggy meal.&#8221; &#8220;Send this message to my team.&#8221; AI can handle these today, and it will only get better.</p>
<p><!-- ===================== SECTION: WHERE IT BREAKS DOWN ===================== --></p>
<h2>Where It Breaks Down: Complex Apps Aren&#8217;t Going Anywhere</h2>
<p>But now think about the apps your business actually depends on.</p>
<p>Open a <a href="https://www.macronimous.com/blog/intro-to-ucp-for-developers/">WooCommerce</a> dashboard. Navigate through orders, filter by status, adjust shipping rules, compare product variations. Open Figma and iterate on a design. Open Lightroom and fine-tune an exposure curve. Open your CRM and work through a pipeline.</p>
<p>These aren&#8217;t &#8220;commands.&#8221; They&#8217;re explorations. You don&#8217;t always know what you want until the interface shows you the options. The value of these apps isn&#8217;t just in completing a task — it&#8217;s in the visual decision-making, the iterative control, the ability to browse, compare, and adjust on the fly.</p>
<p>We build these kinds of apps for clients every day. And from that experience, we can tell you: no voice command or AI agent replaces this. Not today. Not for a long time.</p>
<p>So the real picture isn&#8217;t &#8220;apps die.&#8221; It&#8217;s: <strong>apps become the infrastructure that AI agents operate on top of.</strong> The front door to your product is changing, but the engine behind it stays.</p>
<p><!-- ===================== SECTION: THE APPLE PROBLEM ===================== --></p>
<h2>The Apple Problem: Why We&#8217;re Hesitant to Advise iOS Clients</h2>
<p>This is where we need to be transparent about the challenge we&#8217;re facing as an agency.</p>
<p>On the Android side, the AI roadmap is clear. Google&#8217;s Gemini is embedded at the system level. AI agents can interact across apps, read screens, chain actions, and orchestrate multi-step workflows. Samsung is pushing toward what it calls an &#8220;<a href="https://www.macronimous.com/blog/intelligent-phone-era/">AI OS</a>.&#8221; When we approach our Android app clients about adding an AI layer, we can point to a concrete ecosystem, working tools, and a clear direction.</p>
<p>On the iOS side? The picture is far murkier.</p>
<p>Apple announced Apple Intelligence at WWDC 2024 with over 20 AI features. It showcased a personalised, context-aware Siri that could understand your apps, execute multi-step tasks, and act as a true digital agent. The iPhone 16 was marketed heavily on these capabilities.</p>
<p><strong>The problem? Many of the most exciting features never shipped.</strong></p>
<p>The enhanced Siri with personal context awareness and in-app actions was delayed repeatedly. Tim Cook <a href="https://www.tomsguide.com/ai/apple-intelligence/tim-cook-defends-siri-during-apple-earnings-call-we-need-more-time" target="_blank" rel="noopener">acknowledged</a> in 2025 that it was &#8220;taking a bit longer than we thought.&#8221; As of March 2026, Apple insists the features are &#8220;still on track to launch in 2026,&#8221; but reports suggest some capabilities may not arrive until iOS 26.5 (May) or even iOS 27 (September).</p>
<p>The delays were severe enough to trigger multiple class-action lawsuits. Consumers accused Apple of false advertising, arguing they purchased iPhone 16 devices based on AI features that didn&#8217;t exist. South Korea&#8217;s National Pension Service, the world&#8217;s third-largest pension fund, led a shareholder fraud lawsuit. Apple is fighting to dismiss these cases, but the reputational damage is real.</p>
<p>As an agency, this puts us in a difficult position. When a client asks, <strong>&#8220;Should we add AI capabilities to our iOS app?&#8221;</strong>, we can&#8217;t point to a stable, shipping AI orchestration layer from Apple the way we can with Google&#8217;s Gemini on Android. The system-level intelligence that would let Siri chain actions across apps — the kind of experience Carl Pei is describing — simply doesn&#8217;t exist on iOS yet.</p>
<p><!-- ===================== SECTION: WHAT IS AVAILABLE ===================== --></p>
<h2>What IS Available Right Now on iOS — And It&#8217;s More Than You Think</h2>
<p>That said, it&#8217;s not all waiting. Apple has shipped some genuinely useful building blocks that developers can act on today. Here&#8217;s what&#8217;s on the table:</p>
<h3>App Intents: The Foundation You Need to Lay Now</h3>
<p>Apple&#8217;s App Intents framework is the bridge between your app and Apple Intelligence. It&#8217;s how Siri discovers what your app can do, triggers actions, and chains tasks across multiple apps. Think of App Intents as the universal API for the AI era on iOS — if your app doesn&#8217;t speak this language, it won&#8217;t get discovered.</p>
<p>When the enhanced Siri does finally arrive, it will be able to perform requests like &#8220;Find the receipt I got yesterday, crop it, and email it to my accountant&#8221; — but only if the apps involved have adopted App Intents. Apps that haven&#8217;t will simply be invisible.</p>
<p>Our advice to clients: <strong>adopt App Intents now, even before Siri catches up.</strong> It already powers Siri Shortcuts and Spotlight integration, and it&#8217;s the clear direction Apple is heading. Building this foundation today means you&#8217;re ready when the AI orchestration layer ships — whenever that may be.</p>
<h3>Foundation Models Framework: Free, On-Device AI</h3>
<p>With iOS 26, Apple released the <a href="https://developer.apple.com/documentation/FoundationModels" target="_blank" rel="noopener">Foundation Models framework</a>, giving developers direct access to the on-device large language model. With as few as three lines of Swift code, you can integrate text extraction, summarisation, guided generation, and tool calling — all running locally, offline-capable, and at zero inference cost.</p>
<p>This is already being used in production. Apps like CellWalk generate conversational explanations of scientific terms. Grammo built an AI grammar tutor that creates exercises on the fly. Signeasy uses it to summarise contracts and answer document-specific questions.</p>
<p>This is the part that excites us at <a href="https://www.macronimous.com/">Macronimous</a>. It&#8217;s available now, it&#8217;s free, and it&#8217;s genuinely useful for a wide range of app types. If your app involves any kind of text processing, search, content summarisation, or contextual suggestions, this framework is worth exploring immediately.</p>
<h3>Third-Party AI APIs: Don&#8217;t Wait for Apple</h3>
<p>Here&#8217;s something important that often gets lost in the Apple-centric conversation: <strong>nothing stops you from building AI capabilities inside your iOS app today using third-party APIs.</strong></p>
<p>OpenAI&#8217;s GPT models, Google&#8217;s Gemini, Anthropic&#8217;s Claude — these are all accessible via standard API calls from within any iOS app. You can add smart search, natural language queries, personalised recommendations, conversational interfaces, or AI-powered workflows without waiting for Apple to ship a single thing.</p>
<p>This is the approach we&#8217;re most likely to recommend to our iOS clients in the near term. It sidesteps Apple&#8217;s uncertainty entirely. You control the AI layer, you choose the model, and you ship on your own timeline.</p>
<p><!-- ===================== SECTION: THE HONEST DILEMMA ===================== --></p>
<h2>The Honest Dilemma: What We&#8217;re Telling Our Clients</h2>
<p>When our clients ask about AI today, here&#8217;s the honest conversation we&#8217;re having:</p>
<p><!-- Android box --></p>
<div style="background: #EBF5EB; border-left: 5px solid #4CAF50; border-radius: 4px; padding: 20px 25px; margin: 20px 0;">
<p style="font-weight: bold; color: #2e7d32; font-size: 17px; margin-top: 0;">For Android App Clients:</p>
<p style="margin-bottom: 0;">The path is clear. Gemini integration at the OS level is real and shipping. Add AI features now — both within your app via APIs and through system-level integration. The ecosystem supports it, and users are already expecting it.</p>
</div>
<p><!-- iOS box --></p>
<div style="background: #FFF8ED; border-left: 5px solid #F5A623; border-radius: 4px; padding: 20px 25px; margin: 20px 0;">
<p style="font-weight: bold; color: #b07d1a; font-size: 17px; margin-top: 0;">For iOS App Clients:</p>
<p style="margin-bottom: 0;">Be strategic, not reactive. Adopt App Intents to future-proof your app. Explore the Foundation Models framework for on-device intelligence. And if you want AI features that ship now, use third-party APIs (OpenAI, Gemini, Claude) rather than waiting for Apple&#8217;s system-level AI, which remains delayed and uncertain. Build the AI layer yourself — don&#8217;t rely on Apple to build it for you.</p>
</div>
<p><!-- Cross-platform box --></p>
<div style="background: #EDE7F6; border-left: 5px solid #7E57C2; border-radius: 4px; padding: 20px 25px; margin: 20px 0;">
<p style="font-weight: bold; color: #5e35b1; font-size: 17px; margin-top: 0;">For Cross-Platform App Clients:</p>
<p style="margin-bottom: 0;">You need a dual strategy. Lean into Gemini and Android&#8217;s agentic capabilities on one side. Build self-contained AI features within your iOS app on the other. The capability gap between platforms is real, and pretending it doesn&#8217;t exist will leave one version of your app behind.</p>
</div>
<p><!-- ===================== SECTION: CHECKLIST ===================== --></p>
<h2>A Practical Checklist: Preparing Your App for the AI Layer</h2>
<p>Whether you&#8217;re building a new app or maintaining an existing one, here&#8217;s what we recommend prioritising based on our own evaluation:</p>
<ol>
<li><strong>Adopt App Intents now.</strong> Map your app&#8217;s core actions — what can a user do? What data can be surfaced? Make these intents discoverable by Siri, Spotlight, and Shortcuts. This is non-negotiable for iOS apps going forward.</li>
<li><strong>Explore the Foundation Models framework.</strong> If your app involves text processing, search, summarisation, or contextual suggestions, Apple&#8217;s on-device LLM is free and ready to use today.</li>
<li><strong>Build API-first architecture.</strong> If an AI agent can&#8217;t &#8220;read&#8221; your app, your app won&#8217;t exist in the coming ecosystem. Expose your data and actions through well-structured APIs.</li>
<li><strong>Map your user flows into two buckets.</strong> Identify which workflows are &#8220;command tasks&#8221; (automatable by AI) vs. &#8220;exploration tasks&#8221; (where your UI is the product). Invest heavily in the latter — that&#8217;s your moat.</li>
<li><strong>Integrate third-party AI APIs for immediate wins.</strong> OpenAI, Gemini, and Claude APIs are available now. Add smart search, natural language queries, or conversational interfaces without waiting for Apple.</li>
<li><strong>Test the AI experience on both platforms.</strong> If you&#8217;re cross-platform, understand that Android&#8217;s AI integration is meaningfully ahead. Don&#8217;t assume feature parity.</li>
<li><strong>Watch WWDC 2026 closely.</strong> Apple&#8217;s developer conference will likely focus heavily on AI — expanded Foundation Models, more powerful App Intents, and potentially the long-awaited Siri overhaul. Be ready to move fast when it lands.</li>
</ol>
<p><!-- ===================== SECTION: BIGGER PICTURE ===================== --></p>
<h2>The Bigger Picture: Why We&#8217;re Writing This</h2>
<p>We could have kept this analysis internal. Most agencies do. But we&#8217;ve been in this industry long enough to know that the developers and app owners who thrive through transitions are the ones who see them coming early.</p>
<p>In 2007, the iPhone changed how people interacted with software. In 2008, the App Store created an entirely new economy. We were there for both of those shifts, building through them.</p>
<p>What&#8217;s happening now feels like a similar inflection point — not as dramatic as &#8220;apps are dead,&#8221; but a real structural change in how users will interact with your product. The interface is no longer the only way in. AI agents, voice assistants, and system-level intelligence are becoming new front doors to your services.</p>
<p>The apps that survive this transition will be the ones that AI can work <em>with</em>, not around. And the developers who start preparing now — even amid Apple&#8217;s uncertainty — will be the ones best positioned when the pieces finally fall into place.</p>
<p><strong>We&#8217;re preparing. We think you should be to</strong></p>
<p><!-- CTA Box --></p>
<div style="background: #FFF8ED; border: 2px solid #F5A623; border-radius: 6px; padding: 25px 30px; margin: 10px 0 30px 0;">
<p style="font-weight: bold; font-size: 18px; color: #2d2d2d; margin-top: 0;">Need Help Adding an AI Layer to Your Mobile App?</p>
<p style="color: #666;">At Macronimous, we&#8217;ve been building web and mobile solutions since 2002 for clients across the USA, UK, and Australia. Whether you&#8217;re looking to integrate AI into an existing iOS or Android app, build an AI-first product, or simply need a technical assessment of where AI fits into your roadmap — we&#8217;d love to have that conversation.</p>
<p style="margin-bottom: 0;"><strong>Let&#8217;s talk:</strong> <a style="color: #f5a623;" href="https://www.macronimous.com/contact-us/">Contact us</a></p>
</div>
<p>The post <a rel="nofollow" href="https://www.macronimous.com/blog/ai-layer-for-ios-apps/">AI Layer for iOS Apps: What Developers Need to Know in 2026 | Macronimous</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-layer-for-ios-apps/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
