Internal Support-Panel Tax-Data Firewall Automation: Three Layers, Because the First Two Will Eventually Fail

A single filter is a single point of failure, no matter how well it's built
Building one careful, well-tested filter that removes sensitive fields before data reaches an internal tool is genuinely good engineering — but it concentrates all of the protection in exactly one place, and any single place can fail: a new field gets added somewhere the filter doesn't know about, a different code path assembles a response without going through the filter at all, or the filter itself has a bug nobody has found yet. A system that depends on one mechanism being perfect forever is making a much larger bet than a system that assumes any one mechanism will eventually have a gap, and builds a genuinely independent second and third check specifically for that moment.
How the underlying problem shows up before you fix it
A sensitive-data filter is implemented as a blocklist — a list of the specific fields to remove — which protects exactly the fields someone remembered to name and silently fails to protect a new or renamed field nobody added to the list.
Only one mechanism stands between a data source containing sensitive content and an internal tool meant to operate on non-sensitive metadata about it, with no independent, second check applied to the actual outgoing response.
A response-construction code path exists that could, in principle, assemble data from multiple sources before any filtering step is applied — meaning a future change could introduce sensitive content without touching the filter's own code at all.
When a filtering or validation step does detect something wrong, the typical response is to remove or mask the offending piece and send the rest, rather than treating the detection itself as a signal that something upstream needs to be fixed.
The database tables an internal or administrative tool queries are technically capable of storing the same sensitive content the tool is supposed to never see — meaning a query bug or a future schema change could expose it structurally, independent of any application-level filtering.
How Centriu Gauge built a boundary designed to survive its own future mistakes
The backend function serving Centriu's internal operations panel for the Income Tax module states its own design philosophy directly in its header comment, and it's worth repeating close to verbatim because the reasoning is the point: this function exists specifically so Centriu can operate the product — licenses, cost, failures, quality, versions, incidents — without reading anyone's income tax information, and it does this with three boundary layers, stated explicitly as all three needing to exist.
The first layer is structural, not a rule at all: the specific database tables this function is permitted to query simply have no column with the capacity to hold tax content — a deliberate schema decision from an earlier migration, not a runtime check that could be bypassed or forgotten. The second layer is an allowlist, implemented as a single exported list of every field name the panel is permitted to display, applied recursively to a response object at any nesting depth. The choice to build this as a positive list rather than a list of fields to remove is deliberate and explained directly in the code's own comment: a list of fields to STRIP protects exactly the fields someone remembered to write down and fails silently on a fourth, forgotten one; a list of fields ALLOWED to pass through fails toward safety instead — a new field added to some underlying table tomorrow simply doesn't appear on the panel until someone deliberately authorizes it, rather than appearing by default until someone notices and removes it.
The third layer is where the design becomes genuinely distinctive: after the allowlist has already run, a separate, independent function serializes the resulting response to its final JSON text and scans that finished text directly — checking for the literal presence of specific banned field names (things like a question's content, an answer, a document's stored path, a taxpayer's income figures, or a document identifier) and separately for text matching the shape of a Brazilian CPF or CNPJ number in any common formatting. If either check finds something, the ENTIRE response is refused outright, with a specific, named reason, rather than the offending piece being quietly stripped and the rest sent through. The code's own comment states the reasoning for that specific choice directly: a response that reaches this point still containing tax content indicates something read from the wrong table or assembled data outside the intended path, and the correct reaction to discovering that is to fix the underlying cause, not to clean up the symptom and let the response ship anyway.
What makes this a genuinely enforced guarantee rather than a described intention is architectural: every single code path in this backend function that returns a response to the panel funnels through one shared function, and that shared function is the only place the allowlist and the output-verification layer are invoked. There is no second, alternate way to construct a response from this endpoint that skips either layer — confirmed directly against the current source, where this remains true today.
What is actually built today
A structural layer where the database tables the internal panel's backend function queries have no column capable of storing tax content at all, independent of any application-level check.
A positive, explicitly declared allowlist of every field name the panel may display, applied recursively at any nesting depth — a field not on the list simply does not appear, by default.
An independent output-verification function that scans the finished, serialized JSON response for banned field names and for CPF/CNPJ-shaped patterns, refusing to send the entire response if either check finds a match.
A single, shared response function that every code path in the backend funnels through — confirmed to be the only place either the allowlist or the output verification runs, with no alternate path around them.
A distinct field explicitly encoding "cost not yet estimable" as different from "zero cost," so the panel can honestly distinguish the two rather than treating an empty pricing table as proof nothing was spent.
Confirmed today via direct inspection: this three-layer structure remains intact and unmodified in the current source.
A bad response, refused rather than cleaned (illustrative scenario, not a real client)
A future code change to this backend function accidentally joins in a field from a table it wasn't meant to touch, and that field happens to carry a taxpayer's stored document identifier. Before reaching the panel, the allowlist alone would already exclude a field with that name if it isn't on the approved list — but if it somehow arrived under a permitted-sounding name, the output-verification layer's pattern check would still catch the CPF-shaped or document-shaped content in the finished response and refuse to send it, rather than quietly delivering a mostly-clean response with a sensitive fragment still inside.
What changes operationally
Centriu's own operations team can manage the Income Tax module's licenses, investigate failures, and review costs and quality entirely through this panel, with a structural, an allowlist, and an output-verification guarantee — not just one filter — standing between that work and any individual's actual tax content. A mistake that gets past any one layer still has two more chances to be caught before a response ever leaves the function.
When this is not the right fit
This mechanism protects what Centriu's own internal panel can see and display — it says nothing about a different organization's own internal access controls for its own staff using the Income Tax module's customer-facing features, which are governed by a separate set of controls. It is also specifically an internal operations boundary, not a general-purpose data-loss-prevention product feature offered to Centriu's own clients.
A filter that strips vs. a boundary that refuses
A single filtering step that removes known-sensitive fields and forwards the rest is a reasonable first layer, but it treats every gap it might have as invisible until someone happens to notice. Centriu Gauge's design adds a genuinely independent second opinion specifically for the moment the first layer has a gap — one that refuses the entire response outright rather than trying to salvage and ship it, on the stated reasoning that a bad response reaching that point is evidence of an upstream mistake that needs fixing, not a symptom to mask.
Related systems
Main system: Centriu Gauge.
What it does NOT do
- Does not rely on a single filtering step as the only boundary between the internal panel and tax content — a structural, an allowlist, and an independent output-verification layer all exist, and each is required.
- Does not use a blocklist of fields to strip as its allowlist mechanism — it uses a positive list of fields explicitly permitted to pass through, so an unlisted field is invisible by default rather than exposed by default.
- Does not strip a detected sensitive field from a response and send the remainder — a failed output-verification check refuses the entire response outright.
- Does not provide any code path from this backend function that bypasses either the allowlist or the output-verification layer — every response passes through the same single, shared function.
- Does not display an unmeasured cost as a definitive zero — a distinct field explicitly marks whether cost is currently estimable, so "not yet estimated" and "measured as zero" are never displayed as the same thing.
- Does not treat this internal-operations boundary as a customer-facing data-loss-prevention feature — it protects Centriu's own internal panel specifically.
Security and governance
The internal operations panel for the Income Tax module operates through database tables structurally incapable of storing tax content, a positive field allowlist, and an independent output scan that refuses any response containing a banned field name or a CPF/CNPJ-shaped pattern. Any personal or business data referenced remains subject to Brazil's LGPD (Law No. 13,709/2018). Full detail on access control lives at /governanca and /iso.
Pricing and contracting
Available by custom proposal, arranged directly with the team. Values and terms come from the official pricing table at /precos (Centriu's central source — never restated here).
Frequently asked questions
Why does the internal panel need three separate layers instead of one good filter?
Because any single mechanism can eventually have a gap — a new field, an unexpected code path, an undiscovered bug — and the three layers are specifically designed to be independent, so a gap in one is still caught by another.
What happens if the allowlist misses a newly added sensitive field?
The output-verification layer scans the finished response independently, checking for banned field names and CPF/CNPJ-shaped patterns, and refuses to send the entire response if it finds a match — regardless of whether the allowlist caught it first.
Why refuse the whole response instead of just removing the bad part?
The code's own reasoning is that a response reaching that point with tax content in it signals something read from the wrong table upstream — treating that as a bug to fix, not a symptom to quietly clean up.
How does the panel distinguish "no cost" from "cost not yet measured"?
A dedicated field explicitly marks whether a real pricing table currently has entries — when it doesn't, the panel shows that cost isn't yet estimable rather than displaying a definitive zero.
Is there any way to construct a response from this function that skips the allowlist or the output check?
No — confirmed directly in the current source that every response passes through one shared function, which is the only place either layer is invoked.
What does Centriu Gauge cost?
It is sold by subscription with a published starting price — exact current values are on the central pricing page.
See how Centriu Gauge keeps its own internal panel away from tax content
Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.