SOLODKIY.CV LC03 · SOVEREIGN DISCLOSURE PLANE
LIVE CASE 03 · 14 SEP 2026 · PERSONAL RESEARCH NOTE

THE DOMAIN WAS REAL.
THE AUTHORITY WASN'T.

Revolut says fraudulent information requests arrived through a legitimate government-agency email domain and resulted in customer data being disclosed to an unauthorised third party. I used to run a bank and built an earlier version of a regulator-as-user product. This incident made me revise one of the assumptions behind it.

News event
11-12 SEPT 2026
A disclosure process was socially engineered.
My prior art
ARIVAL
Regulator as a first-class product user.
My first fix
FAILED
A provisional-minimum idea still leaked.
New invariant
HOLD
Zero outbound PII until authority is complete.

What made the incident interesting to me is what did not happen. Revolut said its systems and customer funds were unaffected. Public reporting says the fraudulent requests used a legitimate government-agency domain. TechCrunch says identity/contact data and copies of passports or driving licences were exposed, and that the affected data may also have included verification selfies, account statements and transaction histories.

No exotic model failure is needed to explain the design problem. A convincing piece of evidence — the channel — acquired too much operational authority before the human, current capacity, mandate and scope were fully resolved.

That is the problem I want to make explicit and testable.

Evidence, not lore

TechCrunch · 12 Sep 2026Reuters · 12 Sep 2026FBI / fake EDR class via Krebs · 2024
Public facts, company statements, secondary reporting and my inferences are kept separate below.
I am not interested in building an infallible officer or an infallible AI. I am interested in a system where convincing evidence cannot silently become permission.
01

The earlier version I actually built

Arival ≤2023

What we were trying to fix

At Arival, I treated the regulator as a product segment rather than an external nuisance. An agency could exist as an entity, with named human representatives as sub-users. Bank-account functionality was disabled; the point was structured supervisory interaction.

  • Named regulator users rather than anonymous inbox traffic.
  • Read-only compliance views rather than endless PDF ping-pong.
  • Contextual questions around a client or transaction.
  • Session telemetry: logins, pages viewed, time spent, reports opened.
  • A product/segment owner focused on regulator requests and UX.

What aged well — and what did not

Survived: regulatory interaction is a product problem: actors, objects, states, evidence, latency and auditability all matter.

Did not survive: using the working government email as the bootstrap root of trust. A legitimate domain can be evidence about the channel without proving the current human, their capacity or their mandate.

2026 revision: Regulator-as-user → authority-as-preverified-principal, with scoped virtual views and explicit mandate objects.

02

My first fix still leaked

R002 · the useful embarrassment
48-hour self-review · rule killed, not quietly edited

I initially allowed a “minimum dataset” before principal verification.

That sounded pragmatic: give less now, verify more later. It was also the same failure class with a smaller payload. Once an address, phone number, ID fragment or account detail leaves the bank, it is not provisional in any meaningful sense.

Dead rule

Government-domain match → provisional minimum disclosure while identity resolves.

Replacement

Government-domain match → HOLD. Preserve / prepare / escalate internally. packet_out = null until principal + capacity + mandate + scope pass.

A case may remain provisional. An outbound packet may not.
03

What I would ship on Monday morning

before a platform rewrite
01

Independent callback

Out-of-band verification via a number sourced independently of the request.

02

Requester registry

Named principals + current capacity. Domain membership is insufficient.

03

HOLD

While authority resolves: preserve, prepare, restrict deletion, escalate. Release zero PII.

04

Dual control

Second human for passports, selfies and broad transaction-history releases.

05

Evidence packet

Canonicalise → hash → sign → timestamp → bind to rule version and mandate object.

04

The five authority gates

before irreversible disclosure
01

Channel

Where did the message travel? Necessary evidence, never sufficient authority.

02

Principal

Who is the named human/system? Verify independently.

03

Capacity

Do they currently represent the agency in the relevant role?

