Escrow NEW and AML Officer 3.0

Roles and authority

Who may act, what each seat is refused, and where the refusal is enforced. Both demos take this seriously enough to fail closed, which is why some screens look emptier than you might expect.

Two products, two shapes of authority

The same compliance people appear in both. The mechanism does not.

Escrow NEW puts two companies and Wolf around one record, so every screen has to answer “whose is this?” before it answers anything else. Authority there is a closed list of capabilities held by nine named seats, and a reviewer switches between them.

AML Officer 3.0 is one function’s workspace. There is no persona switcher and no capability gate on a control, because everybody who gets in belongs to the AML function. The separation that matters there is between the lines of defence, and it is carried on the command and enforced as an ordering rule on the work itself.

Both models are enforced in the same place: the reducer that writes the record. Neither relies on a screen being polite.

Escrow NEW

The nine seats

Three sides, four perspectives in the switcher. Each seat carries a company it acts for, a home surface, an explicit capability list and one line stating its boundary.

Client 1 · Buyer

Alpine Metals AG

Katarina Bauer

Authorised Signatory10 capabilities

buyer_signatory · opens on /escrow-new/escrows

Binds Alpine Metals AG. Accepts terms and amendments, approves the FX instruction, agrees cancellation and dispute settlement.

May never

Prepare funding or allocate a received balance. The operational work of the transaction belongs to Finance.

Why

Binding the company and running the day's work are different jobs. Kept apart, an authorised signature is always a deliberate act rather than a by-product of a routine task.

Tomas Renner

Finance4 capabilities

buyer_finance · opens on /escrow-new/escrows

Prepares funding and uploads evidence. Cannot accept terms, approve FX or agree a settlement: those are reserved for the Signatory.

May never

Accept terms, approve the FX instruction or agree a settlement. He holds neither accept_terms, approve_fx_instruction nor accept_resolution.

Why

Everything he does is preparatory. The moment an action would bind Alpine Metals AG it moves to the Signatory, so no amount of operational access adds up to authority.

Lena Frei

Viewerno capabilities

buyer_viewer · opens on /escrow-new/escrows

Read-only, limited by transaction and document visibility. Every binding action is disabled.

May never

Anything at all. Her capabilities array is empty, so every gated action on every screen returns nothing for her.

Why

Read-only by construction rather than by a flag. There is no permission to forget to check, because there is no permission.

Client 2 · Seller

Baltic Commodities OÜ

Maarika Tamm

Authorised Signatory7 capabilities

seller_signatory · opens on /escrow-new/escrows

Binds Baltic Commodities OÜ. Accepts terms and amendments, accepts cancellation and dispute outcomes, controls the payout destination through amendment.

May never

Request release. That is the Transaction User's, and no Wolf record is visible to her at any point.

Why

The seller side is split exactly like the buyer side, so the boundary is a property of the model and not a quirk of one company's setup.

Rein Kask

Transaction User2 capabilities

seller_user · opens on /escrow-new/escrows

Uploads evidence and submits Request Release. Cannot accept terms or change the payout destination.

May never

Accept terms or change the payout destination.

Why

Asking for the money and deciding where it goes are the two halves of the same fraud. Splitting them across two people is the entire point of the split.

Wolf · Operations

Marcin Wilk

Operations Maker13 capabilities

wolf_ops_maker · opens on /escrow-new/queue

Prepares everything and approves nothing that moves money. Segregation of duties blocks approval of an instruction this user prepared. Records the binding instrument the parties signed without deciding the merits.

May never

Approve a movement of secured funds. He holds neither approve_movement nor extra_approval, and the reducer refuses the command even if it reaches it.

Why

He prepares everything: terms, conversion, verification, reconciliation and the settlement instruction itself. A seat that can both prepare and approve is a seat that can pay itself.

Ines Girard

Authorised Approver3 capabilities

wolf_approver · opens on /escrow-new/approvals

Reviews and approves movements of secured funds. Cannot edit a prepared instruction, only approve or return it to the maker.

May never

Prepare or edit anything. She holds no preparation capability of any kind, so the instruction she reads is exactly the one the maker submitted.

Why

