Skip to content
DBAI

DBAI case study · internal systems

From WordPress to an agent-operated build.

This site replaced a WordPress site. Before the first new page was designed, the old one was crawled and classified, and a private Command Center was built to route the work, hold the evidence and refuse to let a builder approve its own output.

What follows is the record, with the numbers as they were measured rather than as they would read best.

URLs crawled and classified

88

URLs crawled and classified

digitalboutique.ai, 2026-08-27

agent roles, nine of them staffed

12

agent roles, nine of them staffed

records in the build system; nine have a definition file

routes at launch

20

routes at launch

all returning 200, one h1 each

dead internal links

0

dead internal links

final QA, in either direction

The starting point

Start with the system, not the redesign.

The goal was never to convert a theme. The existing site was treated as source material: every page, offer, funnel, factual claim, form and article had to be understood before anything replaced it.

digitalboutique.ai runs on WordPress with eight plugins — Elementor and Elementor Pro for layout, Fluent Forms for capture, WooCommerce and WooCommerce Payments for the shop, a security plugin, a media organiser and Google Site Kit. It is a working site. It is also a stack where the page, the form and the checkout each belong to a different vendor.

The audit was read-only. No form was submitted, no destination was touched, and the sister domain was left alone.

digitalboutique.ai

The previous WordPress homepage hero: a wordmark, a headline reading “AI agents that do the work”, a two-line subheading, and two call-to-action buttons.
digitalboutique.ai — the previous operating state, captured 30 August 2026.

dbai.agency

The replacement homepage hero on a dark ground: a mono eyebrow, a three-line headline reading “Build the AI operating layer for your business”, a four-line subheading, and two call-to-action buttons.
dbai.agency — the same region of the page, captured at the same width.

The audit

88 URLs before one new page.

A public crawl — sitemap, robots and internal-link traversal — using 99 of the 800 requests it was allowed. Every URL it found was classified before any of them was replaced.

What the crawl found

URLs discovered
88
returned 200
84
returned 404
4
meaningful pagesstatus 200, excluding archives and media
68

How every one was classified

KEEP
33
REMOVEincluding 16 taxonomy archives and 11 placeholder pages
31
REWRITE
18
REDIRECT
4
MERGE
2

The five classifications sum to 88, not to 68: every discovered URL was classified, including the four that answered 404. The 68 is a second reading of the same crawl — the pages that carried meaning. Presenting these as one funnel would be tidier and wrong.

The crawl also produced a content truth matrix. It recorded eight claims the old site contradicted itself on, and six more that could not be verified from any source available. Those claims are not repeated here, and they are not on this site: the same list is compiled into the build, and a page that tries to publish one of them fails to build.

The operating layer

Before we rebuilt the site, we built the system that would rebuild it.

Claude Code did the work. The Command Center — a private Next.js application on Neon Postgres — held the state: phases, page status, agents, sessions, tasks, deliverables, design decisions, reviews, QA, SEO, commits, deployments, blockers and launch readiness.

A coding session ends and takes its context with it. The build needed something that did not: a place where a task's history survived the session that produced it, and where a claim could be checked against a record rather than remembered.

It is a separate repository from the site, on a separate host, behind authentication. The public site has no dependency on it — no shared database, no admin surface, nothing that would put a control plane inside a marketing page.

What it held

  • Project phases
  • Page status through ten stages
  • Specialist agents and their sessions
  • Tasks and deliverables
  • Design decisions
  • Blockers
  • QA runs
  • Security checks
  • SEO and redirect mapping
  • Token usage
  • Commits

The ten stages a page moves through

  1. AUDIT
  2. STRATEGY
  3. COPY
  4. WIREFRAME
  5. DESIGN
  6. BUILD
  7. RESPONSIVE
  8. QA
  9. SEO
  10. APPROVAL

