play icon for videos
← Academy
Analyze · Safeguarding scan

How to Identify Safeguarding Concerns in Case Notes

AI should flag safeguarding risk and stop — not decide. This shows how to scan case notes in Sopact Sense for harm, crisis, and disclosure, quote the evidence, and route every flag to a human.

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> @keyframes pulseDot{0%,100%{opacity:1}50%{opacity:.35}} *{box-sizing:border-box} body{margin:0;font-family:'Hanken Grotesk',-apple-system,BlinkMacSystemFont,sans-serif;background:#EEF2F9;padding:26px;display:flex;justify-content:center} .card{width:600px;max-width:100%;background:#FFFFFF;border:1px solid #E3E9F4;border-radius:20px;box-shadow:0 26px 64px -32px rgba(15,30,70,.34),0 2px 4px rgba(15,30,70,.05);overflow:hidden} .hdr{display:flex;align-items:center;gap:11px;padding:16px 20px;border-bottom:1px solid #EEF1F7;background:#F5F8FE} .hdr .ic{display:inline-flex;width:30px;height:30px;align-items:center;justify-content:center;border:2px solid #155DFC;border-radius:50%;color:#155DFC;font-size:15px;font-weight:800;flex-shrink:0} .hdr .t{min-width:0} .hdr .t .n{font-weight:800;font-size:14.5px;color:#0F172A;letter-spacing:-.2px} .hdr .t .s{font-size:12px;color:#64748B} .hdr .pill{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:700;color:#155DFC;background:#E6EEFF;padding:5px 10px;border-radius:20px;white-space:nowrap} .hdr .pill .d{width:6px;height:6px;border-radius:50%;background:#155DFC;animation:pulseDot 2s infinite} .tabs{display:flex;gap:0;padding:12px 16px 0;background:#F5F8FE} .tab{flex:1;display:flex;flex-direction:column;align-items:center;gap:5px;cursor:pointer;font-family:inherit;font-size:11.5px;font-weight:700;color:#64748B;background:transparent;border:none;border-bottom:2px solid transparent;padding:8px 4px 10px} .tab.on{font-weight:800;color:#155DFC;border-bottom-color:#155DFC} .tab .num{display:inline-flex;width:20px;height:20px;align-items:center;justify-content:center;border-radius:50%;font-size:11px;font-weight:800;color:#64748B;background:#EEF1F7} .tab.on .num{color:#fff;background:#155DFC} .divider{height:1px;background:#EEF1F7} .body{padding:20px} .eyebrow{font-size:10.5px;font-weight:800;letter-spacing:1.2px;text-transform:uppercase;color:#155DFC;margin-bottom:5px} .eyebrow.g{color:#15884F} .headline{font-family:'Inter',Georgia,serif;font-size:18.5px;font-weight:600;line-height:1.25;color:#0F172A;margin-bottom:12px} .lede{font-size:12.5px;line-height:1.55;color:#475569;margin:0 0 14px} .rows{display:flex;flex-direction:column;gap:8px;margin-bottom:14px} .row{display:flex;align-items:center;gap:11px;background:#F5F8FE;border:1px solid #EEF1F7;border-radius:11px;padding:11px 13px} .row .emoji{font-size:17px} .row .rt{flex:1;min-width:0} .row .rt .n{font-size:13px;font-weight:700;color:#0F172A} .row .rt .s{font-size:12px;color:#64748B} .pillsm{font-size:11px;font-weight:800;color:#155DFC;background:#E6EEFF;padding:4px 9px;border-radius:6px;flex-shrink:0} .pillsm.gray{font-weight:700;color:#64748B;background:#EEF1F7} /* chain / timeline */ .chainwrap{position:relative;padding-left:26px} .chainline{position:absolute;left:8px;top:8px;bottom:8px;width:2px;background:#E3E9F4} .cnode{position:relative;margin-bottom:14px} .cdot{position:absolute;left:-26px;top:4px;width:16px;height:16px;border-radius:50%;background:#fff;border:3px solid #94A3B8} .clabel{font-size:9.5px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:#64748B;margin-bottom:4px} .cbox{background:#F5F8FE;border:1px solid #EEF1F7;border-radius:11px;padding:10px 12px;font-size:12px;line-height:1.5;color:#334155} .cbox.graded{display:flex;align-items:flex-start;gap:9px;border-left-width:3px;border-left-style:solid} .cnote{margin:0 0 14px 4px;font-size:11px;line-height:1.5} .cnote .plus{display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;background:#155DFC;color:#fff;border-radius:4px;font-size:10px;font-weight:800;flex-shrink:0;margin-right:6px} .csummary{display:flex;align-items:center;gap:12px;background:#0A1B3D;border-radius:13px;padding:11px 15px;margin-top:4px} .csummary .t{flex:1;font-size:11.5px;color:#CBD8F5} .csummary .t b{color:#F1F5FF} /* matrix */ .mxwrap{border:1px solid #EEF1F7;border-radius:12px;overflow:hidden;margin-bottom:10px} .mxhead{display:grid;grid-template-columns:118px 1fr 1fr;background:#F5F8FE;border-bottom:1px solid #EEF1F7} .mxhead div{font-size:9px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:#64748B;padding:7px 9px} .mxrow{display:grid;grid-template-columns:118px 1fr 1fr;border-bottom:1px solid #EEF1F7} .mxrow:last-child{border-bottom:none} .mxrow>div{padding:9px;font-size:11.5px;line-height:1.4;color:#334155;display:flex;align-items:center;flex-wrap:wrap;gap:5px} .mxrow .mxlabel{font-weight:700;color:#0F172A;background:#FAFBFE} .mxchip{font-size:9px;font-weight:800;letter-spacing:.3px;text-transform:uppercase;padding:3px 6px;border-radius:5px;white-space:nowrap} .promptwrap{padding:0 20px 18px} .promptlbl{font-size:10px;font-weight:800;letter-spacing:1px;text-transform:uppercase;color:#94A3B8;margin-bottom:7px} .prompt{display:flex;align-items:flex-start;gap:9px;font-family:ui-monospace,'SF Mono',Menlo,monospace;font-size:11px;line-height:1.5;color:#1E293B;background:#F5F8FE;border:1px solid #EEF1F7;border-left:3px solid #155DFC;border-radius:9px;padding:11px 12px} .prompt .car{color:#155DFC;font-weight:800;flex-shrink:0} .flagrow{display:flex;align-items:flex-start;gap:10px;background:#F5F8FE;border:1px solid #EEF1F7;border-radius:11px;padding:10px 12px;border-left-width:3px;border-left-style:solid;margin-bottom:8px} .flagtag{font-size:9.5px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;padding:4px 8px;border-radius:5px;white-space:nowrap;flex-shrink:0} .flagtxt{font-size:12px;line-height:1.45;color:#334155} .lp{display:flex;align-items:center;gap:12px;background:#0A1B3D;border-radius:13px;padding:14px 16px;margin-top:6px} .lp .ic{display:inline-flex;width:34px;height:34px;align-items:center;justify-content:center;background:#14295C;border:1px solid #26407A;border-radius:9px;color:#7FA8FF;font-size:16px;flex-shrink:0} .lp .rt{flex:1;min-width:0} .lp .rt .n{font-size:13px;font-weight:800;color:#F1F5FF} .lp .rt .s{font-size:11.5px;color:#9DB2D9} .lp .open{font-size:11px;font-weight:800;color:#0A1B3D;background:#7FA8FF;padding:6px 11px;border-radius:7px;white-space:nowrap} </style> </head> <body> <div class="card"> <div class="hdr"> <span class="ic">&#128680;</span> <div class="t"> <div class="n">Case-management program (synthetic) · Safeguarding Flag</div> <div class="s">DEMO-08 · Sopact Sense · Case Management</div> </div> <span class="pill"><span class="d"></span>Flagging</span> </div> <div class="tabs" id="tabs"></div> <div class="divider"></div> <div class="body" id="body"></div> <div class="promptwrap"> <div class="promptlbl">The prompt behind this step</div> <div class="prompt"><span class="car">&gt;</span><span id="promptTxt"></span></div> </div> </div> <script> (function(){ var TABS = ["Setup", "Flag", "Fix", "Report"]; var CONTENT = [{"eyebrow": "Step 1 · Load the Decision Brief", "headline": "AI should flag risk and stop — not decide.", "lede": "The Assistant works only from the Caseload dataset (DEMO-08) — a synthetic case-management program.", "prompt": "You are the Sopact Sense Assistant working over the [DEMO] dataset (clean data + persistent contact IDs). Load my Decision Brief (decision, audience, outcomes, indicators, evidence standard) first, then wait for my task."}, {"eyebrow": "Step 2 · Scan the case note for risk indicators", "headline": "Quote it, rate urgency, recommend human review.", "lede": "Harm, crisis, and disclosure language get quoted and graded <strong style=\"color:#15884F\">green</strong>, <strong style=\"color:#C9820A\">amber</strong>, <strong style=\"color:#C63E2B\">red</strong> — no verdict is issued.", "prompt": "Scan the case note for risk indicators ([INDICATORS]: harm, crisis, disclosure). Quote, rate urgency, set recommend_human_review=true. No verdict. Grade green/amber/red."}, {"eyebrow": "Step 3 · One-fix follow-up", "headline": "Right-size the response.", "lede": "The disclosure sits at AMBER — needs a human, not an AI verdict. The Assistant names the single data point that moves it to green.", "prompt": "Take the lowest-graded element above and fix it using only what the program could realistically measure. Show the before → after grade and the single indicator/edit that moves it to green."}, {"eyebrow": "Step 4 · Missing & incomplete report", "headline": "Does this note need escalation? Yes — urgent, route to human review.", "lede": "Every amber or red item becomes one named ask — the report leads with the decision it informs.", "prompt": "Create a 'missing & incomplete' report from this analysis in Sopact branding [or paste your website URL / brand guideline to apply your own]. List every element graded amber or red, what is missing, and the one input that fixes each. Lead with the decision this report informs."}]; var BODIES = { setup: "<div class=\"row\"><span class=\"emoji\">&#128221;</span><div class=\"rt\"><div class=\"n\">Decision Brief</div><div class=\"s\">Decision, audience, outcomes, indicators, evidence standard loaded first</div></div><span class=\"pillsm\">Pasted</span></div><div class=\"row\"><span class=\"emoji\">&#128203;</span><div class=\"rt\"><div class=\"n\">Five elements</div><div class=\"s\">Dataset · scan for risk · quote + urgency · recommend human review · grade G/A/R</div></div><span class=\"pillsm gray\">Structure</span></div><div class=\"row\"><span class=\"emoji\">&#128274;</span><div class=\"rt\"><div class=\"n\">No verdict rule</div><div class=\"s\">AI flags and recommends review; a human decides</div></div><span class=\"pillsm gray\">Required</span></div>", build: "<div class=\"mxwrap\"><div class=\"mxhead\"><div></div><div>Quote</div><div>Urgency</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Disclosure</div><div>&quot;partner gets angry&quot;</div><div>follow-up<span class=\"mxchip\" style=\"background:#C9820A;color:#fff\">AMBER</span></div></div><div class=\"mxrow\"><div class=\"mxlabel\">Children present</div><div>noted</div><div>urgent<span class=\"mxchip\" style=\"background:#C63E2B;color:#fff\">RED</span></div></div><div class=\"mxrow\"><div class=\"mxlabel\">Action</div><div>recommend_human_review = true<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>flag, not verdict</div></div></div>", fix: "<div class=\"mxwrap\"><div class=\"mxhead\"><div></div><div>Quote</div><div>Urgency</div></div><div class=\"mxrow\"><div class=\"mxlabel\">Disclosure</div><div>&quot;partner gets angry&quot;</div><div>follow-up<span class=\"mxchip\" style=\"background:#C9820A;color:#fff\">AMBER</span></div></div><div class=\"mxrow\"><div class=\"mxlabel\">Children present</div><div>noted</div><div>Route to a supervisor within 24h<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div></div><div class=\"mxrow\"><div class=\"mxlabel\">Action</div><div>recommend_human_review = true<span class=\"mxchip\" style=\"background:#15884F;color:#fff\">GREEN</span></div><div>flag, not verdict</div></div></div><div class=\"cnote\" style=\"color:#15884F;margin-left:0\"><span class=\"plus\">+</span><strong>Fix applied:</strong> Route to a supervisor within 24h — moves the disclosure from AMBER (needs a human, not an AI verdict) to GREEN (escalated to human).</div>", reportFlags: "<div class=\"flagrow\" style=\"border-left-color:#C9820A\"><span class=\"flagtag\" style=\"color:#C9820A;background:#FBF0DA\">AMBER</span><div class=\"flagtxt\">Disclosure language: ambiguous but concerning. Fix: supervisor reviews within 24h.</div></div><div class=\"flagrow\" style=\"border-left-color:#C63E2B\"><span class=\"flagtag\" style=\"color:#C63E2B;background:#FCE9E7\">RED</span><div class=\"flagtxt\">Children present: raises urgency. Fix: follow safeguarding escalation protocol.</div></div>", lpTitle: "Missing & incomplete report · shareable link", lpSub: "Decision-first · Sopact branding · Case-management program (synthetic) · Safeguarding Flag", summaryBefore: "Grade: 1 green &middot; 1 amber &middot; 1 red. risk flagged, no verdict issued", summaryAfter: "Grade: 2 green &middot; 1 amber &middot; 0 red. escalated to human within 24h" }; var phase = 1; var tabsEl = document.getElementById('tabs'); var bodyEl = document.getElementById('body'); var promptEl = document.getElementById('promptTxt'); function renderTabs(){ tabsEl.innerHTML = ''; TABS.forEach(function(label, i){ var b = document.createElement('button'); b.type = 'button'; b.className = 'tab' + (i === phase ? ' on' : ''); b.innerHTML = '<span class="num">' + (i+1) + '</span><span>' + label + '</span>'; b.addEventListener('click', function(){ phase = i; render(); }); tabsEl.appendChild(b); }); } function renderBody(){ var c = CONTENT[phase]; var eyebrowClass = (phase===2) ? 'eyebrow g' : 'eyebrow'; var out = '<div class="' + eyebrowClass + '">' + c.eyebrow + '</div><div class="headline">' + c.headline + '</div><p class="lede">' + c.lede + '</p>'; if (phase === 0) { out += '<div class="rows">' + BODIES.setup + '</div>'; } else if (phase === 1) { out += BODIES.build; out += '<div class="csummary"><div class="t"><b>' + BODIES.summaryBefore + '</b></div></div>'; } else if (phase === 2) { out += BODIES.fix; out += '<div class="csummary"><div class="t"><b>' + BODIES.summaryAfter + '</b></div></div>'; } else { out += BODIES.reportFlags; out += '<div class="lp"><span class="ic">&#128196;</span><div class="rt"><div class="n">' + BODIES.lpTitle + '</div><div class="s">' + BODIES.lpSub + '</div></div><span class="open">Open &rarr;</span></div>'; } bodyEl.innerHTML = out; promptEl.textContent = c.prompt; } function render(){ renderTabs(); renderBody(); } render(); })(); </script> </body> </html>

In short: Safeguarding is the one place an AI must never decide. In Sopact Sense the scan reads each case note for harm, crisis, and disclosure, quotes the exact line, rates urgency, and hard-sets a recommendation for human review — it surfaces risk and then stops, every time.

1 · Set up over your data

Point the Assistant at a clean caseload with persistent contact IDs so a flagged note stays tied to the right person and their history. Load your Decision Brief first — the decision, the audience, the risk indicators that matter, and your evidence standard — so the scan looks for the right signals and routes them the right way.

2 · Write the prompt

Scan the case note for risk indicators ([INDICATORS]: harm, crisis, disclosure). Quote, rate urgency, set recommend_human_review=true. No verdict. Grade green/amber/red.

The prompt carries five elements. The dataset is the loaded caseload. Scan for risk looks for harm, crisis, and disclosure indicators. Quote plus urgency pulls the exact line and rates how pressing it is. Recommend human review sets the flag so a person always decides. Grade G/A/R classifies each note so the riskiest rise to the top.

3 · What Sense produces

Run on the Caseload dataset (DEMO 08) already loaded in Sopact Sense.

GRADE: green | 1 | Flagged + review; amber | 1 | Disclosure; red | 1 | Children present

Sense returns a graded note with the quoted evidence. A note that correctly flags risk and recommends review comes back green. A disclosure that was quoted but never given an urgency level comes back amber — the signal is there but the routing is incomplete. A note mentioning children with no human review routed comes back red: the highest-risk gap.

4 · Turn a weak link green

Take the lowest-graded element above and fix it using only what the program could realistically measure. Show the before → after grade and the single indicator/edit that moves it to green.

For the children-present red, the fix is a hard rule: set recommend_human_review=true automatically whenever a minor appears in a risk note. That single edit guarantees the most sensitive cases always reach a person.

5 · Make the report and share it

Create a 'missing & incomplete' report from this analysis in Sopact branding [or paste your website URL / brand guideline to apply your own]. List every element graded amber or red, what is missing, and the one input that fixes each. Lead with the decision this report informs.
Create a shareable link for this report and open it in a new tab.

Tricks, tips, and troubleshooting

Never let the model render a verdict. The scan's job is to surface and route, not to conclude whether a child is at risk. Strip any language that sounds like a determination.

Always require a quote. A flag with no verbatim line behind it is unactionable and erodes trust. No quote, no flag.

Treat urgency as mandatory, not optional. Every quoted indicator needs an urgency rating, or amber notes pile up unrouted.

Hard-set review for the highest-risk categories. Some triggers should never depend on a score.

When minors, self-harm, or a named perpetrator appear, set recommend_human_review=true by rule, not by judgement.

Frequently asked questions

How do you identify safeguarding concerns in case notes?

Scan each note for harm, crisis, and disclosure indicators, quote the exact line, rate its urgency, and set a recommendation for human review on every flag. Sopact Sense does this in one prompt and never renders a verdict — a person always decides.

Should AI make the safeguarding decision?

No. The AI flags risk, quotes evidence, and recommends human review — then stops. The decision belongs to a trained person. The prompt explicitly forbids a verdict for exactly this reason.

What makes a safeguarding note grade red?

A note grades red when the risk is highest and the routing is missing — for example, children present with no human review recommended. The fix is a hard rule that forces review whenever minors appear.

Ready to try it for yourself?

Open Sopact Sense, paste your program description, and put it to work.

Try in Sopact