
What Breaks When You Build With AI Agents for Six Months
I built a production app almost entirely with AI coding agents. The code was fine. The process fell apart in ways I didn't expect, and fixing it turned into a second project.
Read more →I'm Laud Tetteh, a software engineer in Seattle. I started out hand-coding everything, taught myself in public, and spent 12 years learning how web platforms actually behave — under load, under deadline, and under other people's deployment mistakes. These days a lot of my work is building the scaffolding that makes AI coding agents dependable on real codebases. Both halves are load-bearing: the second only works because of the first.
At Salesforce/Tableau I work on tableau.com — roughly 13 million visits a month (Semrush estimate, 2026). I build product on it and co-own the automation underneath it. I asked for the on-call rotation rather than waiting to be assigned it, then contributed to the working agreement that governs it.
On my own time, the same habit turned a brittle AI-agent workflow into reusable guardrails for real projects, including the work I do for a living. That's the shape of it: build the thing, find where it breaks, then fix the class of problem rather than the instance.
Tableau Marketing Engineering
I work on tableau.com — a top-5,400 global site drawing roughly 13 million visits a month (Semrush estimate, August 2026), running a large enterprise Drupal installation of about 58 custom modules, 3,500 configuration files, and a hundred-spec end-to-end test suite.
I co-own the automation that moves code and data through our environments — a five-image CI container suite, reusable composite Actions, a gated pipeline that ships four releases a week unattended, and the CDN delivery layer in front of all of it.
I co-own the automation that moves code and data through our environments. I didn’t write this pipeline — I inherited it, and I’ve spent four years making it measurably better without breaking the team that depends on it. That’s a five-image CI container suite in a private registry, reusable composite Actions covering dependency caching, test setup and registry auth, and a gated pipeline promoting integration → dev → test → production with commit-SHA parity checks at each hop and a programmatic gate that blocks the production deploy if the previous stage’s checks didn’t pass. Four releases a week run unattended. A nightly ETL — extract, transform, load — clones production down to test and dev, prunes and sanitizes it, and provisions test users, so every engineer starts the day on realistic, safe data.
I also do a lot of the delivery work in front of the application. I rolled out Brotli compression for asset delivery at the CDN edge, create and maintain our Akamai property configurations, and run and monitor the phased-release cloudlets that traffic moves through during a cutover. The edge is the layer where a bad rule is visible to everyone the moment it goes live, so most of the job is being careful before it does.
Two pieces are mine outright. I designed the branch-scoped dependency cache keys that eliminated a cross-environment cache-poisoning failure mode — a class of intermittent build failure that is genuinely hard to see. And I own credential rotation across cloud IAM, source control and service accounts, always verifying a clean deploy on the new keys before retiring the old ones.
I extended an existing pricing product inside the legacy Tableau platform, contributed to the architecture for bulk content ingestion, and updated product-download gating with an operator kill switch.
The Pricing Calculator leads Projects below, where the useful question is what the public tool does. In the role history, the useful question is how it shipped: I extended an existing product inside a legacy Drupal platform instead of rebuilding it, negotiated payload contracts with the frontend team, moved multi-currency logic and cached exchange rates server-side, and covered the flow with accessibility, analytics and Cypress work.
I also contributed to the technical architecture for a bulk content-ingestion system that moves up to 100 CMS nodes in a single operation, implemented both its admin interface and its backend, and ran cross-team user acceptance testing that deliberately fed it out-of-order payloads to prove it wouldn’t corrupt state. And I updated the authentication gating on product download pages with a kill switch operators can flip from the CMS — because the useful question about a gate isn’t whether it works, it’s how fast you can turn it off at 2am.
A decade of marketing-analytics engineering, including the GA4 data-layer re-platform that effectively every conversion event the marketing organization measures runs through.
I’ve been doing marketing-analytics engineering for a decade. It started at Moz in 2016 with Adobe DTM and Segment, and at Tableau I led the site’s GA4 data-layer re-platform — ten-plus event types, custom deduplication so nothing double-counts, consent-aware cookie handling, and customer-relationship-management (CRM) interactions integration. Effectively every conversion event the marketing organization measures runs through it. I also built metadata export tooling that lets analysts join traffic data against CMS metadata; it has been reused across two migrations and re-requested more than a year after I first built it.
Contributing engineer on the multi-year re-platform off Drupal onto a consolidated enterprise WordPress multisite, and the edge work in front of it — 469 legacy redirects inventoried, 466 migrated to a CDN edge policy, three deliberately held back.
I’m a contributing engineer on the multi-year re-platform of the site off Drupal and onto a consolidated enterprise WordPress multisite with a decoupled Node.js frontend — content transformation, Terraform-managed environment configuration, GraphQL integration, and phased traffic cutover at the CDN, without interrupting global marketing operations.
The redirect migration is the part I’d point at. I inventoried 469 legacy redirects, separated 466 clean ones from three with semantics that needed their own owner decisions, imported the clean set into a CDN edge policy, and validated the exported policy against the import row by row before activating it in production. Holding three rows back was the whole point — bundling them would have hidden real risk inside a large mechanical migration.
I review more code than I write — 208 pull requests reviewed against 134 opened, across six repositories. I also lead the weekly operations review, contributed to the on-call working agreement that went org-wide inside a quarter, and take the release rotation as Release Engineer of record.
I take the release rotation as Release Engineer of record — owning user acceptance testing and production deployment coordination, and signing off the change request. For about two years I’ve led our weekly operations review, where post-deployment triage happens and where I report site health, production errors and open issues to stakeholders. I asked for that rotation. I’m on the on-call roster, and I contributed to the working agreement that governs it — what constitutes a page, what waits until morning, what a responder owes the next shift — which went from draft to org-wide adoption inside a quarter.
Most of my influence on this codebase is not my own commits. I review more pull requests than I author — 208 against 134 — across six repositories including ones I don’t own, and I’m one of the people who integrates other engineers’ work into the platform. When product download links started intermittently 404ing, I ran the investigation: quantified the blast radius from logs at roughly three thousand affected users, traced it to a build artifact that never landed in a gated storage bucket, and coordinated the fix with release engineering. I led a cross-team discovery comparing observability platforms for properties moving onto the new architecture, engaging three partner teams to set the organization’s forward monitoring approach. And when a new engineer joined and hit the wall our Drupal setup puts in front of everyone, I helped turn that friction into reusable onboarding documentation — the kind of small enablement work that saves the next person a week of spelunking.
Stack
Migrated portions of moz.com from CakePHP to Craft CMS, partnered with the UX team turning design comps into marketing pages, and worked with business intelligence to implement page-load and event tracking through Adobe DTM and Segment — the start of the analytics-engineering thread that runs through everything since.
Stack
Seven years building, inheriting and migrating WordPress and Drupal platforms for public-sector and university clients, owning the relationship end to end from requirements through delivery.
I mentored the interns, owned the client relationship end to end, and handled the parts of a small agency nobody lists on a résumé — scoping, invoicing and client service included.
Seven years at a small agency means wearing every hat, and the engineering was only part of it. I mentored interns through their first real client work — code review, and the harder lesson that a deadline someone is paying for is different from a deadline in a classroom. I scoped and estimated engagements, handled invoicing, and was the person clients actually called when something broke.
That is where I learned to translate between what a client asks for and what they need built — the same skill I use now taking requirements from marketing stakeholders who don’t think in tickets.
Inherited and migrated the University of Hawai’i law school platform, acted as contract developer and consultant for King County’s 4Culture across themes, CI/CD and infrastructure, and built the SSNOCWTA site from scratch to WCAG compliance.
For the University of Hawai’i’s William S. Richardson School of Law I inherited and maintained a Drupal platform — course database, personnel directory, events calendar, student classifieds, job listings, and a portal gated to @hawaii.edu accounts — then led the data migration when the site moved onto WordPress. For King County’s 4Culture I was effectively the contract web developer and consultant: theme and template development, the deployment pipeline and CI/CD, infrastructure and Docker-based local orchestration for the team, a Foundation-to-Bootstrap 5 migration, custom plugin work, and an accessibility and SEO overhaul under county compliance deadlines — screen-reader and keyboard-navigation testing alongside the design and content teams, plus custom Drupal hooks that automated meta-tag population and schema-markup injection. I built the South Seminole & North Orange County Wastewater Transmission Authority site from scratch to WCAG accessibility compliance.
I also introduced automated build and test pipelines to client projects years before it became my specialty, and did enough schema export and transformation work that platform migration became a through-line rather than a one-off.
Stack
2008
BA, Business Administration
2005
HND, Civil Engineering
Most of my work is requested by people who don't think in tickets. This is the one part of the job you can't credibly claim about yourself.
“As a marketer, I appreciated his communication style the most as well as his speediness. My job was to request new landing pages and updates to our marketing pages… I really appreciated that. I'd recommend Laud… to any dev team who can work well with marketers.”
The pricing selector on tableau.com — the tool that lets you configure product editions, licenses and add-ons and see what they cost. I extended the legacy version rather than replacing it, across its UI, its API design and its backend: multi-currency logic and cached exchange rates resolved server-side rather than in the browser, payload contracts negotiated with the frontend team, accessibility and responsive work, analytics instrumentation, and end-to-end Cypress coverage. It is public, so you can go and click it.
Stack
These three are one story, in order. The wall is the interesting part — everything I build now runs on what came out of it, including the work I do at my day job.
A production, invite-only AI agent that answers questions about my background from approved sources only, never guessing — administered entirely in-app, down to swapping the LLM provider without a redeploy.
A production, invite-only AI agent that gives approved visitors — recruiters, colleagues — a conversational way to ask about my background. It answers from approved sources only and doesn’t guess, adapts its tone and focus per invite, and is administered entirely in-app: content, modes and even the LLM provider are configurable without a redeploy. Every AI call routes through a provider-agnostic abstraction layer, so swapping providers doesn’t touch business logic. Two-role JWT auth keeps visitor and admin strictly separate. I wrote the product requirements and architecture documents before I wrote any code.
It’s also what broke. Building it across dozens of sessions with AI coding agents, each session surfaced a new failure mode — agents forgetting decisions, drifting from the project’s conventions, leaving no audit trail of why anything was done.
Stack
So I generalized the fix. An open-source framework giving AI coding agents persistent structured memory, enforced workflows and a git-hook layer — MIT licensed, 300+ commits, piloted on a real production platform.
So I generalized the fix. The Rig is an open-source framework that gives AI coding agents persistent structured memory, enforced workflows, a task lifecycle engine, and a git-hook layer that won’t let a commit through without secret scanning and a properly formatted conventional message. Nine lifecycle hooks cover protected-path write restrictions, commit gating, context-compaction checkpointing and subagent context injection. MIT licensed, 300+ commits, with a bats test suite running in CI. I piloted it on 4Culture.org — a real multi-contributor production platform — rather than only on my own machine.
Stack
And then I used it. A production e-commerce platform in Ghana that I designed, built and maintain — and it runs on The Rig. WhatsApp deep-link ordering, Mobile Money, dispatch-rider tracking; 540+ commits over a year.
And then I used it. Beacon Essentials is a production e-commerce platform in Ghana that I designed, built and maintain — and it runs on The Rig. The interesting constraint was never technical: checkout had to work the way that market actually buys, which meant WhatsApp deep-link ordering with a conventional cart as fallback, Mobile Money as the primary payment rail, and order tracking built around dispatch-rider delivery. FastAPI and MongoDB on the back, Next.js on the front, a mobile workspace alongside them, all in one Turborepo monorepo; pre-signed S3 media so the API never serves binaries; Docker and GitHub Actions to deploy, with linting, tests and secret scanning enforced on every commit. 540+ commits and 450+ pull requests over a year.
That last part is the real test of The Rig — it’s the framework running against software that takes money, not a framework with a README.
Stack
Every engineer is quietly being asked the same question in 2026: is the person good, or is the tooling good? Here is 2019, when there was no tooling.
Built solo and by hand in 2019–2021, before AI coding assistance existed. Laravel and MySQL: 38 models, 62 controllers and 359 views over a diocese → circuit → branch hierarchy, with deployment automation I wrote myself.
Built solo and by hand in 2019–2021, before AI coding assistance existed. Laravel and MySQL: 38 Eloquent models, 62 controllers and 359 Blade views over a three-level organizational hierarchy of diocese → circuit → branch. Barcode-based attendance check-in, a messaging subsystem with threads and drafts, Algolia-backed search, SMS through Hubtel — a Ghanaian gateway — push notifications, bulk Excel and CSV import/export through a staging table, and a full store with cart and checkout. I wrote its deployment automation by hand too: a shell script doing a git clone and an atomic directory swap while preserving uploads across releases, with companion database backup crons. Years before I had CI/CD tooling to do it for me.
Choosing Hubtel in 2019 and Mobile Money in 2025 is the same instinct six years apart — build for how that market actually transacts, not how the textbook says.
Every architectural decision in it is one I made and still live with. It’s here to answer the question every engineer is quietly being asked in 2026: is the person good, or is the tooling good?
Stack
A legacy Laravel + Vue collision-data explorer that I containerized and modernized — I did not write the application, I made it deployable.
Docker Compose orchestrating the Laravel API, the Vue frontend and MySQL over an internal bridge network, with cross-service networking and environment configuration; GitHub Actions building the images; nginx on the host handling SSL termination with Certbot auto-renewal; and the local workflow documented so the next contributor can bring the whole stack up with one command.
It is the least glamorous kind of work and the kind most often needed: an application that ran on one person’s machine now runs reproducibly for anyone.
Stack
Occasional notes on the systems I work on.

I built a production app almost entirely with AI coding agents. The code was fine. The process fell apart in ways I didn't expect, and fixing it turned into a second project.
Read more →
Building an e-commerce platform for Ghana taught me that the standard cart-and-card checkout is not a neutral default. It is a bet about how people pay, and it does not travel.
Read more →
Modernizing a Laravel and Vue app I did not write. The technical work was routine. Working inside decisions I disagreed with, without rewriting them, was the actual skill.
Read more →From a Ghanaian internship to Salesforce — the people, detours and lessons that shaped a decade in web development.
Read more →Contact
Have a project in mind, want to argue about deployment pipelines, or just want to say hello? Send a message below — it reaches me, not a queue.