Ninety-two pages sit in that matrix, most of them old-site URLs carried in by the audit and never built. Thirteen are approved. The dashboard reports that as thirteen of ninety-two rather than as a percentage of the pages that shipped, which is the less flattering of the two true numbers.

build.dbai.agency · activity

The build system's event feed filtered to page.stage_changed, showing timestamped stage transitions for named pages — COPY to DONE, BUILD to DONE, APPROVAL to DONE.
The event stream, filtered to stage changes. Every page's passage through the ten stages is a recorded event with a timestamp.

The team

Twelve roles. Nine that could run.

The build system holds twelve agent records. Nine of them have an executable definition — a scope, a set of tools and a rule about what that agent may not do — identical in both repositories. The other three are the gap between the org chart and the org.

  1. 01

    Orchestrator

    Sequences the work, verifies plan claims before dispatch, rules on conflicts, keeps the ledger. Writes no production code.

  2. 02

    Content migration

    Sources copy from the audited material and checks every claim against the truth matrix. Raises blockers rather than inventing replacements.

  3. 03

    Brand director

    Resolves genuine design-system gaps. Never creates new visual directions.

  4. 04

    Frontend architect

    Owns shared primitives and site-wide architecture. Invoked only when a page cannot be built from what exists.

  5. 05

    Page builder

    Builds one page or a tightly-related group. Implements, self-tests, reports — never approves its own work.

  6. 06

    Code reviewer

    Reviews a diff it did not write, against requirements it receives separately.

  7. 07

    QA and performance

    Runs the suite and exercises the page in a real browser at five widths. Reports results exactly as they occurred.

  8. 08

    Visual reviewer

    Judges design-system compliance, hierarchy, spacing and motion — in a browser, at real widths.

  9. 09

    SEO migration

    Checks metadata, canonical, structured data, internal links and redirect mapping.

Three of the twelve never got a definition file. Site Auditor and UX / Conversion were seeded into the roster in the first phase and the work went to prompts and scripts instead; the security agent is a scheduled job rather than something that takes a task. A roster is a plan, and this one records where the plan and the build diverged rather than quietly matching them up afterwards.

Site Auditor
The audit ran as a phase, from its own prompt and its own scripts.
UX / Conversion
Information architecture and conversion paths, absorbed into the brand and page-builder roles.
Security agent
A scheduled check rather than an agent that claims work.

The review system

The builder could not approve its own work.

Every page moved through the same sequence, and no stage could be skipped by the agent that would benefit from skipping it.

  1. 01

    Build

    A page builder implements against a written requirement, self-tests, and reports what it did.

  2. 02

    Code review

    A reviewer that did not write the diff receives the requirements separately and returns a spec verdict and a quality verdict.

  3. 03

    Fix

    Findings go back to the builder. The reviewer re-reviews; it does not fix.

  4. 04

    QA

    The suite, plus a real browser at 1440, 1280, 1024, 820, 390 and 320.

  5. 05

    Visual review

    Design-system compliance, hierarchy, typography, spacing and motion behaviour, judged on screen.

  6. 06

    SEO review

    Metadata, canonical, structured data, internal links, redirect mapping.

  7. 07

    Approval

    Only then does the orchestrator mark the work done.

Builder and reviewer are different agents with different definitions, and the reviewer is given the requirements rather than the builder's account of them. That distinction is the whole mechanism: a reviewer reading the builder's summary is reviewing the summary.

None of this is a record type. The build system holds no review object, no verdict field and no findings table, and a page claiming otherwise would be describing a screen that does not exist. What holds the line is narrower and duller: two agent definitions that say an independent gate never reviews its own work, and a run ledger where a gate can return FAIL against work already written.

One pair of rows is the whole argument. At 11:40:11 the links gate returned FAIL against a build that was already finished — forty untracked conversion anchors, found by crawling the built site rather than by any test. At 11:40:12 it returned PASS on the fix. A gate that cannot return FAIL is decoration; this one did, one second before it did not.

build.dbai.agency · qa run history