An approver who could correct the instruction would be finishing the maker's work rather than checking it, and the second pair of eyes would be the first pair twice.

Wolf · Compliance

Anna Kowalska

AML Officer7 capabilities

wolf_compliance · opens on /escrow-new/compliance

Applies and removes Compliance Hold, issues RFI and grants pre-release clearance. Sees restricted reasons that no client ever sees.

May never

Prepare or approve a movement. No capability she holds touches a settlement instruction.

Why

Compliance decides whether a transaction may proceed, not that it does. Keeping clearance apart from execution means a cleared case is evidence on the record rather than an instruction to pay.

Jan Brunner

MLRO / Director8 capabilities

wolf_mlro · opens on /escrow-new/approvals

Second-tier authority above the configured value and risk thresholds, and the decision-maker on an MROS report recommendation.

May never

Escape the maker guard. He holds approve_movement and can act as the checker, and the same rule that stops the maker approving their own work stops him.

Why

Second-tier authority is a higher threshold, not an exemption. His extra_approval sits on top of a completed four-eyes check, never instead of one.

The switcher is the one control on these screens that belongs to the reviewer rather than to a seat, and its header states exactly what it does: view this transaction as, and the record does not change, only what this role may see and do. Each row carries the name, the register spelling of the seat and the same authority note printed above. The two client groups name the company they act for; the Wolf groups name none, because Wolf acts for neither company. Switching routes you to the new seat’s home, so nobody lands on a surface their seat cannot use.

Escrow NEW

Seat against capability

Authority is a closed list. The Capability union names 32 gated actions, and nothing outside it can be gated. Two helpers do all the checking: can() is a membership test against the seat's own array, and requiredRolesFor() scans every seat for holders so a blocked action can always name who would be allowed.

KB Buyer · Authorised SignatoryTR Buyer · FinanceLF Buyer · ViewerMT Seller · Authorised SignatoryRK Seller · Transaction UserMW Wolf · Operations MakerIG Wolf · Authorised ApproverAK Wolf · AML OfficerJB Wolf · MLRO / Director
CapabilityKBTRLFMTRKMWIGAKJB
submit_requestSubmit or withdraw the escrow requestBuyer · Authorised Signatory holds thisBuyer · Finance holds thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
create_escrowOpen a new transaction on the deskBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
configure_termsDraft and publish a version of the termsBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
accept_termsAccept the operative version for a companyBuyer · Authorised Signatory holds thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory holds thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
request_changeAsk for an amendment to the published termsBuyer · Authorised Signatory holds thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory holds thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
prepare_fundingPrepare the funding instructionBuyer · Authorised Signatory does not hold thisBuyer · Finance holds thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
allocate_balanceAllocate a received balance to the transactionBuyer · Authorised Signatory does not hold thisBuyer · Finance holds thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
approve_fx_instructionApprove the conversion instructionBuyer · Authorised Signatory holds thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
execute_fxExecute the approved conversionBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
upload_evidenceUpload evidence against a conditionBuyer · Authorised Signatory holds thisBuyer · Finance holds thisBuyer · Viewer does not hold thisSeller · Authorised Signatory holds thisSeller · Transaction User holds thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
record_external_resultRecord an external inspection or attestationBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
approve_evidenceAccept submitted evidence as satisfying a conditionBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
request_correctionReturn evidence for correctionBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
request_releaseRequest release of the secured amountBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User holds thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
buyer_confirmationConfirm the declaration the terms requireBuyer · Authorised Signatory holds thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
raise_disputeRaise a dispute on the transactionBuyer · Authorised Signatory holds thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory holds thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
accept_resolutionAccept a dispute outcome for a companyBuyer · Authorised Signatory holds thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory holds thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
record_resolutionRecord the signed resolution instrumentBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
apply_operational_holdApply an operational holdBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
apply_compliance_holdApply a compliance holdBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer holds thisWolf · MLRO / Director holds this
remove_compliance_holdRemove a compliance holdBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer holds thisWolf · MLRO / Director holds this
issue_rfiIssue a request for informationBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer holds thisWolf · MLRO / Director does not hold this
grant_clearanceGrant pre-release or funding clearanceBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer holds thisWolf · MLRO / Director holds this
reconcile_fundingReconcile an incoming funding eventBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
prepare_settlementPrepare a settlement instructionBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
approve_movementApprove a movement of secured fundsBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver holds thisWolf · AML Officer does not hold thisWolf · MLRO / Director holds this
extra_approvalSign off above the value or risk thresholdBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director holds this
change_payout_destinationChange the payout destinationBuyer · Authorised Signatory holds thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory holds thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
cancel_after_fundingAgree a cancellation once funds are securedBuyer · Authorised Signatory holds thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory holds thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer does not hold thisWolf · MLRO / Director does not hold this
view_restricted_complianceRead compliance-restricted recordsBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker does not hold thisWolf · Authorised Approver does not hold thisWolf · AML Officer holds thisWolf · MLRO / Director holds this
view_wolf_internalRead Wolf-internal recordsBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver holds thisWolf · AML Officer holds thisWolf · MLRO / Director holds this
export_auditExport the audit trailBuyer · Authorised Signatory does not hold thisBuyer · Finance does not hold thisBuyer · Viewer does not hold thisSeller · Authorised Signatory does not hold thisSeller · Transaction User does not hold thisWolf · Operations Maker holds thisWolf · Authorised Approver holds thisWolf · AML Officer holds thisWolf · MLRO / Director holds this

