[{"data":1,"prerenderedAt":329},["ShallowReactive",2],{"writing-list":3},[4,141,241],{"id":5,"title":6,"body":7,"description":118,"extension":119,"featured":120,"kind":121,"meta":122,"navigation":120,"ogImage":123,"order":110,"path":124,"publishedAt":125,"relatedWork":126,"seo":127,"stem":128,"summary":129,"takeaways":130,"technologies":135,"videoDuration":123,"videoId":123,"__hash__":140},"articles\u002Fwriting\u002Fai-native-development.md","What AI-Native Development Looks Like Inside a Real Business",{"type":8,"value":9,"toc":108},"minimark",[10,15,24,28,35,41,47,51,57,63,69,74,78,87,91],[11,12,14],"h2",{"id":13},"ai-native-is-a-workflow-not-a-claim","\"AI-native\" is a workflow, not a claim",[16,17,18,19,23],"p",{},"Saying you use AI tools doesn't say much on its own — the interesting question is ",[20,21,22],"em",{},"where"," they sit\nin the process, and where they explicitly don't. Here's the honest breakdown of how I actually use\nthem.",[11,25,27],{"id":26},"where-they-help-most","Where they help most",[16,29,30,34],{},[31,32,33],"strong",{},"Implementation speed."," Once a design is settled, tools like Claude Code and Codex can turn it\ninto working code — including tests and boilerplate — dramatically faster than typing it by hand.\nThis is the biggest, most consistent win.",[16,36,37,40],{},[31,38,39],{},"Fast iteration."," Cursor is where I do tight, in-editor loops — small changes, quick feedback,\nstaying in flow on a specific file or function.",[16,42,43,46],{},[31,44,45],{},"Research and second opinions."," Gemini is useful for exploring unfamiliar APIs or getting a second\nperspective on an approach before committing to it.",[11,48,50],{"id":49},"where-judgment-stays-mine","Where judgment stays mine",[16,52,53,56],{},[31,54,55],{},"System design."," Architecture decisions, data models, and failure-mode thinking happen before any\nAI tool touches the problem. This is the part that determines whether a system is maintainable six\nmonths later.",[16,58,59,62],{},[31,60,61],{},"Review."," Every AI-generated change goes through the same review I'd apply to a human\ncollaborator's pull request — often more scrutiny, because it doesn't yet have a track record in\nthis specific codebase.",[16,64,65,68],{},[31,66,67],{},"The decision to ship."," Tests passing and code looking plausible isn't the bar. The bar is the same\none I'd hold any production change to: does this behave correctly under the real, messy conditions\nof the system it's going into.",[70,71],"architecture-diagram",{":steps":72,"title":73},"[{\"label\":\"Design (human)\",\"detail\":\"Architecture, constraints\"},{\"label\":\"Build (AI-assisted)\",\"detail\":\"Claude Code, Codex, Cursor\"},{\"label\":\"Review (human)\",\"detail\":\"Same bar as any PR\"},{\"label\":\"Ship + monitor (human)\",\"detail\":\"Judgment, not automation\"}]","Where AI sits in the process",[11,75,77],{"id":76},"why-grounding-matters","Why grounding matters",[16,79,80,81,86],{},"The failure mode of AI-assisted work isn't usually \"the code doesn't run\" — it's confident-sounding\noutput that's subtly wrong. The fix is grounding: giving the tool real, verifiable data and\nconstraints instead of open-ended requests, and treating its output as a draft to verify rather than\nan answer to trust. I built a small, concrete example of this idea in the\n",[82,83,85],"a",{"href":84},"\u002Fwork\u002Fprojects\u002Fai-ops-recap-agent","AI operations recap agent"," project.",[11,88,90],{"id":89},"related","Related",[92,93,94,102],"ul",{},[95,96,97,101],"li",{},[82,98,100],{"href":99},"\u002Fwork\u002Fcase-studies\u002Fai-assisted-automation","AI-Assisted Business Automation"," — the full case study",[95,103,104,107],{},[82,105,106],{"href":84},"AI Operations Recap Agent"," — a small, concrete example",{"title":109,"searchDepth":110,"depth":110,"links":111},"",3,[112,114,115,116,117],{"id":13,"depth":113,"text":14},2,{"id":26,"depth":113,"text":27},{"id":49,"depth":113,"text":50},{"id":76,"depth":113,"text":77},{"id":89,"depth":113,"text":90},"What it actually looks like to fold Claude Code, Codex, Cursor, and Gemini into real ecommerce systems work — where the tools help, where human judgment stays non-negotiable.","md",true,"article",{},null,"\u002Fwriting\u002Fai-native-development","2026-05-18",[99,84],{"title":6,"description":118},"writing\u002Fai-native-development","A practical look at using Claude Code, Codex, Cursor, and Gemini as part of a real, accountable engineering workflow.",[131,132,133,134],"AI tools are excellent at implementation speed, not at owning system design","Every AI-generated change gets the same review bar as a human pull request","The tools you reach for should match the task — exploration, iteration, or multi-file builds","Grounding AI output in real, verifiable data is what makes it trustworthy",[136,137,138,139],"Claude Code","Codex","Cursor","Gemini","psq03nSGbEitqAbB56OmLn8k3h54IG7OUbfgoSwAzrA",{"id":142,"title":143,"body":144,"description":223,"extension":119,"featured":120,"kind":121,"meta":224,"navigation":120,"ogImage":123,"order":113,"path":225,"publishedAt":226,"relatedWork":227,"seo":228,"stem":229,"summary":230,"takeaways":231,"technologies":236,"videoDuration":123,"videoId":123,"__hash__":240},"articles\u002Fwriting\u002Fwhy-import-pipelines-fail.md","Why Ecommerce Product-Import Pipelines Fail",{"type":8,"value":145,"toc":217},[146,150,153,157,163,169,175,181,185,189,202,204],[11,147,149],{"id":148},"they-rarely-fail-loudly","They rarely fail loudly",[16,151,152],{},"The import pipelines that cause real damage don't crash — they succeed partially and quietly. A feed\ntruncated at 80% still \"runs successfully.\" A currency field silently defaulting to the wrong unit\nstill \"imports.\" The failure modes worth designing around are the ones that don't throw an\nexception.",[11,154,156],{"id":155},"common-failure-patterns","Common failure patterns",[16,158,159,162],{},[31,160,161],{},"Silent partial failures."," A job that processes 8,000 of 10,000 rows and reports success on the\n8,000 is often worse than a job that fails outright — it looks healthy in every dashboard while\nquietly corrupting the catalogue.",[16,164,165,168],{},[31,166,167],{},"Unowned unit and category mapping."," Every supplier has its own idea of units and categories.\nWithout an explicit, versioned mapping layer — not a pile of if-statements — these mismatches\ncompound for months before anyone notices the pattern.",[16,170,171,174],{},[31,172,173],{},"No rollback path."," Eventually a bad import gets published. If there's no way to revert to the\nlast known-good state quickly, that one bad run becomes a multi-day cleanup project instead of a\nfive-minute fix.",[16,176,177,180],{},[31,178,179],{},"Testing that doesn't reflect real chaos."," Import pipelines tested against clean, hand-crafted\nsample files pass every test and still break on day one against a real supplier's actual export —\nbecause real feeds are inconsistent in ways nobody thinks to fabricate in a test fixture.",[70,182],{":steps":183,"title":184},"[{\"label\":\"Feed arrives\",\"detail\":\"Truncated, reordered, re-encoded\"},{\"label\":\"Parsed 'successfully'\",\"detail\":\"Partial data, no error thrown\"},{\"label\":\"Published\",\"detail\":\"Looks healthy in every dashboard\"},{\"label\":\"Discovered\",\"detail\":\"Days later, by a customer or a stockout\"}]","Where pipelines actually break",[11,186,188],{"id":187},"what-actually-holds-up","What actually holds up",[16,190,191,192,196,197,201],{},"Validate at every boundary, diff before publishing, own unit\u002Fcategory mapping explicitly and\nversion it, and keep a fast rollback path for when — not if — something bad gets published anyway.\nI go into how this plays out in practice in the\n",[82,193,195],{"href":194},"\u002Fwork\u002Fcase-studies\u002Fcatalogue-automation","catalogue automation"," and\n",[82,198,200],{"href":199},"\u002Fwork\u002Fcase-studies\u002Fshopify-amazon-sync","Shopify\u002FAmazon sync"," case studies.",[11,203,90],{"id":89},[92,205,206,212],{},[95,207,208],{},[82,209,211],{"href":210},"\u002Fwriting\u002Fmanaging-product-data-at-scale","How I Manage Product Data Across 200,000+ SKUs",[95,213,214],{},[82,215,216],{"href":194},"High-Volume Ecommerce Catalogue Automation",{"title":109,"searchDepth":110,"depth":110,"links":218},[219,220,221,222],{"id":148,"depth":113,"text":149},{"id":155,"depth":113,"text":156},{"id":187,"depth":113,"text":188},{"id":89,"depth":113,"text":90},"The recurring reasons ecommerce product-import pipelines break in production, from silent partial failures to unvalidated matching, and how to design against each one.",{},"\u002Fwriting\u002Fwhy-import-pipelines-fail","2026-05-05",[194,199],{"title":143,"description":223},"writing\u002Fwhy-import-pipelines-fail","The failure modes I see repeatedly in supplier feed and product-import systems — and how to design around them.",[232,233,234,235],"Silent partial failures are more dangerous than loud total failures","Unit and category mapping problems compound over time if not owned explicitly","A pipeline without a rollback path will eventually need one","It worked in testing",[237,238,239],"Python","ETL design","Data validation","3TXeA4s4fGvXQuEsJx66q-hyUQjRWGJ9zlIygJIggwI",{"id":242,"title":243,"body":244,"description":312,"extension":119,"featured":120,"kind":121,"meta":313,"navigation":120,"ogImage":123,"order":314,"path":210,"publishedAt":315,"relatedWork":316,"seo":317,"stem":318,"summary":319,"takeaways":320,"technologies":325,"videoDuration":123,"videoId":123,"__hash__":328},"articles\u002Fwriting\u002Fmanaging-product-data-at-scale.md","How I Manage Product Data Across 200,000+ Ecommerce SKUs",{"type":8,"value":245,"toc":304},[246,250,253,257,260,264,267,271,275,278,282,289,291],[11,247,249],{"id":248},"the-short-version","The short version",[16,251,252],{},"Most of the pain in a large ecommerce catalogue isn't any single hard technical problem — it's the\naccumulation of a hundred small inconsistencies across suppliers, formats, and time. Here's the set\nof patterns I've found actually hold up at 200,000+ SKUs.",[11,254,256],{"id":255},"treat-every-source-as-untrusted","Treat every source as untrusted",[16,258,259],{},"It doesn't matter if a supplier feed has been reliable for two years — the day you stop validating\nit is the day a malformed export takes ten thousand SKUs to zero stock. Every ingestion job should\nassume the incoming file could be truncated, reordered, re-encoded, or just wrong, and validate\nbefore anything downstream trusts it.",[11,261,263],{"id":262},"matching-needs-a-confidence-score-not-a-boolean","Matching needs a confidence score, not a boolean",[16,265,266],{},"Product matching — deciding whether a new record is the same as an existing one — is rarely a clean\nyes\u002Fno. Exact key matches (a stable part number, a UPC) are easy. Everything else is a confidence\nproblem: title similarity, brand plus attribute overlap, price plausibility. The systems that work\nwell score that confidence and route anything below a threshold to a human, instead of forcing a\nbinary decision the data doesn't support.",[70,268],{":steps":269,"title":270},"[{\"label\":\"Exact key match\",\"detail\":\"Auto-approved\"},{\"label\":\"High-confidence fuzzy match\",\"detail\":\"Auto-approved, logged\"},{\"label\":\"Low-confidence match\",\"detail\":\"Human review queue\"}]","Matching confidence routing",[11,272,274],{"id":273},"diff-before-you-publish","Diff before you publish",[16,276,277],{},"The single highest-leverage habit in catalogue automation is generating a diff report before\nanything goes live — new items, removed items, changed fields, all visible before publication. This\ncatches more real problems than any individual validation rule, because it surfaces things you\ndidn't think to write a rule for.",[11,279,281],{"id":280},"the-hardest-part-isnt-technical","The hardest part isn't technical",[16,283,284,285,288],{},"The genuinely hard part of running a catalogue this size isn't the code — it's the organizational\ndiscipline to keep supplier relationships, data contracts, and escalation paths clear enough that\nthe automation has something reliable to build on. I go deeper on the system itself in the\n",[82,286,287],{"href":194},"catalogue automation case study",".",[11,290,90],{"id":89},[92,292,293,297],{},[95,294,295,101],{},[82,296,216],{"href":194},[95,298,299,303],{},[82,300,302],{"href":301},"\u002Fwork\u002Fprojects\u002Fcatalogue-pipeline-toolkit","Product Catalogue Pipeline Toolkit"," — the public, reusable version of these patterns",{"title":109,"searchDepth":110,"depth":110,"links":305},[306,307,308,309,310,311],{"id":248,"depth":113,"text":249},{"id":255,"depth":113,"text":256},{"id":262,"depth":113,"text":263},{"id":273,"depth":113,"text":274},{"id":280,"depth":113,"text":281},{"id":89,"depth":113,"text":90},"Practical patterns for ingesting, normalizing, matching, and validating a 200,000+ SKU ecommerce catalogue fed by FTP files, APIs, and scrapers.",{},1,"2026-04-20",[194,301],{"title":243,"description":312},"writing\u002Fmanaging-product-data-at-scale","The practical patterns I rely on to keep a large, multi-source catalogue clean, current, and trustworthy.",[321,322,323,324],"Treat every ingestion source as untrusted input, no matter how long you've used it","Matching needs a confidence score and a human review queue, not a hard yes\u002Fno","Diff-before-publish catches more real problems than any single validation rule","The hardest part of catalogue automation is organizational, not technical",[237,326,327],"PostgreSQL","Pandas","RifS8phw0wNELYSMrDwaHv_oCOBlz6BAps1Yg3GTPJ8",1785688078907]