Governance Kill-Switch Automation: Anyone on the Team Could Flip the Switch

Tenant isolation answers 'whose row is this,' not 'should this specific caller be allowed to change it'
Row-level security scoped to organization membership is the right, necessary foundation for any system shared by many separate organizations — it is what stops one organization from ever reading or writing another organization's data. But membership and permission are two genuinely different questions. A governance flag that controls whether production is allowed to go live, or whether a safety block may be lifted, is meant to be changeable by a small subset of an organization's own members — not by every member equally. A security model that only ever asks "does this row belong to your organization" has, by construction, no way to also answer "and are you specifically the kind of member allowed to touch this particular column" — that second question needs its own, separate enforcement, and for these six tables, it simply did not exist at the database layer.
How the underlying problem shows up before you fix it
Row-level security on a table is scoped entirely to tenant/organization membership, with the same read-and-write permission granted uniformly to every member regardless of their own role within that organization.
A column explicitly meant to gate something high-consequence — whether production may go fully live, whether a safety block may be lifted, whether a governance rule may be disabled — carries no additional, role-specific check anywhere below the application's own client-side interface.
A client-side interface correctly hides or disables the control for a member without the right role, creating the appearance of a working restriction — while the same change remains fully reachable by any authenticated member issuing the identical write directly against the database's own public interface.
The affected columns are specifically the ones a governance or kill-switch mechanism exists to protect — flags meaning "this is allowed to happen in production now" — rather than ordinary, low-stakes configuration a broader set of members would legitimately need to edit.
This class of gap produces no error and no visibly broken behavior for as long as every member only ever uses the application's own interface as intended — it surfaces only when someone (accidentally or deliberately) reaches the same table by another path.
Why tenant-only RLS feels like a complete answer until a role check is actually needed
Row-level security scoped to organization membership is, correctly, the very first and most important control any system shared by many separate organizations needs — and for the overwhelming majority of a product's own tables, membership alone genuinely is the right, complete answer: any member of an organization is meant to be able to read and write their own organization's ordinary operational data. The gap opens specifically for the smaller, higher-consequence subset of columns where the real business rule is narrower than "any member" — where the actual requirement is "only an admin, owner, or platform operator." Building that second, role-specific layer requires deliberately identifying which columns need it and writing a distinct enforcement rule for each; a security model that stops at tenant isolation, however correctly built, simply never reaches that second layer on its own.
How Centriu Helix closed the gap between "your organization" and "your role"
Centriu Helix's own governance and kill-switch mechanism spans six database tables, added to this protection across two hardening passes. The first covers `helix_rollout_plans` (production Go-Live and real-write flags), `helix_feature_flags` (per-feature release and enable flags) and `helix_pilot_tenants` (real-write and integrations-allowed flags for a tenant still in pilot) — all three carrying the identical class of production-consequential kill-switch column, all three previously protected only by the same tenant-scoped row-level security. The second, later pass extends the identical pattern to three more tables: `helix_safety_blocks` (lifting or archiving a block that stopped something risky), `helix_governance_rules` (disabling, archiving, or weakening the severity or condition of a governance rule), and `helix_integration_environment_flags` (whether an integration environment may accept real, non-simulated submissions).
Each of the six tables now carries a database trigger, firing before any update, that inspects specifically which columns are changing. If the change touches one of that table's own privileged governance columns, the trigger calls a shared helper function that checks whether the calling identity is that organization's own owner, an ACTIVE member holding an admin or owner role, or the platform's own master account — and if none of those apply, the write is rejected outright with an explicit error naming the table and the class of change that requires elevated privilege. A caller connecting as the application's own privileged service role — the legitimate path the product itself uses to promote a genuine Go-Live decision server-side — is recognized separately and passes through untouched, since service-role writes are, by the platform's own design, the trusted server-side path row-level security is built to bypass in the first place.
What is actually built today
A shared database function checks whether the calling identity is an organization's own owner, an active admin/owner-role member, or the platform's own master account — used identically by all six governance tables' own privileged-column guards.
Six separate database tables — rollout plans, feature flags, pilot tenants, safety blocks, governance rules, and integration environment flags — each enforce this exact same role requirement on their own specific privileged columns.
A member with no elevated role can still read and use every ordinary, non-privileged part of these same tables and the features built on top of them — the guard blocks only the specific columns controlling production consequence, not general access to the tables.
The application's own legitimate server-side Go-Live promotion path, which connects as a privileged service role, is explicitly recognized and continues to write without any new friction.
The guard fires as a database trigger, meaning it applies identically no matter which path reaches the table — the product's own interface, a direct API call, or any future code path nobody has written yet.
A switch anyone in the building could reach (illustrative framing of the actual confirmed mechanism)
Before the fix, a member with no permissions granted anywhere else in the product could still change a value meaning "production is allowed to go fully live" or "this safety block is lifted," as long as they could reach the underlying table directly — the interface hid the control, but nothing behind the interface actually enforced who was allowed to touch it. After the fix, the identical write is rejected at the database itself unless the caller genuinely holds an admin, owner, or platform-operator role for that organization — the restriction moved from something the interface merely displayed to something the data layer itself enforces.
What changes operationally
Centriu Helix's governance and kill-switch columns — across rollout plans, feature flags, pilot tenants, safety blocks, governance rules, and integration environment flags — can now only be changed by an organization's own admin, owner, or the platform's own master account, enforced at the database layer itself rather than only by the application's own interface, closing a gap where any authenticated member could otherwise flip a production-consequential flag with a single direct write.
When this is not the right fit
This automation covers specifically Centriu Helix's own governance and kill-switch column protections. It is a distinct mechanism from this pillar's separate page on Helix's approval-decision integrity guard, which concerns whether a recorded approval decision can be faked or mutated after the fact — a different table, a different specific failure mode, covered on its own page.
Tenant-scoped access vs. tenant-scoped access plus an explicit role gate
Row-level security scoped purely to organization membership is simpler to build and is entirely correct for the great majority of a product's own tables, where any member of an organization genuinely should be able to read and write their own operational data. It stops being sufficient the moment a specific column's own real business rule is narrower than that — where the actual requirement is a specific role, not simply membership. Adding an explicit, database-enforced role check on top of tenant isolation, scoped only to the specific columns that actually need it, is the only version of the two that closes that gap without weakening tenant isolation itself or blocking ordinary members from the rest of the same table.
Related systems
Main system: Centriu Helix.
What it does NOT do
- Does not restrict any ordinary, non-privileged read or write on these six tables — the guard fires only when a change specifically touches a column controlling production consequence (kill-switch, Go-Live, real-write, integration-enabled, safety-block-lifted, governance-rule-disabled).
- Does not add any new role or permission concept to Centriu Helix — the guard checks against roles (admin, owner, platform master) the product already recognizes elsewhere.
- Does not affect the application's own legitimate server-side Go-Live promotion path, which is explicitly recognized as a trusted, privileged service-role caller and continues to write without new friction.
- Does not overlap with this pillar's separate page on Helix's approval-decision integrity guard — that page concerns whether a recorded decision can be faked or mutated, a different table and a different specific mechanism.
- Does not extend this same role-gated-column pattern to any other module in Centriu's other systems — this fix is specific to these six Helix tables, confirmed to have carried this exact gap.
Security and governance
Centriu Helix's governance and kill-switch columns — across six tables spanning rollout plans, feature flags, pilot tenants, safety blocks, governance rules, and integration environment flags — now require an organization's own admin, owner, or the platform's master account for any change, enforced by a database trigger rather than only by the application's own interface. Full detail on this module's access-control and governance 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
Could an anonymous, unauthenticated visitor have exploited this?
No — the gap required a genuine, authenticated member of the specific organization whose row was being changed. Row-level security correctly continued to stop anyone outside that organization from reaching the row at all; the gap was specifically about WHICH members within a legitimate organization could change WHICH columns.
Does this affect ordinary features unrelated to governance and kill-switches?
No — the guard checks specifically for changes to a small, named set of privileged columns on six tables. Every other column on those same tables, and every other table in the product, is unaffected.
How does the application itself still promote a genuine Go-Live decision?
By connecting as a privileged service role — the same trusted, server-side identity row-level security is designed to let bypass tenant checks in the first place. The new guard explicitly recognizes and passes through that specific identity.
Is this the same finding as the approval-decision integrity page on this site?
No — that page concerns whether a recorded approval decision can be faked (attributed to the wrong person) or mutated after being recorded. This page concerns whether a governance or kill-switch COLUMN can be changed by a member without the right role. Different tables, different specific mechanisms.
Were these six tables always meant to be editable only by admins and owners?
Yes — the product's own client-side interface already hid or disabled these specific controls for members without an admin or owner role. The gap was that nothing behind that interface enforced the identical rule; this fix makes the database itself enforce what the interface already intended.
What does Centriu Helix cost?
It is sold by subscription with a published starting price — exact current values are on the central pricing page.
See how Centriu Helix locks its own kill-switch to the right role
Reach our commercial team directly, or leave your details below — we'll follow up with guidance for your case.
