Audit & Compliance

Meridian Exchange Services · Wed, Aug 19, 2026 · evidence window 2026-08-12 → 2026-08-19 (UTC)

Oregon QI registration lapsed 4 days ago

The renewal was filed Aug 6 and the filing receipt is attached — but a filing is not a renewal. This row stays lapsed until the state's issued certificate is on file, because the certificate is the evidence and the filing is not. Bond and E&O for Oregon remain in force; 3 open exchanges carry an Oregon relinquished property.

Event ledger

Append-only. Scoped to this org and the caller's exchange participations — audit_log has no UPDATE policy and a BEFORE DELETE guard for five years.

9 of 412 in window
Audit log events for EX-2024-0147, Aug 12 to Aug 19 2026
Recorded (UTC) Actor Event Outcome Durability Evidence
Aug 1814:02:11
Matt Belcher
Exchanger · 7c1f…9ab2
disbursement.authorized
Signed Disbursement Authorization filed to EX-2024-0147. Instruction — not an approval
The exchanger instructs; the exchanger never approves. Fund release is decided by two authorized officers and this row is not counted toward either.
Success Forwarded
Vectr sink · rcpt 4f20…
ESIGN-002
Aug 1815:47:03
Priya Raman
QI Officer · c6a8…37e1
disbursement.proposed
$1,094,000.00 to Sierra Escrow, closing wire. Proposal — 0 approvals
A proposer's own submission is never counted as an approval. This proposal reached the approval state only through the distinct officer three rows down.
Success Forwarded
Vectr sink · rcpt 4f2b…
IRS1031-006
Aug 1815:47:56
Priya Raman
QI Officer · c6a8…37e1
disbursement.self_approval_blocked
Attempted to approve the proposal she had submitted 53 seconds earlier. Refused HTTP 403 at the API and independently by the DB check constraint disbursement_proposals_approver_ne_proposer.
Failure Forwarded
Vectr sink · rcpt 4f2c…
IRS1031-006
Aug 1909:12:40
Sandra Osman
QI Officer · e5d4…08fa
disbursement.approved
$1,094,000.00 released to Sierra Escrow. 2 of 2 QI officers · approver ≠ proposer
Success Forwarded
Vectr sink · rcpt 5a01…
IRS1031-006a
Entry id
a37c9e21-4b8d-4f0a-9c73-2e1f5d6a8b04
Recorded
2026-08-19 09:12:40.318 UTC
Actor
Sandra Osman e5d4…08fa
Org
org 8f31…c204
Resource
disbursement_proposal d92a…7710
Source address
198.51.100.24
Retention floor
2031-08-19 · delete refused until then
Sink receipt
5a01f7c8 · accepted 09:12:41
Controls this row is evidence for
IRS1031-006IRS1031-006a SOC2-CC7.2-001BSA-002 ESIGN-002ADV-001
Event detail — written NPI-redacted
{
  "proposed_by":                "c6a8…37e1",   // Priya Raman
  "approved_by":                "e5d4…08fa",   // Sandra Osman — distinct, enforced
  "amount_cents":               109400000,
  "escrow_balance_cents":       141800000,
  "escrow_balance_source":      "escrow_accounts",
  "escrow_balance_as_of":       "2026-08-19T06:00:00Z",
  "approved_undisbursed_cents": 0,
  "available_cents":            141800000,
  "screening_gate":             "cleared",
  "payee_account":              "•••• 7842"    // masked at write time, never stored raw
}
SSN, date of birth and bank digits never enter this table — they are masked or encrypted before the row is written SOC2-CC6.3-001 SOC2-CC6.3-002. The balance the approval was measured against rides on the row itself, so an examiner can reconstruct the sufficiency test without trusting a later balance read.
Aug 1411:26:02
System
Persona callback · no user
kyc.completed
Matt Belcher verified. Inquiry inq_8Kd…21, government ID + selfie, OFAC screen clear.
Recorded from the provider's callback, never by a coordinator. No role in this console can mark an exchanger verified on their behalf.
Success Forwarded
Vectr sink · rcpt 3c88…
BSA-001
Aug 1908:40:19
Priya Raman
QI Officer · org_admin · c6a8…37e1
deadline_override.requested
EX-2026-000188 · 180-day date, legal basis disaster_relief (Rev. Proc. 2018-58). Waiting on: a second officer
Not applied. The stored deadline is unchanged until a distinct approver runs the guarded RPC; the request alone changes nothing.
Pending Forwarded
Vectr sink · rcpt 5b7d…
IRS1031-010
Aug 1721:08:55
Okonkwo Holdings LLC
Exchanger · 9a02…ff17
identification.deadline.denied
Submission refused at 22:08:55 local, 1 day after the 45th day (2026-08-16). Server-side gate; the client had already disabled the control.
Failure Forwarded
Vectr sink · rcpt 51e0…
IRS1031-004
Aug 1907:55:12
Sandra Osman
QI Officer · e5d4…08fa
qi.exchanges.exported
198 rows · 11 columns · NPI class financial + identity. Column names recorded, values never. Written and forwarded before the file was produced.
Success Forwarded
Vectr sink · rcpt 59a4…
GLBA-007
Aug 1516:31:07
Sandra Osman
Org admin · e5d4…08fa
admin.hub_advanced
Operator override on EX-2026-000212 identification hub, reason recorded: “title company re-issued the notice with the corrected APN”.
Success Local only
Written by admin.ts direct insert — never forwarded. Readable here for 7 days.
IRS1031-004
Durability is per-row, not per-table. Roughly a third of audit writes still bypass writeAndForwardAudit() and live only in the seven-day local read model (#2353). Those rows are marked Local only rather than shown as if they were durable — a row that will be gone in a week is not five-year evidence, and an examiner must be told which is which.

Integrity & retention

What the platform enforces on this ledger, and what it does not. Both halves, stated.

Enforced today — shipped
Deletion refused for five years
A BEFORE DELETE trigger raises while now() < retention_until. Triggers fire regardless of RLS and bypassrls, so a service-role script is refused too.
ADV-001Active
An unlogged mutation cannot succeed
If the audit insert fails, the endpoint returns 500 and the mutation is treated as failed. Fail-closed, not best-effort.
SOC2-CC7.2-001Active
No UPDATE policy exists on the table
Row-level security defines SELECT and INSERT only, so no anon or authenticated caller can rewrite history.
SOC2-CC7.2-001Active
Failed forwards are retried, not dropped
A forward failure lands in audit_log_retry and is drained by a five-minute cron. Queue depth right now: 2, oldest 6 minutes.
SOC2-CC7.2-002Active
Not enforced — do not claim it
No hash chain and no monotonic sequence
Rows carry a UUID and a timestamp, not a sequence number and not a prev_hash. Nothing here proves a row was never removed before it was read — which is why this panel shows no green “chain verified” state.
audit-log-tamper-detection
UPDATE is undefended against a service role
The delete path has a trigger; the update path does not. RLS stops user roles, but service_role bypasses RLS and no trigger blocks it. The delete guard is the model to copy.
No alerting, no anomaly detection, no SIEM
We can reconstruct what happened. We cannot detect it while it is happening. There is no alert rule and no on-call rotation watching this log.
docs/SECURITY.md §3
Coverage is 504 hand-written call sites
No trigger and no mandatory mutation wrapper guarantees an audit row exists. Four routers still mutate with no audit reference at all.
#1922#2353
Why the verifier is disabled rather than hidden. A greyed control that names the missing capability is honest; a page with no control at all reads as if verification had already passed. When audit-log-tamper-detection ships, this button runs the chain and this panel gains a verified-through timestamp — not before.

Export register

Every export writes its own audit row before a byte is produced. If that write fails, the export fails and no file exists.

Fail-closed GLBA-007
Taken By What left the system Rows NPI class Audit row
Aug 1907:55 UTC
Sandra Osman
QI Officer
QI exchange queue · CSV
11 columns incl. exchanger name, escrow balance, deadlines
198 Financial + identity a1c4…6f30
Aug 1816:20 UTC
Tom Bottenberg
Exchange Coordinator
Book of business · saved report
Server-generated artifact; row count captured at generation
64 Aggregate only bb70…12e9
Aug 1809:04 UTC
Tom Bottenberg
Exchange Coordinator
Deadline bucket counts · CSV
Counts only, no party names
4 None c093…88a1
Aug 1713:41 UTC
Sandra Osman
QI Officer
Audit log · CSV
Today the audit-log export is built in the browser and writes no audit row of its own — this line was reconstructed from a session log, which is not evidence. It also exports only the 50 loaded rows, not the whole filtered result.
50
of 412
Identity None written
Two defects this register exists to expose. An export surface that cannot show who took the audit log out, and a “download everything” that quietly hands over one page, are both worse than no export button — they produce a file an examiner will treat as complete. Both are drawn here as gaps, not designed around.

Compliance cadence

Every recurring obligation, with an owner, a due date, a last-completed date and the evidence. Obligations with no schema behind them are listed as Not tracked — the absence is the finding.

1 lapsed 1 due in 13 days
Obligation Owner Cadence Last completed Next due Status Action
Oregon QI registration renewal
State QI statute · ORS §86A STATEQI-001
Sandra Osman
Waiting on: OR DFR
Annual
Aug 15, 2025
Aug 15, 2026
Lapsed 4 days ago
Lapsed
Filed Aug 6 · certificate not on file
Nevada QI registration renewal
State QI statute · NRS §645A STATEQI-001
Sandra Osman
Waiting on: us
Annual
Sep 1, 2025
Sep 1, 2026
13 days remaining
Renewal open
California QI registration renewal
CA SB 1007 STATEQI-001
Sandra Osman
Waiting on: nobody
Annual
Feb 2, 2026
Feb 2, 2027
167 days remaining
In force
Fidelity bond · California
$2,500,000 coverage on file STATEQI-001
Sandra Osman
Waiting on: nobody
Annual
Dec 31, 2025
Dec 31, 2026
134 days remaining
In force
E&O insurance renewal
$1,000,000 coverage on file STATEQI-001
Sandra Osman
Waiting on: broker quote
Annual
Nov 30, 2025
Nov 30, 2026
103 days remaining
In force
Audit-forward dead-letter drain
Scheduled worker · */5 * * * * SOC2-CC7.2-002
Backend on-call
Waiting on: nobody
Every 5 minutes
Aug 19, 09:35 UTC
Aug 19, 09:40 UTC
Queue depth 2
Running
Rule 204-2 retention floor
Enforced by DB trigger, not by a job ADV-001
Backend
Waiting on: nobody
Continuous
—
Not a task; a constraint
—
Oldest protected row: 2031-08-19
Active
Floor only — no sweep removes aged rows
OFAC / SDN rescreening of open files
BSA/AML BSA-002BSA-006
Compliance Officer
Proposed owner
—
Proposed: monthly + at payee add
—
Screening is point-in-time at counterparty add only
—
No rescreening cadence set
Periodic ofac-sdn-screening not scheduled for this counterparty
SOC 2 Type II evidence collection
Observation window & attestation dates SOC2
Compliance Officer
Proposed owner
—
Proposed: quarterly pull
—
—
No schema records the audit period or attestation dates
BSA/AML program annual review
31 CFR §1020.210(b)
Compliance Officer
Proposed owner
—
Proposed: annual
—
—
No schema tracks program review cadence
Form ADV annual amendment
Investment Advisers Act, Rule 204-1 ADV-002
Compliance Officer
Proposed owner
—
Proposed: annual, within 90 days of fiscal year end
—
—
No schema tracks RIA filing cadence
CCPA data-subject request clock
45 days, one 45-day extension CCPA-001
Compliance Officer
Proposed owner
—
Per request
—
—
No intake exists, so no clock can start
Schema can locate PII by user_id; no DSAR intake, clock or runbook
Form 8824 / 1099-S filing status
IRS §1031, IRS §6045
Compliance Officer
Proposed owner
—
Proposed: per closing, per tax year
—
—
No admin surface or schema generates or tracks filing status
A lapsed statutory obligation never resolves to a neutral or satisfied appearance. It cannot be acknowledged, snoozed, or scrolled into calm. The Oregon row stays red until the state's certificate is attached, because the certificate is the evidence and the filing receipt is not — and the same rule governs the 45- and 180-day clocks elsewhere in the console.

Control register — 77 controls across 11 regimes

Read straight from docs/COMPLIANCE.md. A control is Active only when the enforcement point exists in code or in a signed process — never because it is written down.

Regime Controls Active Draft Deferred Compensating Last full review
IRS §1031 / Treas. Reg. §1.1031(k)-1
Deadlines, identification rules, qualified escrow, constructive receipt
2016 4— —2026-08-15
SOC 2 Type II
CC1–CC9 common criteria
2216 —— 62026-07-20
GLBA + Reg P / Safeguards Rule
16 CFR §314 — NPI handling
72 —2 32026-08-15
BSA / AML / OFAC
CIP, SDN screening, SAR, CTR
61 41 —2026-07-20
eSign Act + UETA
Intent to sign, tamper-evident retention
74 3— —2026-07-20
Investment Advisers Act
Form ADV, Rule 204-2 books and records
52 21 —2026-07-22
State QI statutes
CA, NV, ID, CO, OR, WA — bonding, segregated escrow
31 11 —2026-06-12
CCPA / CPRA
DSAR, data inventory, retention schedule
31 —2 —2026-06-12
Securities Act / Reg D 506(c)
Marketplace accreditation gating
22 —— —2026-07-10
TCPA
SMS and voice consent ledger
11 —— —2026-06-12
IRS Pub 1075
Applies only if federal tax information is received from IRS systems
1— —— — Applicability undetermined
Counting rule. Several controls carry a split status — Active for the half that ships and Draft for the half that waits on a Vectr workflow. Those are counted by their leading status and the split is stated in the row itself, never averaged into a score. There is no compliance percentage on this page, because a percentage would let a failing statutory control disappear into a rounding.

Ledger states

The three states the ledger can be in besides populated. Each is designed, because an auditor meets them as often as the happy path.

Loading
Row-shaped skeletons, not a spinner. The table keeps its geometry so nothing jumps when the rows land, and the header row above stays readable throughout.
No results
Nothing matched — and that is a finding, not a blank
No disbursement.approved event exists for this exchange between Aug 12 and Aug 19. Either no fund movement was approved in the window, or the file is younger than it. Widen the dates before concluding the first.
Could not load
The ledger did not load. This is a read failure, not an empty log. Nothing has been deleted and nothing is missing — do not treat this screen as evidence of absence. request 6c31-b0a4 · audit_log_list · 2026-08-19 09:41 UTC
Build contract — audit log & compliance cadence
1 · This is a system of record, so it never summarises past its evidence. Every figure either resolves to a stored row an examiner can pull, or is rendered as absent. There is no compliance score and no percentage on this surface: a score lets one failing statutory control vanish into a rounding, and the whole point of the page is that it cannot.
2 · Filter scope is part of the result. GET /v1/audit-log accepts actor, exchange, action, from, to, cursor and limit. Outcome, resource type and free text are applied in the browser over the fetched page. Every control carries a query or page only marker and the count next to a page-only filter is never presented as a total. Adding a filter without adding its marker is a review rejection.
3 · The exchanger is never in a fund-movement approval path. disbursement.authorized is the exchanger's signed instruction and renders as Instruction — not an approval; it is not counted toward the approval quorum and is not a gate on the QI's decision. Release requires two authorized officers, and the approver is never the proposer — enforced at the API, at a DB check constraint, and shown here as the self_approval_blocked row. Any UI that reads a proposer's own submission as an approval, or that puts the exchanger in the approving position, is constructive receipt under Treas. Reg. §1.1031(k)-1(g)(6).
4 · Status is derived from evidence, never from one flag. A renewal that was filed is not a renewal that was granted — the Oregon row stays lapsed until the state's certificate is attached. A screening that ran once at counterparty add is not a rescreening cadence. A row written locally is not a durable row. Each of those is a separate stored fact, and the surface reads all of them before it picks a colour.
5 · An overdue statutory obligation is permanently alarming. It cannot be acknowledged, snoozed, dismissed, or aged into a neutral state, and it never renders green. The only thing that clears it is the evidence that satisfies it.
6 · Identity is the first gate, and it belongs to the person. kyc.completed is written from the provider's callback. No console role can mark an exchanger verified by proxy, and no “sign on behalf” affordance exists anywhere — the eSign Act and UETA require the signer's own intent, so the control is absent rather than permission-gated.
7 · Absence is rendered, not hidden. The six Not tracked cadence rows have no schema behind them and are listed precisely for that reason. Deleting them would make the register look complete and make the surface a liability. When a schema lands, the row changes status in place and keeps its identity.
8 · Integrity claims are split into enforced and not. Delete-refusal, fail-closed inserts and the absent UPDATE policy are shipped and shown green. The hash chain, the monotonic sequence, the service-role UPDATE guard and any alerting are not, and the verifier stays visibly disabled with the missing capability named. A greyed control that says why is honest; a page with no control reads as though verification already passed.
9 · Export is audited before it is produced. The audit row is written and forwarded first; if that write fails the export returns 500 and no file exists. Two live defects are drawn as defects: the audit-log CSV writes no audit row of its own, and it exports only the loaded page rather than the filtered result. Both must be fixed in the implementation, not designed around — an incomplete export an examiner believes is complete is worse than no export button.
10 · Every row carries its real action and deep-links to the section it concerns. A ledger row opens the file at Funds, Identification, Identity & AML or E-Sign — never a generic overview. A cadence row opens its licence, policy or queue. A row with genuinely nothing to open renders a disabled control that says so.
Fully tokenized against ../tokens.css — no raw hex and no inline colour outside token references; --ink-4 is used for icons, rules and disabled glyphs only, never body text. Light and dark are both designed. All names, identifiers, amounts and references are synthetic demo data.