Delivery & Operations

Why regression prevention is part of the engineering, not just QA

Why regression prevention belongs in the engineering system itself, with repeatable checks that catch breakage before visual QA has to rediscover it.

A regression is a bug that comes back. The expensive part is not only fixing it twice. The expensive part is that the team learned something the first time and failed to preserve the lesson. We try to turn recurring lessons into architecture.

Some bugs should become shared component fixes

If every page uses the same navigation and the navigation has a mobile spacing bug, the fix belongs in the navigation system. Copying a local patch into six pages would solve the visible problem while preserving the structural cause. Reusable components are valuable partly because they give bugs one place to live and one place to die.

Some bugs should become build rules

If a content library once shipped a duplicate slug, that class of error can be checked automatically. If public routes need one H1, the generated HTML can be audited. If preview deployments must be nonindexable, the build can verify the relevant infrastructure exists.

If internal links should point only to rendered routes, the output audit can compare anchors against the prerender manifest. This is how QA becomes cumulative.

Some bugs should become content-model constraints

If location pages repeatedly break because image references use inconsistent formats, put image resolution in the loader. If articles need a description, require the field. If categories drift into near-duplicates, normalize them at the content boundary. The content model is a good place to prevent invalid states before components have to cope with them.

Some bugs should become responsive rules

One of our builds had mobile reveal behavior that became unstable while browser chrome resized the viewport. The long-term fix was not "remember to test that animation every time." The stylesheet makes touch-first devices skip the reveal and render the final visible state.

The system remembers the lesson.

Some problems should remain human review

Not every regression is machine-detectable. A page can pass every build check and still have awkward copy wrapping, weak hierarchy, an ugly crop, or a conversion path that feels confusing. Visual review and judgment still matter. The goal is not to automate humans out of QA.

The goal is to stop spending human attention on failures a machine can catch reliably.

Why our audits inspect generated output

Source code can look correct while the artifact is wrong. Metadata can be overridden by a parent layout. A route can fail to prerender. A schema object can serialize incorrectly. A CSS change can reference a missing asset. Inspecting the production build catches the result of the system, not only the intention.

That is why the connectrader site has a post-build SEO audit that reads generated HTML. It checks document language, viewport metadata, heading order, H1 count, main landmarks, titles, descriptions, canonicals, robots state, Open Graph fields, Twitter fields, image alt attributes, JSON-LD, internal links, source image references, robots.txt, and sitemap dates.

That is broader than a typical "SEO script" because technical quality crosses categories.

The cost of a stricter build

More validation means more ways a build can fail. That can be annoying. A strict system can also become brittle if the checks are based on implementation details rather than outcomes. We try to make checks answer meaningful questions. "Does the generated public page have exactly one H1?" is meaningful.

"Does this line of source code contain an exact string because that is how we happened to write it last year?" may not be. Validation needs maintenance too.

Why we like failures that explain themselves

A useful build failure should identify the route or file and the violated rule. A message such as: /docs/example: missing or incorrect canonical URL is actionable. A generic build failure is not. Good validation should shorten debugging, not create another debugging project.

Regression prevention changes how fast we can move

The safer the floor, the more confidently we can change the ceiling. A site with no automated protections makes every large edit risky because nobody knows which invisible assumptions may break. A site with route generation, content models, metadata helpers, preview controls, and post-build audits gives us more confidence that common failures will surface before release.

That does not eliminate risk. It converts some risk into deterministic checks.

The long-term goal

A mature codebase should contain evidence of what the team has learned. Sometimes that evidence is a component abstraction. Sometimes it is a CSS fallback. Sometimes it is an audit script. Sometimes it is a content schema. We do not want the same bug to remain possible in exactly the same way forever.

Fixing the page is the first job. Making the failure harder to repeat is the engineering job.

From explanation to proof

Where this connects to the work

This category documents the work that keeps a custom site maintainable after launch and makes handoff possible without technical hostage-taking.