Security and compliance posture

The mechanisms that actually exist, each named with the artefact that evidences it.

This page describes implemented and in-build controls. Where a control is in build we say so rather than implying coverage; where a driver is a mock we label it a mock. Wynk Systems holds no certification it does not name here.

The four load-bearing claims

Row-level security

Tenant isolation is enforced by the database, not by application code remembering to filter. Every tenant table carries FORCED row-level security and every read runs inside a tenant-scoped transaction, so a query issued without a tenant context returns nothing rather than everything.

Hash-chained audit

Audit and ledger records each commit a SHA-256 over their predecessor. History cannot be edited quietly: a rewrite breaks the chain at the exact record it touched, and an independent verifier recomputes from origin and raises a fork as a blocking alarm.

POPIA

Personal information is collected against a declared purpose and a retention clock, data subjects get self-service access and erasure, logs and URLs are free of personal identifiers, and a discharged erasure destroys the per-subject key.

Two-eyes dual control

Money-adjacent and override actions require a second, distinct operator. The requester cannot approve their own request, the pending state is visible in the interface, and the grant of authority is itself recorded — the UI never implies an override is one click.

Control register

Page 2 of 4 · 30 controls. Wide rows scroll inside the table, not the page.

Across all 4 pages: ✓ Live 27 · ◐ In build 3. In-build controls are not load-bearing yet and a risk assessment should treat them as absent.

Wynk Systems control register
AreaControlHow it is enforcedStatusEvidence
AuthorityNon-forgeable authority modelAuthority is proven server-side per request; a client cannot assert a role, and a reopen or override records who granted it.✓ LiveADR-A-020
AuthorityMoney moves through one executor or it does not compileThe capability token that authorises a posting is module-private; a value movement written outside the framework fails typechecking and a lint refuses the import.✓ LiveADR-S-0105
AuthorityFIDO2 hardware key mandatory for admin sessionsThe production admin portal fails closed: no admin session is minted on knowledge factors alone, and the assertion must be fresh and session-bound rather than a historical flag.◐ In buildADR-S-0080
CorrectnessIdempotent money submissionEvery money POST carries an idempotency key; a replay returns the original outcome marked already processed, never a second movement.✓ LiveADR-S-0019
CorrectnessInteger cents end to endAmounts are bigint minor units from the database to the rendered page. No floating-point money exists in the codebase.✓ LiveGate G-MONEY
CorrectnessLogin responses are byte-uniformUnknown, known, rate-limited and locked-out all produce the same response, proven by an invariant test rather than sampled per release — an enumeration oracle is a class, so it is locked as a class.✓ LiveE1.3.15
POPIAMinimisation and purpose limitationPersonal information is collected against a declared purpose and a retention clock; fields without a purpose are not collected.✓ LiveADR-S-0092
POPIAData-subject access and erasureSelf-service DSAR in the client portal produces a machine-readable export and drives an erasure workflow with legal-hold interlocks.✓ LiveADR-S-0094

What we do not claim

Independent reviewers get the evidence pack — chain attestation, control register, exception log and the sampling workfile — rather than a slide deck. ✓ Live means the mechanism is in this codebase and on the gate board today.