Repository navigation
Replies: 7 comments
Approaches
Recommendation: 1 as the hero view per persona, with 2's severity list as the left panel, and today's explorer kept as the "open in graph" drill-down from any node. Whichever wins, the derived state is the real work: 80 percent of a persona view is deciding what is overdue, expired, untrusted or relevant. That logic belongs in the API ( |
Frameworks for a modern, animated, 3D view
Animation and transitions: the graph library's own camera tween for focus, GSAP or react-spring for panel and layer transitions, and Platform constraints on ehds.mabu.red that any choice has to live with: the nonce CSP in |
Four prototypes, liveIndex: https://ehds.mabu.red/poc/persona-3d/ (also on GitHub Pages under Each view is a short stack of labelled layer discs in the persona's words. The force layout runs only in the plane, so the layers stay readable. Red halos pulse for "act now" or a violation, amber for pending or expiring, green for in order, blue for information. Particles move along a link when data actually flows. The left panel lists the same signals as text, sorted by severity, each citing the article of Regulation (EU) 2025/327 it rests on; a click flies the camera to the node; the selected panel deep-links to the live page that owns the record. Patient https://ehds.mabu.red/poc/persona-3d/patient.html Researcher (PharmaCo Research AG) https://ehds.mabu.red/poc/persona-3d/researcher.html Health data access body (MedReg DE) https://ehds.mabu.red/poc/persona-3d/hdab.html Hospital / data holder (AlphaKlinik Berlin) https://ehds.mabu.red/poc/persona-3d/hospital.html What building them taught us
|
Update: a parameter opens into its time seriesIn the patient prototype every parameter node (HbA1c, fasting glucose, LDL, total cholesterol, systolic and diastolic pressure, BMI, eGFR) now carries its measurements over time.
Data: a fictional FHIR R4 Observation bundle for patient P1 ( Live: https://ehds.mabu.red/poc/persona-3d/patient.html (click the red "HbA1c 7.6 %" node, or the HbA1c line in the list). Merged in #268 and #269. Open point for the API: this needs |
Update: time series, trend and description on all four viewsWhat the patient view got for lab values now works for every persona through one engine helper ( Researcher https://ehds.mabu.red/poc/persona-3d/researcher.html Health data access body https://ehds.mabu.red/poc/persona-3d/hdab.html Hospital / data holder https://ehds.mabu.red/poc/persona-3d/hospital.html Data: fictional monthly figures under What this asks of the API: per-entity monthly aggregates from the access log ( |
|
Implementation issue opened: #271. It carries the decisions on the five questions above (add M0 is merged (#272) and applied on Azure: the graph now holds the data the four views need and the relations between the personas. Anna Müller (P1) treated at AlphaKlinik Berlin with 48 LOINC-coded measurements and their reference ranges, her consents to studies conducted by PharmaCo, IRS and MedReg with quarterly enrolment, 121 access events over twelve months (PharmaCo after credential expiry, Limburg without a contract, IRS refused and still attempting), and the quality label's quarterly assessments. The derivations of the prototype engine live in |
|
Shipped. The four views are product pages now: https://ehds.mabu.red/overview (persona from the role, |





Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
The problem: one graph, four people, no answer
/graphrenders the same force-directed hairball for every role. A gold "purpose" node sits in the middle, nodes are placed on rings by their Neo4j label, and everything the persona subgraph contains is drawn at equal weight. The page answers "what is in the database around you", never the question the person opened it with. Below, per persona: what they need to see, what the view shows today, and why that fails.1. Patient (Maria Schmidt,
?persona=patient)What a patient needs in one view: the handful of parameters that put them at risk for preventable disease (blood pressure, LDL, HbA1c, BMI, and the diagnoses behind them), what they should do next (the SPE recommendations and study findings, with a priority), and who is using their data under which consent, with a way to withdraw.
What the view shows: 85 nodes and 166 links. A ring of thirty diagnoses drawn at the same size whether they are "Acute viral pharyngitis" or "Diabetes mellitus type 2". Twenty other patients by name (the fixture lists Anisha16 Grayce293, Brett333 Waylon572 and so on) and fifteen OMOP research subjects, none of which are hers. Edge labels like
FROM_DATASETrepeated eight times on top of each other,MAPPED_TO,GRANTS_ACCESS_TO. The legend explains layers ("Research Anonymization", "Medical Codes"), not her situation.Why it fails: there is no state and no severity. Nothing says which value is out of range, which recommendation is high priority, which consent is active. The risk scores that the profile API already returns (diabetes 0.65 high, cardiovascular 0.42 moderate) do not appear at all. Showing other patients' names in a patient's own view is, on top of that, the wrong thing to show under Art. 3 and Art. 8, even with synthetic data.
2. Researcher (Research Analyst,
?persona=researcher)What a researcher needs in one view: their current researches with their state (permit valid until, application pending since, request answered or not, transfer done), the datasets they are allowed to use today, and the other datasets and studies near their own that they are missing, with a reason why they are relevant.
What the view shows: 46 nodes and 44 links, almost all of them OMOP concept mappings: "Hypertension (OMOP)" coded as
314529007, "Medication review" coded as160904001, "T2D (OMOP)" mapped to a SNOMED concept, dataset dependenciesDEPENDS_ONandCONFORMS_TO. The permit, the pending application, the open statistical request, the expired purpose credential and the two completed transfers that exist for this persona in the fixtures are not in the picture. Other studies do not exist as a concept in the view.Why it fails: the graph is organised by data model layer (clinical, analytics, standard codes) when the researcher's question is organised by state (allowed, pending, blocked, missing). Relevance to their own study is never computed, so "what else is out there" cannot be shown.
3. Health data access body (
?persona=hdab)What the body needs in one view: the operations that are non-compliant right now: a transfer without a contract, a contract signed before the permit, an access attempt without a permit, a user whose credential expired, a permit about to lapse; and, turned on itself, its own decisions past their statutory deadline.
What the view shows: 34 nodes and 51 links: thirteen verifiable credentials, nine participants, three contracts, three approvals, three applications, one policy, all drawn the same way.
ISSUED_TOandHOLDS_CREDENTIALthirteen times each.Why it fails: an authority view without state is a directory. Nothing is red. The compliance matrix, permit register and audit log that the platform already serves contain, as of the fixture date, thirteen findings (two overdue decisions, one transfer without contract, one refused applicant still attempting access, one credential expired with accesses logged after it, two quality labels expired, one permit expiring). None of them reaches the graph.
4. Hospital / data holder (
?persona=hospital)What the holder needs in one view: which data consumers are trusted (credentials presented, permit issued, contract signed, access log consistent) and which are not, which contracts are missing for data that is already flowing, and whether the holder's own duties are in order: dataset descriptions (Art. 77), the quality label (Art. 78), the access log (Art. 73(1)(e)).
What the view shows: 59 nodes and 91 links: nine datasets, twelve eEHRxF profiles, five distributions, thirteen credentials, nine participants, contracts and approvals. A well-formed catalogue picture.
Why it fails: trust is a derived property, not a label, and the view derives nothing. A consumer with no credential in the wallet, a consumer with an expired purpose credential, and a consumer whose permit was refused but who is still attempting transfers all look identical to the one that is fully in order. The holder's own expired quality label is a node like any other.
What the four have in common
OMOPConditionOccurrence,FROM_DATASET,MAPPED_TOare shown to a patient.What the platform already has, and what is missing
The mock fixtures under
ui/public/mock/mirror the live API shapes, so this is what a persona view could be built from today.patient_profile(risk scores with factors, 8 conditions, 4 medications),patient_insights(2 recommendations with priority, 2 findings with evidence level),patient_research(3 programmes, 2 consents with trust centre DID)permits(7 entries with decision due dates),requests(Art. 69),analytics(permit and cohort counts),admin_audit(negotiations, transfers, access log),credentials,catalog(21 entries with consumers),patient_research(other studies)compliancematrix (application, approval, contract per consumer),permits,requests,admin_audit,credentialscatalog,compliance,credentials(quality label with conformance, completeness, timeliness),admin_auditfiltered by provider DIDTwo fixture defects to fix on the way: several
ehdsArticlefields still carry proposal numbers (Art. 46, 50, 51, seedocs/ehds-article-numbering.md), and expired credentials keepstatus: "active", so anything that trusts the flag is wrong.What Regulation (EU) 2025/327 requires per persona (adopted numbering)
Trust, in EHDS terms, is a chain, not a flag: DCP credentials (membership, participant, purpose), an Art. 68 permit, a DSP contract, and an access log that agrees with all three. A persona view has to compute it that way.
Questions to decide here
/graphper persona with a state-first view, or add it as/overviewand keep the explorer for drill-down?ComplianceFindingnode type), so it is queryable and auditable rather than computed in the browser?docs/ehds-article-numbering.mdsays?Proposed approaches, a framework comparison and four working prototypes are in the comments below.
Related: #252 (webinar), #186 (Klarbefund lab values), #19 (NLQ for researchers), #13 (GraphRAG), ADR-010 (WCAG), ADR-019.
All reactions