Hierarchical condition categories, risk adjustment factor scores and the annual recapture cycle, built around clinical accuracy and defensibility. The platform finds conditions the record already evidences and the current year’s codes are missing, shows the evidence beside the suggestion, and hands the decision to a clinician. Nothing is coded automatically.
A capitated payment has to reflect how sick the population is. If it doesn’t, the organisation that takes the sickest patients loses money for taking them, and the organisation that avoids them profits. Risk adjustment is the mechanism that stops that. It only works if the coded record is a true picture of the patient.
So the job is documentation quality. A patient with stage 4 chronic kidney disease, a documented eGFR of 22 and a nephrology follow-up has stage 4 chronic kidney disease whether or not anybody put N18.4 on a claim this year. If nobody did, the payment is set as though the disease is absent. The clinical record and the coded record have come apart, and the coded record is the one the money runs on.
I built these surfaces to close that distance. They find conditions the record already evidences and the current year’s codes are missing, put the evidence next to the suggestion, and hand it to a clinician. The clinician decides. Nothing is coded by the platform. There’s a wider tour of the US module pack in Supporting the US health system; this one stays in risk adjustment.
Wants the coded record to match the clinical record, and wants the work of getting there to land in the clinician’s day at a moment that makes sense. Wants to be able to say no to a suggestion and have that stick.
Wants to know, for any code added through this route, who added it, what they saw when they added it, what note they wrote, and what the platform suggested before they touched it. Wants dismissals kept rather than deleted.
Wants a list of chronic conditions coded last year and not yet this year, ranked and dated, in time to schedule an encounter before the year closes.
A hierarchical condition category groups diagnosis codes that cost about the same to treat. Each category carries a weight. The weights that apply to a patient are added to a demographic base, and the total is that patient’s risk adjustment factor score. A score of 1.0 is the national average.
Two properties of the model matter more than the arithmetic. The first is the hierarchy. Categories sit in families, and within a family only the most severe one scores, so coding a diabetic patient’s complications properly drops the milder diabetes category out. You don’t get paid twice for the same organ. The second is that the model resets. Chronic conditions don’t carry forward. A condition has to be documented in a face-to-face encounter in the payment year to count in the payment year, every year, for as long as the patient has it.
The surfaces here run against the CMS-HCC version 28 model, for shared savings and Medicare Advantage populations. The gap worklist shows the category, the category weight and the evidence. The trend line puts the panel’s score against the 1.0 average month by month.
The RAF opportunity tile is the sum of the category weights on the open gaps. It measures how much of the panel’s documented illness is missing from the codes. It isn’t a target and nobody is measured on it. If a clinician works the list and dismisses every row, the tile goes to zero and the panel is correctly coded.
The gap worklist is the core of it. Each row is a condition with support somewhere in the patient’s record and no current-year code. The row carries the evidence that raised it, in the same line of the table as the suggestion, so nobody has to take the suggestion on trust.
Read the evidence column and you can see what kind of thing this is. “eGFR 22 ml/min, CKD stage 4 not documented this year.” “GOLD Stage III spirometry 2025, no ICD-10 in current year.” “Carotid Doppler 60% stenosis, I73.9 not documented.” Each one is a finding already in the record that nobody has coded this year. That’s the whole scope of what this looks for.
Look at the sixth row. HCC108, peripheral arterial disease, evidence “PAD query, vascular review inconclusive”, status Dismissed. That’s the system working. The evidence didn’t support the code, a clinician said so, and the record of the dismissal stays on the row. Dismissals are kept. They’re part of the defence if anyone asks later why a category the panel might have claimed was left alone.
Coding a row opens a small form on the row itself. The clinician confirms or changes the ICD-10 code and writes the encounter note that supports it. Both are stored against the gap with the username of the person who did it. There’s no bulk accept. There’s no button that codes the panel.
The RAF Recapture surface goes a step further and shows the extracted note passage alongside the documentation language the code would need. This is where a clinician can see, side by side, what the note said and what a coder would need it to say.
The dollar figure on that panel and on the recapture tiles is illustrative demonstration content. It exists because a coding lead asks what a documentation gap is worth, and the honest answer is a number. It’s a consequence of coding the panel accurately. It isn’t what the work is for, and the platform doesn’t rank a clinician’s queue by it.
Because the model resets each year, a condition coded in January 2025 and not recoded in 2026 simply stops counting at the next reconciliation. The patient still has it. The payment stops reflecting it. This is the failure mode that quietly costs an accountable care organisation the most, and it’s entirely a calendar problem.
The decay list is sorted by when the condition was last coded, so it reads as a work queue with a deadline instead of a report. The right response to a row on it’s usually an appointment. An annual wellness visit is the natural place to review a chronic problem list, examine the patient and document what is still true, and the platform’s wellness visit and chronic care management surfaces are where that encounter gets recorded.
Be clear what this list is. It prompts you to see a patient and assess them. It doesn’t prompt you to re-enter last year’s codes. A condition that has resolved should drop off, and the encounter is how you find out which is which.
A single score tells you little. Movement tells you a lot. The registry holds last period’s score and this period’s side by side for every attributed patient, with the direction of travel and the categories currently uncoded.
The pattern to look for is a score falling while the patient gets no better. Two rows above do that, and both carry uncoded categories. It’s a documentation problem presenting as a payment problem, visible months before a reconciliation would surface it.
The undercoding view turns the same data into cards, one per patient, listing the uncoded categories by name and offering a Document HCC action instead of a code-it action. The wording is chosen on purpose. What is missing is the documentation, and the code follows it.
A clinician can attach a note to any patient’s risk record, which is where a “reviewed, condition resolved, do not recapture” belongs. Tier and payer filters run on the server, so a panel can be cut to one contract before anyone works it.
If a payer or an auditor asks how a code got onto a claim, the answer has to be a record instead of a recollection. Everything this route can do to a code is written down.
Where a model scores a patient anywhere in the platform, that model sits on a governance register with its version, the dataset it was trained against, its area under the curve, sensitivity, specificity, operating threshold, retrain due date, current drift against an alert threshold, and a named clinical sign-off with a date. An unsigned model is counted and shown as unsigned.
| Capability | Route | Model / API | Status |
|---|---|---|---|
| HCC gap worklist with evidence | /hcc-risk-coding | API GET /hcc/gaps · /hcc/summary · CMS-HCC v28 | ● Live |
| Code a gap (ICD-10 plus encounter note, coder recorded) | /hcc-risk-coding | API POST /hcc/gaps/{id}/code | ● Live |
| Dismiss a gap (outcome retained) | /hcc-risk-coding | API POST /hcc/gaps/{id}/dismiss | ● Live |
| Panel RAF trend against the 1.0 average | /hcc-risk-coding | API GET /hcc/raf-trend · 12 months | ● Live |
| Patient registry and score movement | /raf-score-monitor | API GET /raf/patients · /raf/summary · tier and payer filters | ● Live |
| Undercoding alerts per patient | /raf-score-monitor | API GET /raf/undercoding-alerts | ● Live |
| Clinical note on a risk record | /raf-score-monitor | API POST /raf/patients/{id}/add-note | ● Live |
| Model governance register and sign-off | /predictive-analytics | API /analytics/model-governance · version, metrics, drift, named sign-off | ● Live |
| Note mining queue and coding queue | /raf-recapture | Page holds seeded content; /raf-recapture/summary returns fixed figures | ☉ Demonstrated |
| Provider coding performance | /raf-recapture | Seeded panel · expected against actual average score by provider | ☉ Demonstrated |
| Decay monitor and category catalogue | /raf-recapture | Seeded panels · documentation requirements per category | ☉ Demonstrated |