Two properties are worth reading off the grid rather than out of a paragraph. First, no capability is held on both sides: 13 belong only to client seats and 19 only to Wolf. No Wolf seat can accept terms, raise a dispute or agree a cancellation, because Wolf never binds a client company; no client seat can read a Wolf-internal record, a compliance-restricted one, or export the audit trail.

Second, 16 of the 32 capabilities have exactly one holder, which is where the model actually bites. There is no second seat to fall back on and no escalation path in the interface:

  • create_escrow: Wolf · Operations Maker
  • configure_terms: Wolf · Operations Maker
  • prepare_funding: Buyer · Finance
  • allocate_balance: Buyer · Finance
  • approve_fx_instruction: Buyer · Authorised Signatory
  • execute_fx: Wolf · Operations Maker
  • record_external_result: Wolf · Operations Maker
  • approve_evidence: Wolf · Operations Maker
  • request_correction: Wolf · Operations Maker
  • request_release: Seller · Transaction User
  • buyer_confirmation: Buyer · Authorised Signatory
  • record_resolution: Wolf · Operations Maker
  • apply_operational_hold: Wolf · Operations Maker
  • reconcile_funding: Wolf · Operations Maker
  • prepare_settlement: Wolf · Operations Maker
  • extra_approval: Wolf · MLRO / Director

Three capabilities are declared but never tested.

create_escrow, accept_resolution and change_payout_destination exist in the model and sit on the seats you would expect, but no gated action in any template asks for them yet. view_wolf_internal is declared on all four Wolf seats, and the visibility helpers test the seat’s side directly instead. Reading the grid, take a capability as a statement of intent; take the sections below as the statement of what runs.

Escrow NEW

An action belonging to another role is absent, not disabled

GatedAction computes the seat's authority and, when the answer is no, renders nothing.

A tool shows you what you can do. An action belonging to another role is simply not there, the same way a buyer never sees an operator’s controls in the finished product. A wall of greyed-out buttons teaches a client that the product is full of things they cannot have, which is noise rather than information, and it makes every screen a worse read for the person who does hold the seat.

The same rule is applied one level up, at the container, so an empty card never appears either. Each caller works out the seat’s authority before it renders the section around the controls:

  • Release: hasScopeActions tests prepare_settlement, raise_dispute and the resolution capability before the scope card is drawn at all.
  • Approvals: showActions tests approve_movement, or extra_approval when the instruction requires it.
  • Funding: the FX section appears only for a seat holding approve_fx_instruction or execute_fx.
  • Activity: the export control is behind a plain can(persona, "export_audit") test.

The consequence for a reviewer is that a screen held by the wrong seat looks thin rather than locked. That is the intended reading. The authority model is documented here; it is not spelled out on every screen.

