I replaced most of a dev team with Claude Code to build a production e-commerce store. Here's what broke. A developer built a production e-commerce store for a women's clothing boutique solo using WordPress, WooCommerce, and Claude Code, which wrote most of the code while the developer handled architecture and review. The project synced real-time inventory from the 1C ERP system, matched an existing React prototype pixel for pixel, and integrated local payment processing and courier delivery on a budget that ruled out enterprise platforms like Bitrix. The developer reports that AI-assisted coding compressed effort into review rather than typing, but surfaced real bugs and friction, including repeated disagreements over a zero-border-radius design rule. First post here. Figured a real project beats an introduction post, so: here's one, warts included. A women's clothing brand needed an online store synced to their inventory system, matched to an existing React prototype pixel for pixel, on a budget that ruled out the usual enterprise platforms. I built it solo: WordPress, WooCommerce, and Claude Code writing most of the code while I did the architecture and reviewed everything it touched. Not the demo-reel version of AI coding. The one with the actual bugs. The client's inventory lives in 1C, the ERP and point-of-sale system that runs most Russian retail, a corporate accounting platform that only talks to the outside world through XML. Ask around for how to sync a site with it and you get the same answer every time: build on Bitrix, the dominant commercial CMS there, which ships a stock exchange module and a pool of integrators who already know how to bill for it. Every market has its own version of this. Whatever the local business-software incumbent is, some platform built a plugin for it years ago, and agencies default to it because that's what they already know how to staff. For a one-location boutique, that default breaks on two fronts. Cost first. License, annual renewal, integrator fees: add it up and you're close to the entire budget of this open source build, before a single feature exists. Then design. The client had a React prototype already, a specific quiet-luxury look, four colors, two typefaces, zero border radius everywhere, and wanted it copied exactly, not approximated. Forcing that onto a stock theme takes longer than writing one from scratch. None of the actual requirements got smaller because the budget did: real-time stock from an ERP where every size-color pair carries its own count, card and instant-payment processing through a local processor, courier delivery, a cookie banner and consent checkboxes for local privacy law, ecommerce event tracking. All of it, on a budget that assumed almost none of it. inc/ structure, custom fields registered in code instead of through an admin UI IntersectionObserver for scroll animations, history.pushState for filter state theme.json as the single source of truth, CSS variables generated from it No Elementor, no page builder plugin of any kind. On a budget project that's arithmetic, not taste: every builder plugin costs you performance, ties you to somebody else's release schedule, and inserts a layer between the design and the code you actually control. Design tokens moved straight into theme.json , WordPress's native token file. Four colors, an 8px spacing scale, two typefaces. WordPress turns that into CSS variables on its own, and every stylesheet touches only those variables, never a raw value: :root { --color-bone: / background, roughly 70% of the canvas /; --color-ink: / text and UI /; --color-bordeaux: / sale badges and accents /; --color-pine: / dark navigation /; } Border radius sits at zero everywhere except pill-shaped tags. That one rule caused more arguments with the agent than anything else on the project, more on that in a second. functions.php does nothing but wire up modules: // functions.php: wiring only, no logic require once get theme file path 'inc/setup.php' ; require once get theme file path 'inc/assets.php' ; require once get theme file path 'inc/woocommerce.php' ; require once get theme file path 'inc/ajax-handlers.php' ; One file, one job. Repeating sections became block patterns, header and footer became template parts, and WooCommerce's default templates got overridden only where the stock markup broke the design. The agent didn't build this alone. It wrote most of the code; I did the architecture, broke the work into tasks, and reviewed what came back. That's not less work than building it by hand. It's the same amount of thinking, compressed into review instead of typing. Three things kept it from falling apart, and the first one mattered more than I expected going in. Claude Code reads a project instructions file, CLAUDE.md , at the start of every session. I put the entire design system in there as flat prohibitions: exactly four colors, no raw hex anywhere in the codebase, radius is zero, spacing only off the 8px scale. Leave an LLM alone and it improvises constantly, cheerfully, and exactly the way that wrecks a tight design system. With the rule sitting there in black and white, when the agent needs a new shade it doesn't reach for a hex code, it derives one with oklch off an existing token, because the file tells it that's the only move on the table. Memory came next, because the agent's context resets and this project didn't, it ran for months. Every real lesson, "WooCommerce Blocks doesn't load jQuery," "the ERP's delta exports quietly wipe out product variations," got written down in a markdown file the agent rereads on the next session. New session, same traps already mapped. And then verification, which I'd fight hardest to keep if someone told me to cut a corner. The agent has Playwright access through MCP: it opens the live page itself, clicks through the actual flow, takes a screenshot, and compares it to the prototype, instead of me squinting at a screenshot and taking its word for it. Rule: no "fixed" without a real check behind it. That rule paid for itself on a bug where product card links quietly stopped working, only on desktop, only in production. The agent reproduced it with an actual click through Playwright and traced it to setPointerCapture inside the image carousel, which was grabbing pointer events and redirecting the click from the product link onto the carousel track underneath it. Nobody was finding that by staring at the carousel code. It looked fine. It was fine, mostly. Where it falls down, and I mean this as a flat statement, not a complaint: it will confidently fix the wrong root cause if you don't force a reproduction first. It drifts outside the design system the second a rule gets fuzzy instead of explicit. It loses the thread on anything long without something external reminding it what already happened. All three are process failures, not model failures. This ate more hours than everything else combined, and it's the part that matters most if you're wiring any ERP or POS system into an ecommerce platform over an XML feed, not just this stack. The sync runs on CommerceML: the ERP exports packets on a schedule and on events, a plugin on the WordPress side parses them, catalog updates. Simple as a diagram. The traps are all in the details, and since CommerceML is a Russian national standard, the XML element names in the snippet below are genuinely Russian words. Not obfuscation, just the protocol. First bug: stock counts that weren't real. The storefront showed wrong numbers even though the sync ran clean, no errors, no warnings, everything green. Took diffing raw XML against what actually landed in the database to find it. In the protocol version we were on, stock arrives in separate files with a nested structure, split per warehouse: <Предложение <Ид product-guid variation-guid