Skip to content
Centriu
Centriu Loop

Release Gate Automation: A Green Build That Never Actually Asked the Database

Centriu Loop built a dedicated release gate specifically in response to a real production incident where new application code, calling a database function with an updated parameter list, was deployed while the live database still had an older, mismatched version of that same function — because the migration meant to update it had not actually been applied yet. The gate runs at the correct point in the deploy sequence: after a release candidate already exists, and before traffic is actually switched over to it. It parses the application's own source code directly to extract every database function call it makes, along with the exact set of parameter names each call supplies, and checks every one of those calls against the actual TARGET database two genuinely independent ways: first, by querying the database's own catalog directly (which correctly reflects default parameter values and legitimate function overloading); second, by probing the SAME endpoint an ordinary application request would use, authenticated as an anonymous caller, which reveals specifically whether the database's own request-routing layer has already picked up a recent change or is still relying on a stale, cached view of the schema. The gate's own verdict is deliberately the WORSE of those two independent results — a clean catalog check combined with an unreachable or stale live probe is not treated as a pass, because either signal alone missing the real problem is exactly the failure mode the gate exists to prevent. A genuinely unmeasurable result and a genuinely mismatched result each have their own distinct exit code, and both block the release outright, with no override available short of directly editing the gate's own script and committing that change under its own version control — there is no bypass flag.
Checks catalog AND live cache
Worst-of-two verdict, no bypass
Automated release verification checklist
A green build that never actually asked the database.

Checking the code is not the same as checking what the code is about to run against

A deploy pipeline can verify a great deal about a piece of code in complete isolation — that it compiles, that its types are internally consistent, that its own automated tests pass — without ever once asking the actual, live system the code is about to be pointed at whether it is genuinely ready to receive it. A release gate built specifically to close that gap has to do something categorically different from ordinary code-level checks: it has to reach out to the real target and ask it a direct, specific, falsifiable question — does this exact function, with this exact parameter list, actually exist on you, right now — rather than inferring an answer from anything the code alone can tell you.

How the underlying problem shows up before you fix it

A deploy pipeline's own automated checks (compilation, type-checking, unit and integration tests) can all pass cleanly while remaining entirely blind to whether the LIVE, external system the code depends on (here, a specific database function's own parameter contract) genuinely matches what the code expects.