Five rows of the build system's QA run ledger. Two adjacent rows one second apart read: 11:40:11, links, FAIL, “CTA audit found 40 untracked conversion…”, and 11:40:12, links, PASS, “After fix: FooterEntry routes through Cta…”.
The run ledger, 29 August. An independent gate returning FAIL against finished work at 11:40:11, and PASS on the fix one second later.

What the system caught

The interesting part is what failed.

A quality system is only worth describing if you say what it found. These are documented, and two of them are defects in the quality system itself.

  1. 01

    Forty untracked conversion anchors

    The analytics guard walked every anchor inside <main>. The footer sits outside <main>, names the contact page twice, and renders on all twenty routes.

    Two anchors × twenty routes. On several pages the footer carries the only Discovery Call link there is, so those clicks were reaching the form and reporting nothing.

    A guard written expressly to stop “we only checked one region” was itself scoped to one region. It was found by crawling and counting, not by a test.

  2. 02

    The conversion button failed contrast — in the approved design system

    The primary button measured 3.52:1 at rest and 2.37:1 on hover against a 4.5:1 requirement. The hover state was worse than the rest state.

    It was not a defect in a new page. It was in the design system every page had already been built from, and it was on the site's only conversion control.

    Approval is not verification. It now measures 5.35:1 and 4.71:1, recomputed independently three times.

  3. 03

    A test that could not fail

    The contrast suite computed hover ratios from the CSS custom properties rather than from what the browser painted.

    Restoring the old hover fill would have left every token correct, every test green, and shipped a 2.37:1 button.

    A green test can still be the wrong test. It now reads rendered output.

  4. 04

    The skip link that never moved focus

    Activating “skip to content” scrolled the page, but the next Tab returned to the header navigation, because the main landmark was not focusable.

    It affected every page, had been there since the foundation commit, and had passed a foundation review and three QA gates.

    Three gates checked that the link existed. None had checked what it did.

  5. 05

    A record that described a fix as already done

    A ruling was written after the work it governed had been built, and entered the Command Center in the past tense. The links it required to be removed were still live — on the contact page.

    Anything reading the record would have reported the work complete. The QA gate tested the page instead, and found the contradiction.

    A tracker that states an intention in the past tense is the exact failure this project exists to prevent. The dashboard records reality; it cannot stand in for checking it.

  6. 06

    Review packets that were quietly incomplete

    Three times, the file list handed to a reviewer was short — a module missed by a filter, a new test file, a change outside the given paths.

    Each was caught because the reviewer noticed the builder's report described a file the diff did not contain.

    The review system catching a defect in the review system. The packet is now derived from the repository state rather than assembled by hand.

The transformation

Eight plugins, then six dependencies.

The replacement is deliberately small. Everything the old stack delegated to a plugin is either code in this repository or absent by decision.

Before · WordPress

  • Elementor
  • Elementor Pro
  • Fluent Forms
  • WooCommerce
  • WooCommerce Payments
  • All-in-One Security and Firewall
  • WP Media Folder
  • Google Site Kit

8 plugins

After · Next.js on Vercel

  • Next.js App Router and React
  • TypeScript throughout
  • Tailwind and one design system
  • Zod-validated forms, server-side
  • A typed analytics layer
  • Statically rendered routes

6 layers, one repository

Six runtime dependencies at launch; nine today, the three additions belonging to a chat feature that is built and switched off. The comparison is fair only because both sides are counted the same way: things the running site loads that somebody else maintains.

One finding stands for the difference. On the old site, not a single form field on any page carried a required attribute — while the contact form marked eight of its eleven fields with a red asterisk. It displayed requirements it did not enforce. The replacement validates on the server, and reports success on exactly one path: a valid submission that a configured destination accepted.

Before

The previous contact form: eleven fields, eight of them marked with a red asterisk indicating that they are required.
Eleven fields, eight marked required with a red asterisk. Not one field on the old site — on any page — carried a required attribute in the markup.