One docblock in the code still says the opposite. It is stale.

The header of lib/data/escrow2/personas.ts claims that a forbidden action is rendered disabled with the role that would be required named beside it. That was an earlier behaviour, and the docblock above GatedAction now describes what actually runs: the component returns null before it renders anything, which leaves the branch that would have printed “reserved for ...” unreachable. Where a comment and the code disagree, the code is authoritative.

Visible but blocked: state against authority

The counterpart of hiding a foreign action is keeping your own.

GatedAction takes an optional blockedReason, documented as a state-level block that applies even to a role holding the capability. When it is set the control stays on the screen, disabled, with a security icon and the reason printed underneath.

The distinction is the whole design. A role boundary is permanent and silent. A state boundary is temporary and explained, because “not yet, and here is why” is real feedback the product owes you. Four of the reasons the templates actually pass:

  • Terms: “Wolf never accepts on behalf of a party. Acceptance is an authenticated action by each company’s Authorised Signatory.”
  • Release: “The scope is not ready. Every blocker above must clear before an instruction can be prepared.”
  • Approval: “Segregation of duties: you prepared this instruction, so you cannot approve it. A different authorised user must review it.”
  • Cancellation: “No secured amount remains in the structure, so there is nothing a cancellation could return.”

Binding and financial actions carry a confirmation on top of the gate, and the dialog restates the specific entity, amount, destination or version, because a generic “are you sure” would prove nothing about what is being authorised. Every one of them closes on the same line: acting as this name and this role, and in production this step also requires strong authentication.

What the demo does when the reviewer holds the wrong seat

A guided step names the seat it belongs to. Holding a different one is a normal thing to do, not an error.

Every Escrow NEW step declares the persona that performs it, and the run compares that against the seat the reviewer currently holds. When they differ the bar swaps its right-hand button for Continue as the seat the step needs, naming it. One press takes that seat and keeps you on the same step, then routes to where the step happens.

Nothing is performed on your behalf and nothing is skipped. The button hands over the seat because who acts is part of what is being demonstrated: a flow that moves from Finance to a Signatory to Operations to an Approver is showing you the hand-offs, and quietly letting one person do all four would be showing you nothing. Stepping backwards through the strip takes the seat of the step you land on, for the same reason.

The controls themselves never soften. While you hold the wrong seat the step’s action is absent from the screen exactly as it would be in production, so the bar offering the seat is the only route forward.

AML Officer 3.0 never reports a wrong seat, and the adapter says why: the workspace has one operator, so there is no seat to take and a step is never blocked on being someone else.

Authority over reading, not only over acting

Two helpers carry the whole rule, and every list is filtered before a seat receives it.

shared
Both companies and Wolf. The transaction as the parties know it.
buyer_wolf / seller_wolf
One side plus Wolf. The other company never learns the document exists.
wolf_internal
Any Wolf seat. Tested on the seat's side directly rather than on a capability.
compliance_restricted
Resolves to view_restricted_compliance, so it reaches the AML Officer and the MLRO and nobody else, not even Operations.

Audit entries follow the same rule over three levels, and both checks are applied at the point documents and audit are read, so a filtered list is the only list a seat ever receives. There is no unfiltered view to leak.

A hold shows the same split on one record. Applying it writes a restricted reason alongside a client-visible summary and a client-required action, and the audit entry is written compliance-restricted for a compliance hold and Wolf-internal for an operational one. The engine states the intent on the record itself: clients see a neutral review status, and the reason stays internal. Removing a hold is deliberately not a release either, it triggers a re-evaluation of the state and does not move funds by itself.

One record produces three different navigations. A client seat gets a single group, Your transactions: dashboard, my work, escrows, documents, and requests and messages. Compliance gets one group of its own, adding compliance cases, custody clocks, release approvals and the audit trail to the dashboard, the work list and the escrows. Operations gets three groups: Operations, Workspaces (funding and reconciliation, FX desk, verification, release approvals, settlement monitoring) and Control. The sidebar prints the current seat’s role label above the list, so the answer to “why can I not see the FX desk?” is one glance away.

