Role and organisation scope, step-up re-authentication for special-category records, break-glass with a recorded justification, a hash-chained audit re-verified when it’s read, and the toolkit and assessment-criteria evidence an assessor can take away.
An information governance lead doesn’t want a policy document. They want three things answered on screen, with the platform in front of them: who can reach this record, what has happened to it, and can you prove the record of what happened hasn’t been edited since. This is how commvita answers all three, and what an assessor can see for themselves.
A role decides what a person may do. Their organisation scope decides whose records they may do it to. The two are separate, and neither is inherited by accident: delegated scope and group membership carry an expiry, and an expired grant gives no access.
Every access and every change is written to the audit, and every authentication event is written to a separate account log with the source address, the country, the device and the result. Both are readable in the product by the people entitled to read them.
The account log is hash-chained, and the chain is recomputed over the whole log every time the log is opened. The page tells you the result. If a historic row had been altered, the verification would fail rather than the row simply looking normal.
Access is modelled as two independent things. The role is the capability. The organisation scope is the reach. A receptionist and a consultant in the same practice are separated by role; two consultants in different organisations are separated by scope. Getting one right doesn’t get you the other.
Every cell in that matrix is a decision somebody has to be able to defend. Sensitive diagnoses are policy-driven instead of a flat yes or no, which is the honest answer for a data class where the rule depends on the care relationship. A receptionist gets demographics and nothing else. A health care assistant reads, and doesn’t write. The matrix is served by the platform not typed into a slide, and it exports so that an assessor can take it away as evidence.
Underneath it, the scope rules matter as much as the roles. A user is attached to the organisations they work for. Cross-organisation reads need explicit permission instead of an accident of role. A team lead can inherit a colleague’s scope through a delegation, and that delegation expires. A user group grants scope and can never grant a role, so nobody gains capability by being added to a list.
Genomics, mental health, sexual health and safeguarding records are special category data under Article 9. Holding them behind the same login as an appointment list isn’t good enough, and two controls sit in front of them.
Before an Article 9 stream opens, the person re-enters their password and states why. The platform issues a short-lived elevation that downstream checks verify, and it expires on its own. The re-authentication itself is written to the audit with the reason given, so the elevation is evidence instead of a silent state.
Reaching a record outside normal scope requires a written justification before the record opens, not afterwards. The entry records who, which record, the justification and the time, and it’s flagged as break-glass so it can be counted. Frequent use raises an alert to the data protection officer instead of being absorbed.
Some records carry more than a role check. Child protection enquiries require dual authorisation and a confidential label, with the access logged against a mandatory justification. The control follows the record class, not the person’s seniority.
The design point behind all three: an emergency override that’s easy to use and impossible to hide is safer than one that’s hard to use. Clinicians will always need to reach a record they don’t normally hold. What matters is that reaching it costs a sentence of explanation and leaves a mark somebody reviews.
The audit log records every access and every mutation, with the actor, the action, the module, the resource and its identifier, the time, and the jurisdiction it happened in. It’s filterable by date, user, action and module, and it exports.
Two things in that screenshot are worth naming. The third row is a genomics access event, recorded because a special-category resource was reached, with the role and access level captured alongside it. And the strip at the bottom states the retention position: a minimum seven-year retention, every access and mutation recorded, tamper-evident. Those are the claims an assessor will test, so they’re on the screen the assessor is looking at.
The account log is separate and stricter. It records one row for every authentication event: sign-in, failure, second-factor challenge and sign-out, with the username, the source address including the forwarded chain, the country the login came from, the device and the result. It’s append-only. There’s no endpoint that updates or deletes a row, because the way to make a log trustworthy is to build no path that could edit it. Reading it’s restricted to administrators.
The green line is the control. Each row is bound by a hash to the row before it, and the chain is recomputed across the whole log every single time the log is read. The page reports the result of that recomputation, not a stored flag saying it was fine once. That’s the difference between a log that claims to be tamper-evident and one that demonstrates it to the person reading it, in the second they read it.
Three controls that get less attention than they deserve, because none of them is visible until something goes wrong.
A session is bounded in time and ends on its own. Signing out revokes that session’s credential for whatever remained of its life, and the revocation is checked on every subsequent request, not trusted to the browser having thrown the credential away. Elevation for special-category data is separate, shorter, and expires by itself.
Integration credentials are held on the server. What a configuration screen receives is whether a credential is present, not the credential. Where a secret has to be shown at all it’s a last-four hint. There’s no screen and no response in the platform that returns a stored secret to a browser.
A data export is encrypted with a fresh content key wrapped to the recipient’s own public key. commvita never holds the private half, so the artefact isn’t readable here either. If no recipient key is supplied the platform refuses to produce the export instead of falling back to plaintext or to a key it holds itself.
Controls stop things. They don’t tell you what is being attempted. The Security Console is the operational view: current threat level, active sessions and how many carry special-category scope, failed logins and lockouts, Article 9 access events, revoked credentials, and the platform’s position against the toolkit criteria.
The console carries its own amber banner saying it’s seeded demonstration data, and that’s accurate: this surface is illustrative today. What it demonstrates is the shape of the monitoring, and the shape is the part that’s specific to healthcare. A generic security tool flags a bulk download. It can’t tell you whether the person doing it’s on the care team.
Read the clinical context line on each card. Bulk access to mental health records by someone not on that care team is a finding. The same access by the clinician who is on the team is a Tuesday. Off-hours access matters more when the on-call rota says nobody should be working. An overseas login matters more when the staff record says the person is on leave. Every one of those cross-references is a fact the platform already holds because it also runs the rota, the care team and the leave. That’s the argument for putting the monitoring inside the clinical system instead of shipping logs to something that has never heard of a care team.
Assurance in this market runs on two artefacts: the Data Security and Protection Toolkit, and the Digital Technology Assessment Criteria. Both are held in the platform as evidence with a status, not as a claim in a brochure.
The toolkit position is derived from the mandatory items for the organisation’s own category, and it distinguishes between an item that hasn’t been met and an item on which nothing has been recorded. Those are different facts and the platform reports them differently, because scoring an empty toolkit as a failure is a finding derived from no data. The assessment criteria are held per domain, each with its standard, whether it’s mandatory, its weight, the evidence text, who assessed it and when, and a weighted position over the mandatory set. The access matrix exports as evidence for the access-control criteria, and the account log answers the access-monitoring ones.
Now the ceiling, plainly. The audit, the account log with its chain verification, the role and scope model with its exports, the step-up re-authentication, the break-glass record, sign-out revocation, the server-side handling of credentials, the encrypted export and the toolkit and criteria evidence are all API-backed and working today. The Security Console and its anomaly stream are a demonstrated surface on seeded data, and the page says so on itself. The platform also holds an internal security architecture view with its threat model and a control-by-control posture including the gaps it’s closing. I haven’t screenshotted that view here and I won’t publish its detail on a public page. It goes to a prospective customer in a due diligence pack, with the gaps in it, because a supplier who shows you only the closed controls is telling you less than nothing.
| Capability | Route | Model / API | Status |
|---|---|---|---|
| Role by data domain, with export | /rbac-matrix · /rbac | API /rbac/matrix · /rbac/export · policy scenarios | ● Live |
| Organisation scope, delegations and groups with expiry | /rbac | API /rbac/delegations · scope-only groups | ● Live |
| Step-up re-authentication for Article 9 records | Article 9 modules | Password challenge, short-lived elevation, event written to the audit | ● Live |
| Second factor on the account | /user-management | Time-based one-time code, per user, challenge on sign-in | ● Live |
| Break-glass with recorded justification | /ig-hub | API /governance/audit · break-glass flag · DPO alerting | ● Live |
| Immutable audit of access and mutation | /audit | API /audit · filters · export · seven-year retention | ● Live |
| Account login audit, chain re-verified on read | /login-audit | Append-only, hash-chained, no update or delete path; administrator only | ● Live |
| Session expiry and sign-out revocation | Platform-wide | Bounded session, revocation checked on each request | ● Live |
| Credentials held server-side | Connector settings | Presence returned to the browser, never the secret; last-four hint only | ● Live |
| Encrypted export to the recipient’s key | Export pipeline | Content key wrapped to the recipient; refuses without one | ● Live |
| Toolkit position and assertions | /ig-hub | API /ig/dspt/summary · assertions · category profile | ● Live |
| Assessment criteria evidence pack | /dtac | API /dtac/summary · per-domain status, weight, assessor, date | ● Live |
| Security operations console and anomaly stream | /security-console | In-page seeded content; carries its own seeded-data banner | ☉ Demonstrated |
| Threat model and control posture view | /security-architecture | Internal assurance view; detail not published publicly | ☉ Demonstrated |