After

The replacement contact form: five fields, each with a short note explaining why it is asked for, and a privacy-policy link directly beneath the submit button.
Five fields, each explaining why it is asked for, and the privacy policy linked inside the form rather than only in the footer.

Launch architecture

Two paths off the page, both of them checked.

The site is statically rendered. Only two things happen at request time, and each was verified end to end before launch.

Contact

  1. Contact form
  2. Server validation
  3. Authenticated webhook
  4. Mail notification
  5. Truthful success or failure

The delivery adapter returns success on one path only — a configured destination answering 2xx. Everything else, including an unconfigured destination, is a failure the visitor sees. A form that swallows leads while showing a thank-you is the worst outcome available on that page.

Analytics

  1. Page or CTA
  2. Typed event layer
  3. Vercel Analytics
  4. Speed Insights

Every event is a name in a closed union with an enumerated payload. There is no free-text field in any of them, so a visitor's own words cannot reach an analytics payload by accident — and a test asserts that no future field can be named in a way that would allow it.

Delivery was not assumed. The workflow platform reports success for runs that delivered nothing, so the launch gate was a message id returned by the mail provider with the message in the inbox. Never the status field.

The result

What launched, and what it measured.

Every figure below carries the scope it was measured at.

routes live

20

routes live

each returning 200 with exactly one h1

routes deliberately not shipped

5

routes deliberately not shipped

returning 404, linked from nowhere

dead internal links

0

dead internal links

whole document, all 20 routes, both directions

unwired conversion anchors

0

unwired conversion anchors

after the footer finding was fixed

tests against live production

48/48

tests against live production

16 tests × Chromium, WebKit, Firefox

Lighthouse accessibility

100

Lighthouse accessibility

five sampled production pages, zero failed audits

Lighthouse performance

98–99

Lighthouse performance

same five pages, 2026-08-29

largest contentful paint

2.0–2.4s

largest contentful paint

same five pages

The suite is dated because it moves. At launch it was 217 unit tests and 459 browser tests; the current build runs 309 and 476. A pre-launch figure presented as a final one is an interim wearing an outcome's clothes.

The SEO score rose from 66 to 100 with no code change. The single deduction was the crawl block that had been holding the site out of the index on purpose, and it cleared itself on the redeploy that lifted it. Nothing was tuned to chase a score.

Scope

Not everything that can ship should ship.

Decisions taken deliberately, and recorded so they could be argued with.

  • The old site was left running. No forced migration, no redirect cutover.
  • Four sections were deferred rather than half-built. Their routes return 404 and nothing links to them.
  • A client testimonial — the strongest quote in the entire audited source — was not used, because permission for it was never recorded.
  • A team member's job title was omitted, because the audited source gave two contradictory ones and choosing between them was not the build's decision to make.
  • Headline figures with no verifiable source were left out rather than replaced with plausible ones. Several sections that would normally carry a metric carry none.

Sequence

Four dates.

Dates, not durations. Version control does not reach the start of the project, so nothing here claims an elapsed time.

  1. Audit complete

    88 URLs crawled, 68 meaningful pages classified, the content truth matrix written.

  2. Direction approved

    Four homepage directions evaluated; the fourth approved and promoted to the benchmark. Both repositories begin.

  3. Launch

    The crawl block lifted, the site redeployed, indexing enabled, every launch gate passed.

  4. After

    Post-launch work continues under the same review system that produced the launch.

Why this is the case study

The site is the argument.

Every part of this is something DBAI builds for other people: an orchestration layer over specialist agents, a custom application holding the state, automated checks that gate the work, and a human approving the result.

The difference is that here the work product is public and the record is ours to show. The claims on this page can be checked against the site they describe.

Next

Build the operating layer behind your business.

If a website rebuild can be run this way, so can the work that actually costs your team its week — sales operations, support, internal knowledge, the handoffs between systems.