Work is scoped the same way. The task owner type enumerates eight owners and pointedly omits the Viewer: a read-only seat never owns a task. A notification carries an audience of owners, where an empty list means every seat on the transaction. Tasks and notifications are derived from the transaction rather than stored, so a hand-off appears for the next role the moment the previous action lands.

Escrow NEW

Maker and checker on every movement of secured funds

Separation of duties is enforced in the reducer, not only in the interface. A command that breaks it is a silent no-op.

Preparing an instruction stamps the maker onto it, as an internal user id and as the acting name and role, and sets it to approval pending. The audit line written at that moment already states the rule: the maker cannot approve their own instruction.

Approval then opens with the guard, under the comment that the maker can never approve their own work. If the acting name matches the maker, the command returns the transaction unchanged. Rejection carries the identical guard, so a maker cannot dispose of their own instruction by returning it either. A rejection records a reason, cancels the legs and logs that it never alters the secured funds.

A successful approval writes the approver and the timestamp and logs the distinction the whole product turns on: approved by a user who did not prepare the instruction, and approved is not paid, because settlement has not started. Only submission sets the reversibility to the point of no return.

The acceptance suite tests the property rather than the intention. Its dual approval predicate requires an approval timestamp, an approver name, and an approver name that differs from the maker’s. The split-settlement scenario asserts that both legs passed maker-checker because a different user approved the instruction carrying them.

The scope of the rule is stated in the process narrative: every movement of secured client funds needs maker and checker for release, partial release, refund, split, cancellation after funding, residual return and manual re-instruction. No person may create the conditions and then unilaterally release the same transaction.

The MLRO tier above four eyes

Four eyes is the floor, not the ceiling.

Preparation sets an extra approval requirement by a plain numeric comparison on the instruction amount: at or above 2,500,000 the tier is MLRO, otherwise none. When it applies, the prepared instruction logs that the value tier also requires MLRO sign-off.

The two approvals are ordered and cannot be collapsed into one. A four-eyes approval on a tiered instruction keeps it at approval pending and moves the state label to Awaiting MLRO, logging that the value tier still requires an additional sign-off before the instruction can be submitted. The MLRO command refuses to run at all unless the four-eyes approval is already on the record, so the second signature sits on top of the first rather than replacing it.

Only the MLRO holds extra_approval. He also holds approve_movement and may act as the ordinary checker, and the maker guard applies to him like anyone else. The approvals surface reflects all of this: it is titled Release approvals under the eyebrow Four-eyes control, it chips a warning that a second-tier approval is also required when the tier is set, and it shows the sign-off control only to a seat holding the capability. The narrative adds the two rules the prototype states about approval quality: approval requires strong authentication, rejection requires a reason and returns the instruction without touching the secured funds, and an approval lapses if any reviewed field or clearance changes before execution.

AML Officer 3.0

Seats are hats, not logins

No persona switcher, no capability gate on a control. The workspace belongs to the AML function as a whole, and the four desks below are the only ones it records.

Entry is a single coarse gate. The route guard reads the shared session role and denies a client account with “This is the compliance workspace. Your account does not have access to it”, returning them to their portal after a few seconds. The two staff session roles, Admin and AML Officer, may both enter and the sidebar is the same for either. It is badged AML Officer 3.0, the product name in full, because the badge sits one column away from the top bar and a badge cut back to AML Officer would read as a fifth desk rather than as the name of the workspace.

That distinction is the one thing worth being pedantic about here. A login carries a job title from the shared session store, and neither of those titles is a seat: the operations login reads Operations Admin, and the compliance login reads AML Officer, which is the product again. So a small map turns the session role into one of the four seats, the header prints that seat under the name, and the guided run names the same four and nothing else.

Inside, separation is carried on the command rather than on the screen. Every AML command is appended to the log with an actor name and an actor role, defaulting to Anna Kowalska at the AML Special Unit, and a screen whose step belongs to a different seat passes that seat explicitly: Marcin Wilk as First Line of Defence on a monitoring note, Jan Brunner as Management on a decision, Tomasz Zieliński as Second reviewer on a confirmation. So the record knows who acted even though the interface never asked you to log in again. A guided step names the hat you are wearing for exactly that reason.