04

Mandate

What lawful power applies to this case, purpose and jurisdiction?

05

Scope

Which subjects, fields and time range may leave?

Anything above this line may be revised. Anything below it must be assumed copied forever.
05

Runtime + tests

reference implementation, not deployment claim
{
  "request_id": "DW-2026-09-14-0041",
  "channel_evidence": {"type":"gov_domain_email","status":"pass","role":"evidence_only"},
  "principal": {"name":null,"verified_out_of_band":false},
  "capacity": {"agency_id":null,"current":"unknown"},
  "mandate": {"legal_basis":null,"case_id":null,"jurisdiction":null},
  "scope": {"subjects":[],"fields":[],"time_range":null},
  "state": "HOLD",
  "packet_out": null,
  "ai_override": false
}
DATA_OUT :=
    channel_evidence.valid
AND principal.verified
AND capacity.current
AND mandate.valid
AND scope.non_empty
AND required_human_approvals.complete

if irreversible(action):
    deferred_controls(action) = ∅

HOLD.permits = [preserve, prepare_internal, restrict_deletion, escalate]
HOLD.forbids = [release_pii, export_kyc, disclose_tx_history]
ai_override = false
// choose a trajectory
PASS channel_only_never_releases
PASS unknown_principal_packet_out_null
PASS stale_capacity_never_releases
PASS unresolved_mandate_never_releases
PASS empty_scope_never_releases
PASS ai_cannot_override_red_gate
PASS hold_releases_zero_pii
PASS revision_preserves_old_trace

These are reference-model assertions. They become evidence only when the same invariants are enforced and regression-tested in implementation.

ON-RECORD

Legitimate agency domain

Revolut confirmed fraudulent requests sent from a legitimate government-agency email domain.

ON-RECORD

Data disclosure

Revolut confirmed sensitive customer information was disclosed to an unauthorised third party.

COMPANY STATEMENT

Systems + funds

Revolut said its systems and customer funds were unaffected.

REPORTED

Data categories

TechCrunch says identity/contact details and ID document copies were affected; selfies, statements and transaction histories may also have been included.

INFERENCE

Authority plumbing

My model: channel evidence became operational permission too early. This is not Revolut's published root-cause language.

PROPOSAL

LC03

A design response derived from LC01/LC02 — not a deployed Revolut or Arival control.

06

Adversarial Compliance Lab

weird proposal, deliberately

Train the control against people who know how controls get gamed.

A synthetic disclosure desk. Professional red-teamers first. Then, case-by-case and under ordinary paid contracts, people with lived experience of fraud or social engineering generating attack paths a conventional compliance exercise may never imagine: urgency theatre, false capacity cues, scope inflation, the “helpful shortcut” after a refusal. No production PII. The product is not cheap labour. The product is adversarial knowledge.

A · PROFESSIONAL RED TEAM

Baseline: security, fraud and compliance specialists.

B · LIVED EXPERIENCE

Post-conviction / post-release experts, paid normally, synthetic environment only.

C · EDUCATIONAL PILOT

Custodial setting only later, if HMPPS + ethics + security design make sense.

07

One research line, several artifacts

not ten unrelated demos
08

Revision ledger

the page should expose its own scars
R001
Old assumption
Government-domain email can bootstrap requester identity.
New rule
Channel = evidence only. Principal verified independently.
Regression
channel_only_never_releases
R002
Old assumption
Minimum dataset may leave while identity is deferred.
New rule
HOLD = zero outbound PII; packet_out = null.
Regression
unknown_principal_packet_out_null
R003
Clarification
“Scope may be provisional” was too loose.
New rule
Case may be provisional; outbound packet scope is final at dispatch.
Regression
empty_scope_never_releases

Break the model, not the prose.

If you can design a synthetic request that crosses DATA OUT without complete principal + capacity + mandate + scope, the strongest response is not a defensive paragraph. It is a signed revision event and a new regression test.

Open the short news version