A verification step that checks only ONE representation of a target's state (for instance, only the database's own internal catalog) can report success even when a DIFFERENT, equally real representation of that same state (the live request-routing layer's own cached view of the schema) has not yet caught up — the two can genuinely disagree for a real, measurable window of time.

A safety gate with an emergency bypass mechanism is, by construction, a gate that CAN be skipped under pressure — the moment a bypass exists, the gate's actual guarantee becomes conditional on nobody choosing to use it at the wrong moment.

A verification tool's own definition of "what does the current target look like" can itself be a hand-maintained, static list that silently stops reflecting reality the moment the real target changes shape — a check built to catch drift can itself quietly drift out of date.

A verification tool that requires specific environment configuration to actually reach and probe a live target produces a distinct, clearly-labeled "could not measure" result when that configuration is missing — which needs its own explicit documentation, or it will be mistaken for a real defect by whoever encounters it without that context.

How Centriu Loop built a gate that checks the database, not just the code

The gate Centriu Loop built runs `npm run release:gate` after a release candidate already exists and before traffic is switched over to it — deliberately positioned at the one point in the sequence where blocking a release actually prevents the specific incident it exists to catch. It parses the application's own source code with a real TypeScript parser (not a simple text search) to extract every call the code makes to a database function, along with the exact, complete set of parameter names each individual call supplies.

Each extracted call is then checked against the real target database in two genuinely independent ways. The first is a direct query against the database's own catalog — the authoritative source of which functions exist and what parameters they declare, correctly aware of default parameter values and legitimate function overloading. The second is a live probe issued through the exact same request path an ordinary application call would use, authenticated as an anonymous caller — deliberately included because the database's own request-routing layer keeps a separate, cached view of the schema that does not always update in perfect lockstep with the catalog itself; a function can be entirely present and correct in the catalog while the routing layer serving real traffic has not yet picked up the change.

The gate's own final verdict is deliberately the WORSE of these two independent results, never simply an average or a majority. A catalog check that looks perfectly clean, combined with a live probe that comes back unreachable or clearly stale, is NOT treated as a pass — because a scenario where the catalog is technically correct but the layer actually serving traffic has not caught up is exactly the kind of gap a single-signal check would miss entirely. An unmeasurable result and a genuinely mismatched result each produce their own distinct, documented exit code, and both block the release outright. There is deliberately no bypass flag: overriding the gate's verdict requires directly editing the gate's own script and committing that edit under ordinary version control — a deliberately heavier, fully traceable act, not a flag flipped in the moment under pressure.

The gate's own correctness was proven against the exact incident it was built to prevent: a dedicated harness assembles both the pre-fix and post-fix database states in a real PostgreSQL instance, replays the exact code artifact from the day of the incident against both, and confirms all four resulting combinations behave correctly — critically, the twelve-parameter application code paired with the sixteen-parameter database correctly fails, naming precisely the four parameters the mismatch involves, exactly reproducing and catching the original incident.

A related, second-order gap was closed separately, in an older, DIFFERENT verification script that had existed since before this incident: Loop's own app-versus-database contract-checking matrix, which confirms the application's expectations line up with each of several possible database states. That script's own definition of "the current, newest database state" had been a hand-maintained, hardcoded list of migration numbers — meaning the very next new migration added to the project would have gone completely unnoticed by it, with the script continuing to report a full, clean pass while silently checking against a target that was already out of date. It now reads the actual migrations directory directly at run time instead, so its own definition of "current" can never again fall behind reality without the check itself failing first.

What is actually built today

Centriu Loop's release gate extracts every database function call the application code makes, with its exact parameter list, using a real code parser rather than a text search.

Every extracted call is checked against the live target database two independent ways: directly through its own catalog, and through a live probe using the same request path and anonymous-caller identity an ordinary application call would use.

The gate's own verdict is always the WORSE of those two independent results — a clean catalog check cannot compensate for an unreachable or stale live probe, and vice versa.

There is no bypass flag for the gate's own verdict — overriding it requires directly editing and re-committing the gate's own script under ordinary version control.

A separate, older app-versus-database contract matrix now reads Loop's actual migrations directory at run time, rather than a hand-maintained list, so it can no longer silently fall behind the newest real migration without the check itself failing.

Asking two witnesses instead of trusting the first one to answer (illustrative framing of the actual confirmed mechanism)

Before this gate existed, a deploy could rely entirely on the database's own catalog — a technically correct, but incomplete, witness — and miss that the layer actually serving live traffic had not yet caught up to match it. After the fix, the gate asks two independent witnesses every time, and if either one gives an unfavorable or unreachable answer, the release is blocked — exactly the design that would have caught the specific incident this gate was built in direct response to.

What changes operationally

Centriu Loop's release process now runs a dedicated gate, positioned after a candidate exists and before traffic switches over, that checks every database function call the application makes against the live target two independent ways and blocks release on the worse of the two results, with no bypass short of a fully version-controlled edit — closing the exact class of gap that caused a real, roughly three-hour production incident, and hardening a separate, older contract-checking script that had its own risk of silently aging out of date.

When this is not the right fit

This automation covers specifically Centriu Loop's own release-time gate checking the application-to-database RPC contract. It is a distinct mechanism from this pillar's separate wave 71 page on Loop's deploy-time SQL-safety text scanner, which catches dangerous SQL commands inside migration files themselves before they run — a different check, at a different stage of the deploy pipeline, for a different class of risk entirely.

One verification signal vs. two independent signals resolved to the worse result

Checking a target's own catalog alone is simpler to build and correctly answers most of the question most of the time — the catalog genuinely is the authoritative record of what a database contains. It is not, by itself, a complete picture of what is actually SERVING live traffic at a given instant, because a request-routing layer's own cached view of the schema can lag the catalog by a real, measurable window. Checking both independently, and deliberately keeping whichever answer is worse rather than averaging or trusting either one alone, is the only version of the two that catches the specific, real gap between "the database technically has this" and "the database is currently serving this to real requests" — which is precisely the gap that caused the incident this gate exists to prevent.

Related systems

Main system: Centriu Loop.

What it does NOT do

  • Does not replace or overlap with Centriu Loop's separate deploy-time SQL-safety text scanner (covered on a companion page) — that scanner catches dangerous COMMANDS inside migration text before it runs; this gate checks the application code's own function CALLS against the live target after a candidate already exists.
  • Does not provide any bypass flag or override short of directly editing and re-committing the gate's own script — a deliberate design choice ensuring an override is always a fully traceable, version-controlled act, never a flag flipped under pressure.
  • Does not treat a technically-correct-but-unreachable check as a pass — an unmeasurable result from either of its two independent checks blocks the release exactly as a genuine mismatch would, with its own distinct, documented exit code.
  • Does not retroactively verify any release that shipped before this gate existed — it applies to every release going forward from the point it was introduced.
  • Does not extend this same dual-verification pattern to any other module in Centriu's other systems — this gate is specific to Loop's own release process, built in direct response to a real incident there.

Security and governance

Centriu Loop's release gate checks every database function call the application code makes against the live target database two independent ways, taking the worse of the two verdicts, with no bypass short of a fully version-controlled script edit — closing the exact gap behind a real, roughly three-hour production incident. Full detail on release and change-control practices lives at /governanca and /iso.

Pricing and contracting

Available by monthly subscription, with tiered plans. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).

Frequently asked questions

What exactly triggers this gate to block a release?

Either of its two independent checks — a direct database-catalog query, or a live probe through the same path and identity an ordinary application call would use — coming back unfavorable or unreachable. The gate takes the worse of the two results, never the better one.

Is there a way to override the gate in an emergency?

No dedicated bypass flag exists. Overriding the gate's verdict requires directly editing the gate's own script and committing that change under ordinary version control — a deliberately heavier, fully traceable act rather than something flipped in the moment.

How was the gate itself proven to actually catch the incident it was built for?

A dedicated test harness assembles both the pre-fix and post-fix database states in a real PostgreSQL instance, replays the exact application code from the day of the incident against both, and confirms the mismatched combination is correctly caught and rejected, naming the specific parameters involved.

Is this the same finding as the deploy-guard page on this site?

No — that page (wave 71) covers a text scanner catching dangerous SQL commands inside migration files before they run. This page covers a release-time gate checking the live application-to-database function contract itself, a different check at a different stage.

What happens if the gate cannot reach the live database at all — for instance, in a clean local environment missing configuration?

It returns a distinct, clearly labeled "unavailable" result with its own exit code, correctly treated as a block rather than a pass — this is documented as expected behavior, not a defect, since the gate genuinely could not measure anything in that state.

What does Centriu Loop cost?

It is sold by subscription with a published starting price — exact current values are on the central pricing page.

See how Centriu Loop checks the database itself before every release

Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.

Sources

  1. Centriu Loop — public product page — Centriu, 2026-07-20 · link(primária)
  2. Centriu Loop — public factsheet (API, JSON) — Centriu, 2026-07-21 · link
  3. Law No. 13,709/2018 — Brazil’s General Data Protection Law (LGPD) — Presidência da República (Brazil), 2018-08-14 · link

Last material update on .

By · AI-assisted production, with human review