First Line of Defence
Marcin Wilk. Analyses and comments on a monitoring hit, performs simple investigations, and reports suspicion upward immediately. The Monitoring screen stamps the analysis note with this seat by name.
AML Special Unit
Anna Kowalska. Reviews the first line's analysis, opens and completes special clarifications, adjusts risk levels, recommends, and executes a notification once Management has decided. This is the desk the engine assumes when a command names no actor, and it is Anna Kowalska's desk everywhere in this workspace.
Management
Jan Brunner. Approves higher-risk relationships and decides on a report. The Reporting screen and the customer profile pass him explicitly as Management.
Second reviewer
Tomasz Zieliński. Confirms a screening disposition recorded by somebody else. He is the second name in the shared list of compliance users, which exists for assignment demos and is not a login, so this seat is the only desk the workspace ever records him at.

AML Officer 3.0

The lines of defence, and the order they act in

Section 6 of the AML policy, transcribed and rendered on the policy screen under one caption: the Special Unit recommends, Management decides, the Special Unit executes.

RoleDuty
Board of DirectorsOwns the AML framework and approves the policy.
ManagementApproves higher-risk relationships and decides on an MROS report following the AML Special Unit's recommendation.
AML Special UnitConducts additional investigations, adjusts risk levels, recommends continuation, termination or a report, and executes notifications once Management has decided.
First Line of DefencePerforms simple investigations, analyses and comments on monitoring hits, and reports any suspicion to the AML Special Unit immediately.

The Board owns the framework and approves the policy, and appears in no guided step: owning a framework is not work performed in a workspace. The other three are lines of defence and three of the four seats in the register above. The fourth, Second reviewer, is not a rank in the policy at all; it is whoever did not record the thing being confirmed.

The separation between the first line and the Special Unit is enforced as an ordering rule on monitoring statuses. A status is a set rather than a single value, because a transaction can be under investigation, awaiting information and already reviewed at once, and forcing that into one value loses the picture. What the set cannot do is skip a line of defence. The status check returns a verdict with a reason:

  • Reviewed by the AML Special Unit needs a first-line note on the record: the first line has to analyse and comment on the hit before the Special Unit reviews it. The second line reviews the first line’s words, and a second line that reviews nothing is a rubber stamp.
  • Plausible and not plausible exclude each other, are refused while information is still outstanding, and require a clarification that already carries a recorded result: the plausibility check has to be written down, not just flagged.
  • Reporting to MROS needs a recommendation and then a Management decision. Without one, the refusal reads: Management decides on the recommendation, the Special Unit then executes, and no decision is on file.
  • Approved by Management needs a recommendation first, because there is nothing for Management to approve until somebody has made one.

Removing a status is always permitted, because a wrong entry has to be correctable. The guidance line narrates the same chain in order: record the first-line analysis, have the Special Unit review it, open a special clarification, complete summary, documents and result, make a recommendation, then wait for Management.

Escalation crosses the line formally rather than by conversation. It sets the escalation target to the AML Special Unit, adds the investigation status, and opens a special clarification, because that is the form the policy requires for an additional investigation. The derive pass then applies the investigation criterion to the customer automatically, recorded as applied by the risk model and noted as applying irrespective of the outcome.

The second reviewer, on a screening disposition

The one place AML 3.0 applies a maker-checker split of its own.

A person’s screening record carries the disposition and, separately, who confirmed it. Recording a disposition (mark false positive, or confirm true match) clears any earlier confirmation in the same write, so a new conclusion is never inherited as already confirmed.

The confirmation command carries the guard that the reviewer who recorded the disposition cannot confirm it. Worth knowing precisely what is wired today: the profile screen calls that command with the customer and the person only, and does not pass who recorded the disposition, so the engine guard does not fire from that screen. The separation is achieved by construction there instead. The control is labelled Second review as Tomasz Zieliński, runs as that named actor at the Second reviewer seat, and is disabled unless a disposition exists and no confirmation has been recorded yet.

The guided flow states the property it is proving: confirm the disposition as somebody who did not record it, and the reviewer who recorded it cannot be the one who confirms it. The seeded data shows the same pattern at rest, with confirmations attributed to somebody other than the recorder in every case.

