Appearance
Clinician credentialing
Credentialing a clinician before their first shift: one flow collects the licence, its status and expiry and the malpractice history, a screening step checks an exclusion list, and files with findings go to a credentialing committee. Pack: examples/policies/clinician-credentialing/.
A pattern for expressing a healthcare credentialing policy, not compliance guidance: the thresholds, lists and fields are placeholders chosen to make the example run; a real policy comes from the business's own rules. The screen step needs mock-sanctions installed (Connect › Apps; no configuration or secrets).
The decision it automates
Whether to credential the clinician, refer the file to the committee, or decline it, when the file is submitted.
Data expected
- The clinician as a subject (kind
user); nothing is read from its data. - The flow's answers under
submission:fullName,licenceNumber,licenceStatus,licenceExpiry(YYYY-MM-DD),malpracticeClaimsand an optional licence copy. - The
screenstep's answer underexclusions(hit,matches).
Steps and rules
| Step | Type | Why |
|---|---|---|
collect | wait_for_collection | The credentialing flow. |
screen | call_app | mock-sanctions screen on submission.fullName, standing in for an exclusion-list app you build against your sources. |
rules | evaluate_rules | The credentialing rule set under max_severity. |
route | branch | rules.outcome == manual_review opens a case. |
review | create_case | credentialing_committee, 7-day SLA. |
decide | emit_decision | From the rules, or the reviewer's decision. |
The rule set credentialing (useCase: onboarding) uses max_severity: a failed block rule rejects, a failed warn rule sends the run to review, and the weights add up to the score.
| Rule | Type | Severity, weight | Fails when |
|---|---|---|---|
cred_not_excluded | comparison | block, 100 | the screen found a match |
cred_licence_active | comparison | block, 100 | licenceStatus is expired |
cred_licence_restricted | comparison | warn, 30 | licenceStatus is restricted |
cred_expiry_soon | expression | warn, 20 | licenceExpiry is less than 90 days away |
cred_malpractice | score threshold | warn, 30 | malpracticeClaims is above 1 |
What a reviewer sees
A credentialing_committee case with the file, the licence copy and each rule's result; the committee's notes and attachments become part of the record.
How to adapt it
Replace the screening step with your exclusion-list app and add a licence lookup app (both built with the SDK) so status and expiry come from the source rather than the form. Your scheduler starts the same workflow again before each credential expires.
Run it
bash
pnpm policy:import examples/policies/clinician-credentialing --publishThe fixture submits an active licence with a restriction that expires in 2030 and no malpractice claims: the screen finds no match, the restriction rule fails, a credentialing_committee case opens, the check approves it and the run completes with a manual approve.