AML Officer 3.0

Management: recommend, decide, execute

The sharpest separation in the product, and the report case carries it in its own fields.

A report case stores the recommendation, who made it and when; then the Management decision, who took it and when; then the filing and the MROS reference. Its state moves from drafting, to awaiting management, to filed or closed with no report. Three commands map one to one onto three seats.

  • Recommend. The Special Unit opens the case at awaiting management, and the recommendation is stamped with the acting name and the Special Unit. The detail screen offers this only where the clarification result is something other than plausible with no suspicion, and the guided step says it plainly: the Special Unit recommends, it does not decide.
  • Decide. The Reporting screen runs this as Jan Brunner at Management, through two buttons: decide to report, which moves the case to drafting, and decide not to report, which closes it. Both are disabled on empty text, so a decision without reasoning cannot be recorded.
  • File. The command returns unchanged if there is no Management decision on the case, so the Special Unit cannot execute a notification that Management has not decided.

The completeness check adds the missing Management decision to the list of what a file still needs, which is why the screen can refuse to present a report as ready, and the goAML export emits an explicit marker for anything the platform cannot source rather than a plausible-looking invention.

The upstream half of the chain is enforced on the clarification form: recording a result is refused while the summary is empty, and both sending to Management and closing are refused without a result.

Management approval is graded by risk, not uniform

CategoryHow it is reachedManagement
Low riskRisk scoring = 0. No risk criterion is fulfilled.No management approval required.
Medium riskRisk scoring 1–2. One or two criteria of scoring category 1 are fulfilled.At least one member of Management approves the relationship.
High riskRisk scoring ≥ 3. One or more criteria of category 3, or two or more of category 2.Management approves the relationship.

The customer profile honours this by offering Record the Management approval only where the category is not low. That matters to the authority model because the category is what pulls Management in, and the category is never stored: it is derived from the criteria on the file, high at a score of three or more, medium at one or two. It cannot be set by hand to avoid them.

Escrow NEW and AML Officer 3.0

Where the two models meet

One record, three of the same people, and a separate register of seat names on each side.

The AML workspace reads the Escrow NEW transactions directly rather than keeping its own copy of a queue, so an officer looking at a case and an operations user looking at the transaction are reading the same record, and a scenario added on the escrow side appears in AML with no further wiring. Each escrow-driven case is paired with the policy duty it discharges: the seller screening case before payout, for instance, is labelled as ongoing screening of all involved persons, repeated immediately before every outgoing movement.

The people line up too, and each demo names them out of its own register. Escrow NEW spells a seat as a side and a title, and AML Officer 3.0 has the four seats above. Those are the two registers; there is no third spelling anywhere, and neither register is a variant of the other. So one person holds a seat in each demo, under two names, both of them exact:

  • Anna Kowalska: Wolf · AML Officer in Escrow NEW. The AML Special Unit in AML Officer 3.0, which is the desk the engine assumes when a command names no actor.
  • Jan Brunner: Wolf · MLRO / Director in Escrow NEW. Management in AML Officer 3.0, the seat the Reporting screen and the customer profile pass by name when he decides.
  • Marcin Wilk: Wolf · Operations Maker in Escrow NEW. The First Line of Defence in AML Officer 3.0, on the monitoring note.

AML Officer is therefore three things and one thing it is not. It is the name of the product, the name of the compliance workspace, and the title of the Escrow NEW seat Anna Kowalska holds. It is not a desk inside AML Officer 3.0: the four seats there are First Line of Defence, AML Special Unit, Management and Second reviewer, and nothing in that workspace is attributed to anything else.

The join point in the lifecycle is compliance clearance. A compliance hold blocks release, refund, conversion and any change to the payout destination, and only the two Escrow NEW compliance seats, AML Officer and MLRO / Director, hold the capabilities to remove a hold or grant clearance. Operations can take a held transaction as far as the blockers and no further, and a prepared instruction stores the identifier of the cleared case it relies on, so the approver reads the clearance the instruction was built on rather than whatever the case file happens to say later.